feat(@angular/ssr): support the standard Forwarded header#33406
feat(@angular/ssr): support the standard Forwarded header#33406alan-agius4 wants to merge 1 commit into
Conversation
ff18569 to
fdb4c43
Compare
There was a problem hiding this comment.
Code Review
This pull request adds support for parsing and validating the standard RFC 7239 Forwarded header in Angular SSR, prioritizing it over standard and x-forwarded-* headers when trusted. The review feedback highlights a critical issue in parseForwardedHeader where splitting the header value by semicolons blindly fails if a quoted parameter value contains a semicolon. The reviewer suggests using a robust regular expression to parse the parameters correctly and adding a corresponding test case to cover this scenario.
This commit adds support for the standard RFC 7239 `Forwarded` header in the Angular SSR request parsing and validation layers. Previously, only non-standard `x-forwarded-*` headers were supported for resolving proxy-forwarded protocols, hosts, and ports. With this change: - A new `parseForwardedHeader` utility is added to parse standard `Forwarded` header parameters (such as `host` and `proto`), correctly handling quoted values and escaped characters. - In `createRequestUrl`, if the `Forwarded` header is trusted (via `trustProxyHeaders` configuration), its `host` and `proto` parameters are extracted and take precedence over corresponding `x-forwarded-host` and `x-forwarded-proto` headers. - Request validation is updated to verify the validity of `Forwarded` host and proto parameters. - Request sanitization is updated to scrub or retain the `Forwarded` header based on the configured trusted proxy headers. Reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Forwarded
fdb4c43 to
9b93c32
Compare
|
|
||
| const firstElement = headerValue.split(',', 1)[0]; | ||
| const params: Record<string, string> = {}; | ||
| const paramRegex = /([^\s;=]+)\s*=\s*("(?:[^"\\]|\\.)*"|[^;\s]*)/gi; |
There was a problem hiding this comment.
Question: How exactly did we come up with this regex and how confident are we that this is the right way of parsing? Would it be safer to more directly implement the parsing behavior defined by the spec itself: https://datatracker.ietf.org/doc/html/rfc7239#section-4
This commit adds support for the standard RFC 7239
Forwardedheader in the Angular SSR request parsing and validation layers.Previously, only non-standard
x-forwarded-*headers were supported for resolving proxy-forwarded protocols, hosts, and ports. With this change:parseForwardedHeaderutility is added to parse standardForwardedheader parameters (such ashostandproto), correctly handling quoted values and escaped characters.createRequestUrl, if theForwardedheader is trusted (viatrustProxyHeadersconfiguration), itshostandprotoparameters are extracted and take precedence over correspondingx-forwarded-hostandx-forwarded-protoheaders.Forwardedhost and proto parameters.Forwardedheader based on the configured trusted proxy headers.Reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Forwarded