diff options
Diffstat (limited to 'src/http/Response.zig')
| -rw-r--r-- | src/http/Response.zig | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/src/http/Response.zig b/src/http/Response.zig index 5745899..2105e16 100644 --- a/src/http/Response.zig +++ b/src/http/Response.zig @@ -27,11 +27,24 @@ pub const Message = union(enum) { status: std.http.Status, message: Message, +headers: []const std.http.Header = &.{}, pub fn with(status: std.http.Status, message: Message) @This() { return .{ .status = status, .message = message }; } +pub fn withHeaders( + status: std.http.Status, + message: Message, + headers: []const std.http.Header, +) @This() { + return .{ + .status = status, + .message = message, + .headers = headers, + }; +} + pub fn ok(message: Message) @This() { return with(.ok, message); } @@ -44,17 +57,40 @@ pub fn badRequest(message: Message) @This() { return with(.bad_request, message); } +pub const SendOptions = struct { + headers: []const std.http.Header, +}; + pub fn send( self: *const @This(), io: std.Io, + arena: std.mem.Allocator, request: *std.http.Server.Request, + options: SendOptions, ) !void { + const headers = hdrs: { + if (options.headers.len == 0) { + break :hdrs self.headers; + } + + const h = try arena.alloc(std.http.Header, options.headers.len + self.headers.len); + @memcpy(h[0..options.headers.len], options.headers); + @memcpy(h[options.headers.len..], self.headers); + break :hdrs h; + }; + switch (self.message) { .void => { - try request.respond("", .{ .status = self.status }); + try request.respond("", .{ + .status = self.status, + .extra_headers = headers, + }); }, .static => |content| { - try request.respond(content, .{ .status = self.status }); + try request.respond(content, .{ + .status = self.status, + .extra_headers = headers, + }); }, .streaming => |file| { var write_buffer: [1024]u8 = undefined; @@ -63,6 +99,7 @@ pub fn send( var body_writer = try request.respondStreaming(&write_buffer, .{ .respond_options = .{ .status = self.status, + .extra_headers = headers, .transfer_encoding = .chunked, }, }); |