Advertisement
Guest User

Untitled

a guest
Jun 12th, 2020
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.71 KB | None | 0 0
  1. const std = @import("std");
  2. const net = std.net;
  3.  
  4. const c = @cImport({
  5. @cInclude("picohttpparser.h");
  6. });
  7.  
  8. pub fn main() anyerror!void {
  9. var unix_address = try net.Address.initUnix("/tmp/kajaq.gl");
  10.  
  11. var stream_server = net.StreamServer.init(net.StreamServer.Options{});
  12. defer stream_server.deinit();
  13.  
  14. try stream_server.listen(unix_address);
  15.  
  16. while (true) {
  17. var client = try stream_server.accept();
  18.  
  19. var buf = [_]u8{0} ** 4096;
  20. var method: [*c]const u8 = undefined;
  21. var path: [*c]usize = undefined;
  22. var pret: c_int = undefined;
  23. var minor_version: [*c]c_int = undefined;
  24. var headers: [100]c.phr_header = undefined;
  25. var buflen: usize = 0;
  26. var prevbuflen: usize = 0;
  27. var method_len: usize = undefined;
  28. var path_len: [*c]usize = undefined;
  29. var num_headers: usize = 0;
  30. const rret = 0;
  31.  
  32. while (client.file.read(buf[(buflen)..])) |read| {
  33. prevbuflen = buflen;
  34. buflen += read;
  35.  
  36. num_headers = @sizeOf([100]c.phr_header) / @sizeOf(c.phr_header);
  37. pret = c.phr_parse_request(&buf, buflen, &method, &method_len, @ptrCast([*c][*c]const u8, &path), path_len, minor_version, &headers, &num_headers, prevbuflen);
  38.  
  39. if (pret > 0) {
  40. break;
  41. } else if (pret == -1) {
  42. return error.ParseError;
  43. }
  44.  
  45. std.debug.assert(pret == -2);
  46. if (buflen == buf.len) {
  47. return error.RequestIsTooLongError;
  48. }
  49. } else |err| {
  50. return err;
  51. }
  52.  
  53. std.debug.warn("request is {} bytes long", .{pret});
  54. }
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement