@@ -79,17 +79,17 @@ pub fn constructor(_init: ?HeadersInit, page: *Page) !Headers {
7979 return error .TypeError ;
8080 }
8181
82- const key = try page . arena .dupe (u8 , pair [0 ]);
83- const value = try page . arena .dupe (u8 , pair [1 ]);
82+ const key = try arena .dupe (u8 , pair [0 ]);
83+ const value = try arena .dupe (u8 , pair [1 ]);
8484
8585 try headers .put (arena , key , value );
8686 }
8787 },
8888 .headers = > | hdrs | {
8989 var iter = hdrs .headers .iterator ();
9090 while (iter .next ()) | entry | {
91- const key = try page . arena .dupe (u8 , entry .key_ptr .* );
92- const value = try page . arena .dupe (u8 , entry .value_ptr .* );
91+ const key = try arena .dupe (u8 , entry .key_ptr .* );
92+ const value = try arena .dupe (u8 , entry .value_ptr .* );
9393 try headers .put (arena , key , value );
9494 }
9595 },
@@ -129,10 +129,29 @@ pub fn _delete(self: *Headers, name: []const u8) void {
129129 _ = self .headers .remove (name );
130130}
131131
132- // TODO: entries iterator
133- // They should be:
134- // 1. Sorted in lexicographical order.
135- // 2. Duplicate header names should be combined.
132+ pub const HeaderEntryIterator = struct {
133+ slot : [][]const u8 ,
134+ iter : * HeaderHashMap.Iterator ,
135+
136+ // TODO: these SHOULD be in lexigraphical order but I'm not sure how actually
137+ // important that is.
138+ pub fn _next (self : * HeaderEntryIterator ) ! ? []const []const u8 {
139+ if (self .iter .next ()) | entry | {
140+ self .slot [0 ] = entry .key_ptr .* ;
141+ self .slot [1 ] = entry .value_ptr .* ;
142+ return self .slot ;
143+ } else {
144+ return null ;
145+ }
146+ }
147+ };
148+
149+ pub fn _entries (self : * const Headers , page : * Page ) ! HeaderEntryIterator {
150+ const iter = try page .arena .create (HeaderHashMap .Iterator );
151+ iter .* = self .headers .iterator ();
152+
153+ return .{ .slot = try page .arena .alloc ([]const u8 , 2 ), .iter = iter };
154+ }
136155
137156pub fn _forEach (self : * Headers , callback_fn : Env.Function , this_arg : ? Env.JsObject ) ! void {
138157 var iter = self .headers .iterator ();
@@ -163,7 +182,24 @@ pub fn _has(self: *const Headers, name: []const u8) bool {
163182 return self .headers .contains (name );
164183}
165184
166- // TODO: keys iterator
185+ pub const HeaderKeyIterator = struct {
186+ iter : * HeaderHashMap.KeyIterator ,
187+
188+ pub fn _next (self : * HeaderKeyIterator ) ! ? []const u8 {
189+ if (self .iter .next ()) | key | {
190+ return key .* ;
191+ } else {
192+ return null ;
193+ }
194+ }
195+ };
196+
197+ pub fn _keys (self : * const Headers , page : * Page ) ! HeaderKeyIterator {
198+ const iter = try page .arena .create (HeaderHashMap .KeyIterator );
199+ iter .* = self .headers .keyIterator ();
200+
201+ return .{ .iter = iter };
202+ }
167203
168204pub fn _set (self : * Headers , name : []const u8 , value : []const u8 , page : * Page ) ! void {
169205 const arena = page .arena ;
@@ -172,7 +208,23 @@ pub fn _set(self: *Headers, name: []const u8, value: []const u8, page: *Page) !v
172208 gop .value_ptr .* = try arena .dupe (u8 , value );
173209}
174210
175- // TODO: values iterator
211+ pub const HeaderValueIterator = struct {
212+ iter : * HeaderHashMap.ValueIterator ,
213+
214+ pub fn _next (self : * HeaderValueIterator ) ! ? []const u8 {
215+ if (self .iter .next ()) | value | {
216+ return value .* ;
217+ } else {
218+ return null ;
219+ }
220+ }
221+ };
222+
223+ pub fn _values (self : * const Headers , page : * Page ) ! HeaderValueIterator {
224+ const iter = try page .arena .create (HeaderHashMap .ValueIterator );
225+ iter .* = self .headers .valueIterator ();
226+ return .{ .iter = iter };
227+ }
176228
177229const testing = @import ("../../testing.zig" );
178230test "fetch: headers" {
0 commit comments