Skip to content

Commit d125410

Browse files
committed
Preserve case in WS rawHeader rule events
1 parent 92b32e8 commit d125410

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

src/rules/websockets/websocket-handlers.ts

+14-1
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,19 @@ export class PassThroughWebSocketHandler extends PassThroughWebSocketHandlerDefi
394394

395395
if (options.emitEventCallback) {
396396
const upstreamReq = (upstreamWebSocket as any as { _req: http.ClientRequest })._req;
397+
// This is slower than req.getHeaders(), but gives us (roughly) the correct casing
398+
// of the headers as sent. Still not perfect (loses dupe ordering) but at least it
399+
// generally matches what's actually sent on the wire.
400+
const rawHeaders = upstreamReq.getRawHeaderNames().map((headerName) => {
401+
const value = upstreamReq.getHeader(headerName);
402+
if (!value) return [];
403+
if (Array.isArray(value)) {
404+
return value.map(v => [headerName, v]);
405+
} else {
406+
return [[headerName, value.toString()]];
407+
}
408+
}).flat() as RawHeaders;
409+
397410
options.emitEventCallback('passthrough-websocket-connect', {
398411
method: upstreamReq.method,
399412
protocol: upstreamReq.protocol
@@ -402,7 +415,7 @@ export class PassThroughWebSocketHandler extends PassThroughWebSocketHandlerDefi
402415
hostname: upstreamReq.host,
403416
port: effectivePort.toString(),
404417
path: upstreamReq.path,
405-
rawHeaders: objectHeadersToRaw(upstreamReq.getHeaders() as Headers),
418+
rawHeaders: rawHeaders,
406419
subprotocols: filteredSubprotocols
407420
});
408421
}

test/integration/subscriptions/rule-events.spec.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -351,11 +351,11 @@ describe("Rule event subscriptions", () => {
351351
});
352352

353353
// This reports the *modified* header, not the original:
354-
expect(connectEvent.rawHeaders).to.deep.include(['host', `localhost:${remoteServer.port}`]);
355-
expect(connectEvent.rawHeaders).to.deep.include(['sec-websocket-version', '13']);
356-
expect(connectEvent.rawHeaders).to.deep.include(['sec-websocket-extensions', 'permessage-deflate; client_max_window_bits']);
357-
expect(connectEvent.rawHeaders).to.deep.include(['connection', 'Upgrade']);
358-
expect(connectEvent.rawHeaders).to.deep.include(['upgrade', 'websocket']);
354+
expect(connectEvent.rawHeaders).to.deep.include(['Host', `localhost:${remoteServer.port}`]);
355+
expect(connectEvent.rawHeaders).to.deep.include(['Sec-WebSocket-Version', '13']);
356+
expect(connectEvent.rawHeaders).to.deep.include(['Sec-WebSocket-Extensions', 'permessage-deflate; client_max_window_bits']);
357+
expect(connectEvent.rawHeaders).to.deep.include(['Connection', 'Upgrade']);
358+
expect(connectEvent.rawHeaders).to.deep.include(['Upgrade', 'websocket']);
359359

360360
// Make sure we want to see the upstream WS key, not the downstream one
361361
const upstreamWsKey = (connectEvent.rawHeaders as RawHeaders)

0 commit comments

Comments
 (0)