From 57fde38ff03ca947a2be1ede959bed0a10713b70 Mon Sep 17 00:00:00 2001 From: cirospaciari Date: Fri, 18 Oct 2024 04:58:24 -0700 Subject: [PATCH] test --- src/bun.js/api/bun/h2_frame_parser.zig | 43 +++++++++++++++++++------- 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/src/bun.js/api/bun/h2_frame_parser.zig b/src/bun.js/api/bun/h2_frame_parser.zig index c24a9db274f2d..59b94056182eb 100644 --- a/src/bun.js/api/bun/h2_frame_parser.zig +++ b/src/bun.js/api/bun/h2_frame_parser.zig @@ -1758,11 +1758,13 @@ pub const H2FrameParser = struct { const globalObject = this.handlers.globalObject; const stream_id = stream.id; - const headers = JSC.JSValue.createEmptyArray(globalObject, 0); + // almost sure that we have between 5-32 headers + const headers = JSC.JSValue.createEmptyArray(globalObject, 32); headers.ensureStillAlive(); var sensitiveHeaders = JSC.JSValue.jsUndefined(); var count: usize = 0; + var i: u32 = 0; while (true) { const header = this.decode(payload[offset..]) catch break; @@ -1785,7 +1787,7 @@ pub const H2FrameParser = struct { if (this.streams.getEntry(stream_id)) |entry| return entry.value_ptr; return null; } - + const output = brk: { if (header.never_index) { if (sensitiveHeaders.isUndefined()) { @@ -1796,22 +1798,38 @@ pub const H2FrameParser = struct { } else break :brk headers; }; - if (getHTTP2CommonString(globalObject, header.well_know)) |header_info| { - output.push(globalObject, header_info); - var header_value = bun.String.fromUTF8(header.value); - output.push(globalObject, header_value.transferToJS(globalObject)); + if(i < 63) { + if (getHTTP2CommonString(globalObject, header.well_know)) |header_info| { + output.putIndex(globalObject, i, header_info); + var header_value = bun.String.fromUTF8(header.value); + output.putIndex(globalObject, i + 1,header_value.transferToJS(globalObject)); + } else { + var header_name = bun.String.fromUTF8(header.name); + output.putIndex(globalObject, i, header_name.transferToJS(globalObject)); + var header_value = bun.String.fromUTF8(header.value); + output.putIndex(globalObject, i + 1, header_value.transferToJS(globalObject)); + } } else { - var header_name = bun.String.fromUTF8(header.name); - output.push(globalObject, header_name.transferToJS(globalObject)); - var header_value = bun.String.fromUTF8(header.value); - output.push(globalObject, header_value.transferToJS(globalObject)); + if (getHTTP2CommonString(globalObject, header.well_know)) |header_info| { + output.push(globalObject, header_info); + var header_value = bun.String.fromUTF8(header.value); + output.push(globalObject, header_value.transferToJS(globalObject)); + } else { + var header_name = bun.String.fromUTF8(header.name); + output.push(globalObject, header_name.transferToJS(globalObject)); + var header_value = bun.String.fromUTF8(header.value); + output.push(globalObject, header_value.transferToJS(globalObject)); + } } + i += 2; if (offset >= payload.len) { break; } } - + if(i < 64) { + headers.put(globalObject, JSC.ZigString.static("length"), JSC.JSValue.jsNumber(count)); + } this.dispatchWith3Extra(.onStreamHeaders, stream.getIdentifier(), headers, sensitiveHeaders, JSC.JSValue.jsNumber(flags)); // callbacks can change the Stream ptr in this case we always return the new one if (this.streams.getEntry(stream_id)) |entry| return entry.value_ptr; @@ -3890,9 +3908,10 @@ pub const H2FrameParser = struct { stream.freeResources(this, finalizing); } var streams = this.streams; - // TODO: we can use a pool for this + // TODO: we can use a pool for this this.streams = bun.U32HashMap(Stream).init(bun.default_allocator); streams.deinit(); + } pub fn deinit(this: *H2FrameParser) void {