diff --git a/build.zig.zon b/build.zig.zon index 208fc56..9f94bb4 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -7,8 +7,8 @@ .hash = "12208a01a7c10d0583f253787cf7271587d9509862f34e2b6d754cade7bc08500ef6", }, .zmpl = .{ - .url = "https://github.com/jetzig-framework/zmpl/archive/97bc2ab63bc6938baeba2b5b615138e77e2fadcd.tar.gz", - .hash = "122007b478f550b24db9a20c807695d24ac4645ab8934ce59edffb82eabcb2cc27d0", + .url = "https://github.com/jetzig-framework/zmpl/archive/a128d0a9c9cd70ca9f007405ae3d17e3a074ab34.tar.gz", + .hash = "1220e1e95a5479b24e1c5448c5dc4ad283a01050617d0e5d9ff1c7e7283c639df24a", }, .jetkv = .{ .url = "https://github.com/jetzig-framework/jetkv/archive/2b1130a48979ea2871c8cf6ca89c38b1e7062839.tar.gz", diff --git a/src/jetzig/http/Session.zig b/src/jetzig/http/Session.zig index 6f27228..a282c8c 100644 --- a/src/jetzig/http/Session.zig +++ b/src/jetzig/http/Session.zig @@ -76,6 +76,18 @@ pub fn put(self: *Self, key: []const u8, value: *jetzig.data.Value) !void { try self.save(); } +// removes true if a value was removed +// and false otherwise +pub fn remove(self: *Self, key: []const u8) !bool { + if (self.state != .parsed) return error.UnparsedSessionCookie; + + // copied from `get()` + return switch (self.data.value.?.*) { + .object => self.data.value.?.object.remove(key), + else => unreachable, + }; +} + fn save(self: *Self) !void { if (self.state != .parsed) return error.UnparsedSessionCookie; @@ -166,6 +178,28 @@ test "put and get session key/value" { try std.testing.expectEqualStrings(try value.toString(), "bar"); } +test "remove session key/value" { + const allocator = std.testing.allocator; + var cookies = jetzig.http.Cookies.init(allocator, ""); + defer cookies.deinit(); + try cookies.parse(); + + const secret: [Cipher.key_length]u8 = [_]u8{0x69} ** Cipher.key_length; + var session = Self.init(allocator, &cookies, &secret); + defer session.deinit(); + + var data = jetzig.data.Data.init(allocator); + defer data.deinit(); + + try session.parse(); + try session.put("foo", data.string("bar")); + var value = (try session.get("foo")).?; + try std.testing.expectEqualStrings(try value.toString(), "bar"); + + try std.testing.expectEqual(true, try session.remove("foo")); + try std.testing.expectEqual(null, try session.get("foo")); +} + test "get value from parsed/decrypted cookie" { const allocator = std.testing.allocator; var cookies = jetzig.http.Cookies.init(