88
99import type { IncomingHttpHeaders , IncomingMessage } from 'node:http' ;
1010import type { Http2ServerRequest } from 'node:http2' ;
11- import { getFirstHeaderValue } from '../../src/utils/validation' ;
11+ import {
12+ getFirstHeaderValue ,
13+ isProxyHeaderAllowed ,
14+ normalizeTrustProxyHeaders ,
15+ } from '../../src/utils/validation' ;
1216
1317/**
1418 * A set containing all the pseudo-headers defined in the HTTP/2 specification.
@@ -33,33 +37,27 @@ const HTTP2_PSEUDO_HEADERS: ReadonlySet<string> = new Set([
3337 * be used by web platform APIs.
3438 *
3539 * @param nodeRequest - The Node.js request object (`IncomingMessage` or `Http2ServerRequest`) to convert.
36- * @param trustProxyHeaders - A boolean or an array of allowed proxy headers.
40+ * @param trustProxyHeaders - A boolean or an array of proxy headers to trust when constructing the request URL .
3741 *
3842 * @remarks
3943 * When `trustProxyHeaders` is enabled, headers such as `X-Forwarded-Host` and
4044 * `X-Forwarded-Prefix` should ideally be strictly validated at a higher infrastructure
4145 * level (e.g., at the reverse proxy or API gateway) before reaching the application.
4246 *
4347 * @returns A Web Standard `Request` object.
44- *
45- * @private
4648 */
4749export function createWebRequestFromNodeRequest (
4850 nodeRequest : IncomingMessage | Http2ServerRequest ,
4951 trustProxyHeaders ?: boolean | readonly string [ ] ,
5052) : Request {
51- const trustProxyHeadersNormalized =
52- trustProxyHeaders && typeof trustProxyHeaders !== 'boolean'
53- ? new Set ( trustProxyHeaders . map ( ( h ) => h . toLowerCase ( ) ) )
54- : trustProxyHeaders ;
55-
53+ const trustProxyHeadersNormalized = normalizeTrustProxyHeaders ( trustProxyHeaders ) ;
5654 const { headers, method = 'GET' } = nodeRequest ;
5755 const withBody = method !== 'GET' && method !== 'HEAD' ;
5856 const referrer = headers . referer && URL . canParse ( headers . referer ) ? headers . referer : undefined ;
5957
6058 return new Request ( createRequestUrl ( nodeRequest , trustProxyHeadersNormalized ) , {
6159 method,
62- headers : createRequestHeaders ( headers , trustProxyHeadersNormalized ) ,
60+ headers : createRequestHeaders ( headers ) ,
6361 body : withBody ? nodeRequest : undefined ,
6462 duplex : withBody ? 'half' : undefined ,
6563 referrer,
@@ -70,27 +68,16 @@ export function createWebRequestFromNodeRequest(
7068 * Creates a `Headers` object from Node.js `IncomingHttpHeaders`.
7169 *
7270 * @param nodeHeaders - The Node.js `IncomingHttpHeaders` object to convert.
73- * @param trustProxyHeaders - A boolean or a set of allowed proxy headers.
7471 * @returns A `Headers` object containing the converted headers.
7572 */
76- function createRequestHeaders (
77- nodeHeaders : IncomingHttpHeaders ,
78- trustProxyHeaders : boolean | ReadonlySet < string > | undefined ,
79- ) : Headers {
73+ function createRequestHeaders ( nodeHeaders : IncomingHttpHeaders ) : Headers {
8074 const headers = new Headers ( ) ;
8175
8276 for ( const [ name , value ] of Object . entries ( nodeHeaders ) ) {
8377 if ( HTTP2_PSEUDO_HEADERS . has ( name ) ) {
8478 continue ;
8579 }
8680
87- if (
88- name . toLowerCase ( ) . startsWith ( 'x-forwarded-' ) &&
89- ! isProxyHeaderAllowed ( name , trustProxyHeaders )
90- ) {
91- continue ;
92- }
93-
9481 if ( typeof value === 'string' ) {
9582 headers . append ( name , value ) ;
9683 } else if ( Array . isArray ( value ) ) {
@@ -107,7 +94,7 @@ function createRequestHeaders(
10794 * Creates a `URL` object from a Node.js `IncomingMessage`, taking into account the protocol, host, and port.
10895 *
10996 * @param nodeRequest - The Node.js `IncomingMessage` or `Http2ServerRequest` object to extract URL information from.
110- * @param trustProxyHeaders - A boolean or a set of allowed proxy headers.
97+ * @param trustProxyHeaders - A set of allowed proxy headers.
11198 *
11299 * @remarks
113100 * When `trustProxyHeaders` is enabled, headers such as `X-Forwarded-Host` and
@@ -118,7 +105,7 @@ function createRequestHeaders(
118105 */
119106export function createRequestUrl (
120107 nodeRequest : IncomingMessage | Http2ServerRequest ,
121- trustProxyHeaders ?: boolean | ReadonlySet < string > ,
108+ trustProxyHeaders : ReadonlySet < string > ,
122109) : URL {
123110 const {
124111 headers,
@@ -156,37 +143,15 @@ export function createRequestUrl(
156143 *
157144 * @param headers - The Node.js incoming HTTP headers.
158145 * @param headerName - The name of the proxy header to retrieve.
159- * @param trustProxyHeaders - A boolean or a set of allowed proxy headers.
146+ * @param trustProxyHeaders - A set of allowed proxy headers.
160147 * @returns The value of the allowed proxy header, or `undefined` if not allowed or not present.
161148 */
162149function getAllowedProxyHeaderValue (
163150 headers : IncomingHttpHeaders ,
164151 headerName : string ,
165- trustProxyHeaders : boolean | ReadonlySet < string > | undefined ,
152+ trustProxyHeaders : ReadonlySet < string > ,
166153) : string | undefined {
167154 return isProxyHeaderAllowed ( headerName , trustProxyHeaders )
168155 ? getFirstHeaderValue ( headers [ headerName ] )
169156 : undefined ;
170157}
171-
172- /**
173- * Checks if a specific proxy header is allowed.
174- *
175- * @param headerName - The name of the proxy header to check.
176- * @param trustProxyHeaders - A boolean or a set of allowed proxy headers.
177- * @returns `true` if the header is allowed, `false` otherwise.
178- */
179- function isProxyHeaderAllowed (
180- headerName : string ,
181- trustProxyHeaders : boolean | ReadonlySet < string > | undefined ,
182- ) : boolean {
183- if ( ! trustProxyHeaders ) {
184- return false ;
185- }
186-
187- if ( trustProxyHeaders === true ) {
188- return true ;
189- }
190-
191- return trustProxyHeaders . has ( headerName . toLowerCase ( ) ) ;
192- }
0 commit comments