Skip to content

Commit db1b255

Browse files
authored
Strip HTTP/2 pseudo headers from dev server requests (#12830)
When HTTPS is enabled, the dev server switches to HTTP/2. This creates H2 psuedo-headers in the request that are currently incompatible with unidici's parsing. This strips out those headers, with special handling for :authority (see RFC 9113: https://www.rfc-editor.org/rfc/rfc9113.html#section-8.3.1-2.3.5).
1 parent 22cd401 commit db1b255

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

Diff for: .changeset/sharp-sloths-swim.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@react-router/dev": patch
3+
---
4+
5+
Fix dev server when using HTTPS by stripping HTTP/2 pseudo headers from dev server requests

Diff for: packages/react-router-dev/vite/node-adapter.ts

+16-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { IncomingHttpHeaders, ServerResponse } from "node:http";
1+
import type { IncomingMessage, ServerResponse } from "node:http";
22
import { once } from "node:events";
33
import { Readable } from "node:stream";
44
import { splitCookiesString } from "set-cookie-parser";
@@ -12,7 +12,20 @@ export type NodeRequestHandler = (
1212
res: ServerResponse
1313
) => Promise<void>;
1414

15-
function fromNodeHeaders(nodeHeaders: IncomingHttpHeaders): Headers {
15+
function fromNodeHeaders(nodeReq: IncomingMessage): Headers {
16+
let nodeHeaders = nodeReq.headers;
17+
18+
if (nodeReq.httpVersionMajor >= 2) {
19+
nodeHeaders = { ...nodeHeaders };
20+
if (nodeHeaders[":authority"]) {
21+
nodeHeaders.host = nodeHeaders[":authority"] as string;
22+
}
23+
delete nodeHeaders[":authority"];
24+
delete nodeHeaders[":method"];
25+
delete nodeHeaders[":path"];
26+
delete nodeHeaders[":scheme"];
27+
}
28+
1629
let headers = new Headers();
1730

1831
for (let [key, values] of Object.entries(nodeHeaders)) {
@@ -50,7 +63,7 @@ export function fromNodeRequest(
5063
let controller: AbortController | null = new AbortController();
5164
let init: RequestInit = {
5265
method: nodeReq.method,
53-
headers: fromNodeHeaders(nodeReq.headers),
66+
headers: fromNodeHeaders(nodeReq),
5467
signal: controller.signal,
5568
};
5669

0 commit comments

Comments
 (0)