main.zig 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. const std = @import("std");
  2. const net = std.net;
  3. const posix = std.posix;
  4. const fmt = std.fmt;
  5. const socket = @import("socket.zig");
  6. const command = @import("command.zig");
  7. const storage = @import("storage.zig");
  8. pub fn main() !void {
  9. const listener = try socket.init(8080);
  10. defer posix.close(listener);
  11. std.debug.print("2025 pizzakv!\n<danilo.fragoso@dev>\n---------\n", .{});
  12. std.debug.print("Commands:\n\nread key\nwrite key|value\ndelete key\nstatus\n", .{});
  13. std.debug.print("---------\n", .{});
  14. while (true) {
  15. var client_address: net.Address = undefined;
  16. var client_address_len: posix.socklen_t = @sizeOf(net.Address);
  17. const conn = posix.accept(listener, &client_address.any, &client_address_len, 0) catch |err| {
  18. std.debug.print("error accept: {any}\n", .{err});
  19. continue;
  20. };
  21. const thread = try std.Thread.spawn(.{}, handleConnection, .{conn});
  22. thread.detach();
  23. }
  24. }
  25. pub fn handleConnection(conn: posix.socket_t) !void {
  26. defer posix.close(conn);
  27. var requestBuffer: [1024 * 1024]u8 = undefined;
  28. var responseBuffer: [1024 * 1024]u8 = undefined;
  29. while (true) {
  30. const n = try socket.readUntilNewLine(conn, &requestBuffer);
  31. if (n == 0) {
  32. break;
  33. }
  34. const cmdResponse = command.parse(requestBuffer[0..n]) orelse {
  35. std.debug.print("Failed to parse message\n", .{});
  36. socket.write(conn, "false\n") catch |err| {
  37. std.debug.print("error writing: {any}\n", .{err});
  38. };
  39. continue;
  40. };
  41. @memcpy(responseBuffer[0..cmdResponse.len], cmdResponse);
  42. responseBuffer[cmdResponse.len] = '\n';
  43. socket.write(conn, responseBuffer[0 .. cmdResponse.len + 1]) catch |err| {
  44. std.debug.print("error writing: {any}\n", .{err});
  45. };
  46. }
  47. }