Support cookies

This commit is contained in:
jaina heartles 2022-11-17 19:39:24 -08:00
parent 6accb775d4
commit dac9d7c05d
2 changed files with 37 additions and 2 deletions

View file

@ -89,8 +89,8 @@ pub const Fields = struct {
} }
}; };
pub fn getList(self: Fields, key: []const u8) ?ListIterator { pub fn getList(self: Fields, key: []const u8) ListIterator {
return if (self.unmanaged.get(key)) |hdr| ListIterator{ .remaining = hdr } else null; return if (self.unmanaged.get(key)) |hdr| ListIterator{ .remaining = hdr } else ListIterator{ .remaining = "" };
} }
pub fn put(self: *Fields, key: []const u8, val: []const u8) !void { pub fn put(self: *Fields, key: []const u8, val: []const u8) !void {
@ -121,4 +121,32 @@ pub const Fields = struct {
pub fn count(self: Fields) usize { pub fn count(self: Fields) usize {
return self.unmanaged.count(); return self.unmanaged.count();
} }
pub const CookieOptions = struct {
Secure: bool = false,
HttpOnly: bool = false,
SameSite: ?enum {
Strict,
Lax,
None,
} = null,
};
pub fn setCookie(self: *Fields, name: []const u8, value: []const u8, opt: CookieOptions) !void {
const cookie = try std.fmt.printAlloc(
self.allocator,
"{s}={s}{s}{s}{s}",
.{
name,
value,
if (opt.Secure) "; Secure" else "",
if (opt.HttpOnly) "; HttpOnly" else "",
if (opt.SameSite) |same_site| "; SameSite=" ++ @tagName(same_site) else "",
},
);
defer self.allocator.free(cookie);
// TODO: reduce unnecessary allocations
self.append("Set-Cookie", cookie);
}
}; };

View file

@ -43,8 +43,15 @@ fn writeFields(writer: anytype, headers: *const Fields) !void {
if (ch == '\r' or ch == '\n') @panic("newlines not yet supported in headers"); if (ch == '\r' or ch == '\n') @panic("newlines not yet supported in headers");
} }
if (std.ascii.eqlIgnoreCase("Set-Cookie", header.key_ptr.*)) continue;
try writer.print("{s}: {s}\r\n", .{ header.key_ptr.*, header.value_ptr.* }); try writer.print("{s}: {s}\r\n", .{ header.key_ptr.*, header.value_ptr.* });
} }
var cookie_iter = headers.getList("Set-Cookie");
while (cookie_iter.next()) |cookie| {
try writer.print("Set-Cookie: {s}\r\n", .{cookie});
}
} }
fn writeChunk(writer: anytype, contents: []const u8) @TypeOf(writer).Error!void { fn writeChunk(writer: anytype, contents: []const u8) @TypeOf(writer).Error!void {