diff --git a/examples/accept/accept.zig b/examples/accept/accept.zig index 4fe6d26..477e973 100644 --- a/examples/accept/accept.zig +++ b/examples/accept/accept.zig @@ -6,11 +6,15 @@ var gpa = std.heap.GeneralPurposeAllocator(.{ }){}; fn on_request_verbose(r: zap.Request) void { - const allocator = gpa.allocator(); + // use a local buffer for the parsed accept headers + var accept_buffer: [1024]u8 = undefined; + var fba = std.heap.FixedBufferAllocator.init(&accept_buffer); + const accept_allocator = fba.allocator(); + const content_type: zap.ContentType = content_type: { - var accept_list = std.ArrayList(zap.Request.AcceptItem).init(allocator); + var accept_list = r.parseAcceptHeaders(accept_allocator) catch break :content_type .HTML; defer accept_list.deinit(); - r.parseAccept(&accept_list) catch break :content_type .HTML; + for (accept_list.items) |accept| { break :content_type accept.toContentType() orelse continue; } diff --git a/src/request.zig b/src/request.zig index 0f97877..c4b9338 100644 --- a/src/request.zig +++ b/src/request.zig @@ -600,8 +600,14 @@ pub const AcceptItem = struct { } }; +/// List holding access headers parsed by parseAcceptHeaders() +const AcceptHeaderList = std.ArrayList(AcceptItem); + /// Parses `Accept:` http header into `list`, ordered from highest q factor to lowest -pub fn parseAccept(self: *const Self, list: *std.ArrayList(AcceptItem)) !void { +pub fn parseAcceptHeaders(self: *const Self, allocator: std.mem.Allocator) !AcceptHeaderList { + var list = AcceptHeaderList.init(allocator); + errdefer list.deinit(); + const accept_str = self.getHeaderCommon(.accept) orelse return error.NoAccept; var tok_iter = std.mem.tokenize(u8, accept_str, ", "); @@ -638,6 +644,7 @@ pub fn parseAccept(self: *const Self, list: *std.ArrayList(AcceptItem)) !void { try list.append(new_item); } } + return list; } /// Set a response cookie