web: unnecessary refactor before compilation
This commit is contained in:
@@ -17,114 +17,49 @@ fn interruptionHandler(signal: i32) callconv(.c) void {
|
||||
}
|
||||
}
|
||||
|
||||
const Router = struct {
|
||||
allocator: std.mem.Allocator,
|
||||
|
||||
fn init(allocator: std.mem.Allocator) Router {
|
||||
return .{
|
||||
.allocator = allocator,
|
||||
};
|
||||
}
|
||||
|
||||
fn interface(self: *Router) web.RequestRouter {
|
||||
return .{
|
||||
.ptr = self,
|
||||
.vtable = &.{
|
||||
.route = onRoute,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
fn onRoute(ctx: *anyopaque, route: web.Route) !web.RequestHandler {
|
||||
const self: *Router = @ptrCast(@alignCast(ctx));
|
||||
|
||||
const handler = try self.allocator.create(Handler);
|
||||
handler.* = try .init(self.allocator, route);
|
||||
return handler.interface();
|
||||
}
|
||||
};
|
||||
|
||||
const Handler = struct {
|
||||
allocator: std.mem.Allocator,
|
||||
fn handle(_: *anyopaque, request: *web.Request, response: *web.Response) !void {
|
||||
if (!std.mem.eql(request.pathname, "/")) {
|
||||
try response.body_writer.writeAll("Not Found\n");
|
||||
|
||||
route: web.Route,
|
||||
uuid: UUID,
|
||||
timer: std.time.Timer,
|
||||
try response.header_writer.writeAll(web.http.status.not_found);
|
||||
try response.header_writer.writeAll("Content-Type: text/plain; charset=utf-8\r\n");
|
||||
try response.header_writer.print("Content-Length: {d}\r\n", .{response.body_writer.end});
|
||||
try response.header_writer.writeAll("\r\n");
|
||||
|
||||
accept: ?[]const u8 = null,
|
||||
accept_encoding: ?[]const u8 = null,
|
||||
accept_language: ?[]const u8 = null,
|
||||
user_agent: ?[]const u8 = null,
|
||||
|
||||
fn init(allocator: std.mem.Allocator, route: web.Route) !Handler {
|
||||
return .{
|
||||
.allocator = allocator,
|
||||
|
||||
.route = route,
|
||||
.uuid = UUID.v7(),
|
||||
.timer = try .start(),
|
||||
};
|
||||
}
|
||||
|
||||
fn interface(self: *Handler) web.RequestHandler {
|
||||
return .{
|
||||
.ptr = self,
|
||||
.vtable = &.{
|
||||
.header = onHeader,
|
||||
.body = onBody,
|
||||
.finalize = onFinalize,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
fn onHeader(ctx: *anyopaque, response: *web.Response, header: web.http.Header) !void {
|
||||
const self: *Handler = @ptrCast(@alignCast(ctx));
|
||||
|
||||
switch (header.name) {
|
||||
.known => |k| switch (k) {
|
||||
.Accept => {
|
||||
self.accept = header.value;
|
||||
},
|
||||
.@"Accept-Encoding" => {
|
||||
self.accept_encoding = header.value;
|
||||
},
|
||||
.@"Accept-Language" => {
|
||||
self.accept_language = header.value;
|
||||
},
|
||||
.@"User-Agent" => {
|
||||
self.user_agent = header.value;
|
||||
},
|
||||
else => {},
|
||||
},
|
||||
.other => {},
|
||||
response.sendHeadersAndBody();
|
||||
return;
|
||||
}
|
||||
|
||||
_ = response;
|
||||
if (!std.mem.eql(request.method, "GET")) {
|
||||
try response.body_writer.writeAll("Method Not Allowed\n");
|
||||
|
||||
try response.header_writer.writeAll(web.http.status.method_not_allowed);
|
||||
try response.header_writer.writeAll("Content-Type: text/plain; charset=utf-8\r\n");
|
||||
try response.header_writer.print("Content-Length: {d}\r\n", .{response.body_writer.end});
|
||||
try response.header_writer.writeAll("\r\n");
|
||||
|
||||
response.sendHeadersAndBody();
|
||||
return;
|
||||
}
|
||||
|
||||
try response.body_writer.writeAll("{\"ok\":true}\n");
|
||||
|
||||
try response.header_writer.writeAll(web.http.status.ok);
|
||||
try response.header_writer.writeAll("Content-Type: application/json\r\n");
|
||||
try response.header_writer.writeAll("Content-Length: {d}\r\n", .{response.body_writer.end});
|
||||
try response.header_writer.writeAll("\r\n");
|
||||
|
||||
response.sendHeadersAndBody();
|
||||
}
|
||||
|
||||
fn onBody(ctx: *anyopaque, response: *web.Response, body: []const u8) !void {
|
||||
const self: *Handler = @ptrCast(@alignCast(ctx));
|
||||
|
||||
try response.sendResponse(.{
|
||||
.media_type = "application/json",
|
||||
.response_body = "{\"ok\":true}\r\n",
|
||||
});
|
||||
|
||||
_ = self;
|
||||
_ = body;
|
||||
}
|
||||
|
||||
fn onFinalize(ctx: *anyopaque) void {
|
||||
const self: *Handler = @ptrCast(@alignCast(ctx));
|
||||
|
||||
const time_ns = self.timer.read();
|
||||
const time_us_ceil = (time_ns + std.time.ns_per_us - 1) / std.time.ns_per_us;
|
||||
|
||||
const rps_floor = std.time.ns_per_s / time_ns;
|
||||
|
||||
std.log.info("{s} {s} (lat = {} µs, rlat = {} rps)", .{ @tagName(self.route.method), self.route.pathname, time_us_ceil, rps_floor });
|
||||
|
||||
self.allocator.destroy(self);
|
||||
fn interface() web.RequestHandler {
|
||||
return .{
|
||||
.ptr = undefined,
|
||||
.vtable = &.{
|
||||
.handle = handle,
|
||||
},
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
@@ -135,8 +70,6 @@ pub fn main() !void {
|
||||
defer _ = gpa.deinit();
|
||||
const allocator = gpa.allocator();
|
||||
|
||||
var router: Router = .init(allocator);
|
||||
|
||||
_ = ssl.c_ssl.SSL_library_init();
|
||||
_ = ssl.c_ssl.OpenSSL_add_all_algorithms();
|
||||
_ = ssl.c_ssl.SSL_load_error_strings();
|
||||
@@ -152,7 +85,7 @@ pub fn main() !void {
|
||||
try ssl_ctx.checkPrivateKey();
|
||||
|
||||
var server = try web.Server.init(allocator, .{
|
||||
.request_router = router.interface(),
|
||||
.request_handler = Handler.interface(),
|
||||
.address = .initIp4(.{ 127, 0, 0, 1 }, 8000),
|
||||
.ssl_ctx = ssl_ctx,
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user