web: expand example executable
This commit is contained in:
@@ -4,10 +4,11 @@ const web = @import("web");
|
||||
const linux = std.os.linux;
|
||||
const errno = linux.E.init;
|
||||
const ssl = web.openssl;
|
||||
const UUID = web.UUID;
|
||||
|
||||
var running: std.atomic.Value(bool) = .init(true);
|
||||
|
||||
const body_write_buffer_huge_pages = 1;
|
||||
|
||||
fn interruptionHandler(sig: linux.SIG) callconv(.c) void {
|
||||
var buf: [32]u8 = undefined;
|
||||
|
||||
@@ -27,6 +28,28 @@ fn interruptionHandler(sig: linux.SIG) callconv(.c) void {
|
||||
}
|
||||
|
||||
const Handler = struct {
|
||||
fn notFound(response: *web.Response) !void {
|
||||
try response.body_writer.writeAll("Not Found\n");
|
||||
|
||||
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");
|
||||
|
||||
response.sendHeadersAndBody();
|
||||
}
|
||||
|
||||
fn methodNotAllowed(response: *web.Response) !void {
|
||||
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();
|
||||
}
|
||||
|
||||
fn handle(_: *anyopaque, request: *web.Request, response: *web.Response) !void {
|
||||
std.log.info("{f} | {s} {s}", .{
|
||||
response.connection.address,
|
||||
@@ -34,38 +57,50 @@ const Handler = struct {
|
||||
request.pathname,
|
||||
});
|
||||
|
||||
if (!std.mem.eql(u8, request.pathname, "/")) {
|
||||
try response.body_writer.writeAll("Not Found\n");
|
||||
if (std.mem.eql(u8, request.pathname, "/")) {
|
||||
if (request.method != .GET) {
|
||||
try methodNotAllowed(response);
|
||||
return;
|
||||
}
|
||||
|
||||
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.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.print("Content-Length: {d}\r\n", .{response.body_writer.end});
|
||||
try response.header_writer.writeAll("\r\n");
|
||||
|
||||
response.sendHeadersAndBody();
|
||||
return;
|
||||
}
|
||||
} else if (std.mem.startsWith(u8, request.pathname, "/zeroes/")) {
|
||||
const bytes = std.fmt.parseUnsigned(usize, request.pathname[8..], 10) catch {
|
||||
try notFound(response);
|
||||
return;
|
||||
};
|
||||
|
||||
if (request.method != .GET) {
|
||||
try response.body_writer.writeAll("Method Not Allowed\n");
|
||||
if (bytes > body_write_buffer_huge_pages * 2 * 1024 * 1024) {
|
||||
try notFound(response);
|
||||
return;
|
||||
}
|
||||
|
||||
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");
|
||||
if (request.method != .GET) {
|
||||
try methodNotAllowed(response);
|
||||
return;
|
||||
}
|
||||
|
||||
const buffer = [_]u8{0};
|
||||
var data = [_][]const u8{&buffer};
|
||||
|
||||
try response.body_writer.writeSplatAll(&data, bytes);
|
||||
|
||||
try response.header_writer.writeAll(web.http.status.ok);
|
||||
try response.header_writer.writeAll("Content-Type: application/octet-stream\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;
|
||||
} else {
|
||||
try notFound(response);
|
||||
}
|
||||
|
||||
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.print("Content-Length: {d}\r\n", .{response.body_writer.end});
|
||||
try response.header_writer.writeAll("\r\n");
|
||||
|
||||
response.sendHeadersAndBody();
|
||||
}
|
||||
|
||||
fn interface() web.RequestHandler {
|
||||
@@ -102,6 +137,7 @@ pub fn main(init: std.process.Init) !void {
|
||||
|
||||
var server = try web.Server.init(allocator, init.io, .{
|
||||
.request_handler = Handler.interface(),
|
||||
.body_write_buffer_huge_pages = body_write_buffer_huge_pages,
|
||||
.ssl_ctx = ssl_ctx,
|
||||
});
|
||||
defer server.deinit(allocator);
|
||||
|
||||
Reference in New Issue
Block a user