Simplify headers assignment, fix tests

This commit is contained in:
Bob Farrell 2024-03-02 12:11:22 +00:00
parent cc39608d46
commit ce93abcd65
2 changed files with 52 additions and 14 deletions

View File

@ -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);
}

View File

@ -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,