From ce93abcd65978de7feb109e8b99afcf755042a67 Mon Sep 17 00:00:00 2001 From: Bob Farrell Date: Sat, 2 Mar 2024 12:11:22 +0000 Subject: [PATCH] Simplify headers assignment, fix tests --- src/jetzig/http/Headers.zig | 58 ++++++++++++++++++++++++++++++++----- src/jetzig/http/Request.zig | 8 ++--- 2 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/jetzig/http/Headers.zig b/src/jetzig/http/Headers.zig index a457fb7..e3510e7 100644 --- a/src/jetzig/http/Headers.zig +++ b/src/jetzig/http/Headers.zig @@ -15,7 +15,7 @@ pub fn init(allocator: std.mem.Allocator) Self { } pub fn deinit(self: *Self) void { - self.headers.deinit(); + self.headers.deinit(self.allocator); } // Gets the first value for a given header identified by `name`. @@ -36,6 +36,18 @@ pub fn iterator(self: *Self) Iterator { return Iterator{ .headers = self.headers }; } +/// Returns an array of `std.http.Header`, can be used to set response headers directly. +/// Caller owns memory. +pub fn stdHeaders(self: *Self) !std.ArrayListUnmanaged(std.http.Header) { + var array = try std.ArrayListUnmanaged(std.http.Header).initCapacity(self.allocator, max_headers); + + var it = self.iterator(); + while (it.next()) |header| { + array.appendAssumeCapacity(.{ .name = header.name, .value = header.value }); + } + return array; +} + /// Iterates through stored headers yielidng a `Header` on each call to `next()` const Iterator = struct { headers: HeadersArray, @@ -58,14 +70,44 @@ const Iterator = struct { } }; -test { +test "append" { const allocator = std.testing.allocator; - var headers = std.http.Headers.init(allocator); + var headers = Self.init(allocator); defer headers.deinit(); try headers.append("foo", "bar"); - var jetzig_headers = Self.init(allocator, headers); - try std.testing.expectEqualStrings( - headers.getFirstValue("foo").?, - jetzig_headers.getFirstValue("foo").?, - ); + try std.testing.expectEqualStrings(headers.getFirstValue("foo").?, "bar"); +} + +test "iterator" { + const allocator = std.testing.allocator; + var headers = Self.init(allocator); + defer headers.deinit(); + + try headers.append("foo", "bar"); + + var it = headers.iterator(); + while (it.next()) |header| { + try std.testing.expectEqualStrings("foo", header.name); + try std.testing.expectEqualStrings("bar", header.value); + break; + } else { + try std.testing.expect(false); + } +} + +test "stdHeaders" { + const allocator = std.testing.allocator; + var headers = Self.init(allocator); + defer headers.deinit(); + + try headers.append("foo", "bar"); + try headers.append("baz", "qux"); + + var std_headers = try headers.stdHeaders(); + defer std_headers.deinit(allocator); + + try std.testing.expectEqualStrings("foo", std_headers.items[0].name); + try std.testing.expectEqualStrings("bar", std_headers.items[0].value); + try std.testing.expectEqualStrings("baz", std_headers.items[1].name); + try std.testing.expectEqualStrings("qux", std_headers.items[1].value); } diff --git a/src/jetzig/http/Request.zig b/src/jetzig/http/Request.zig index 69ea24a..ab50e07 100644 --- a/src/jetzig/http/Request.zig +++ b/src/jetzig/http/Request.zig @@ -137,12 +137,8 @@ pub fn respond(self: *Self) !void { try self.response.headers.append("Set-Cookie", header); } - // TODO: Move to jetzig.http.Response.stdHeaders() - var std_response_headers = std.ArrayList(std.http.Header).init(self.allocator); - var headers_it = self.response.headers.iterator(); - while (headers_it.next()) |header| try std_response_headers.append( - .{ .name = header.name, .value = header.value }, - ); + var std_response_headers = try self.response.headers.stdHeaders(); + defer std_response_headers.deinit(self.allocator); try self.std_http_request.respond( self.response.content,