aboutsummaryrefslogtreecommitdiff
path: root/src/http/Response.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/Response.zig')
-rw-r--r--src/http/Response.zig41
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,
},
});