Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const std = @import("std");
- const net = std.net;
- const c = @cImport({
- @cInclude("picohttpparser.h");
- });
- pub fn main() anyerror!void {
- var unix_address = try net.Address.initUnix("/tmp/kajaq.gl");
- var stream_server = net.StreamServer.init(net.StreamServer.Options{});
- defer stream_server.deinit();
- try stream_server.listen(unix_address);
- while (true) {
- var client = try stream_server.accept();
- var buf = [_]u8{0} ** 4096;
- var method: [*c]const u8 = undefined;
- var path: [*c]usize = undefined;
- var pret: c_int = undefined;
- var minor_version: [*c]c_int = undefined;
- var headers: [100]c.phr_header = undefined;
- var buflen: usize = 0;
- var prevbuflen: usize = 0;
- var method_len: usize = undefined;
- var path_len: [*c]usize = undefined;
- var num_headers: usize = 0;
- const rret = 0;
- while (client.file.read(buf[(buflen)..])) |read| {
- prevbuflen = buflen;
- buflen += read;
- num_headers = @sizeOf([100]c.phr_header) / @sizeOf(c.phr_header);
- pret = c.phr_parse_request(&buf, buflen, &method, &method_len, @ptrCast([*c][*c]const u8, &path), path_len, minor_version, &headers, &num_headers, prevbuflen);
- if (pret > 0) {
- break;
- } else if (pret == -1) {
- return error.ParseError;
- }
- std.debug.assert(pret == -2);
- if (buflen == buf.len) {
- return error.RequestIsTooLongError;
- }
- } else |err| {
- return err;
- }
- std.debug.warn("request is {} bytes long", .{pret});
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement