File tree Expand file tree Collapse file tree 2 files changed +33
-3
lines changed
packages/react-router-express Expand file tree Collapse file tree 2 files changed +33
-3
lines changed Original file line number Diff line number Diff line change @@ -217,4 +217,28 @@ describe("express createRemixRequest", () => {
217
217
) ;
218
218
expect ( remixRequest . headers . get ( "host" ) ) . toBe ( "localhost:3000" ) ;
219
219
} ) ;
220
+
221
+ it ( "validates parsed port" , async ( ) => {
222
+ let expressRequest = createRequest ( {
223
+ url : "/foo/bar" ,
224
+ method : "GET" ,
225
+ protocol : "http" ,
226
+ hostname : "localhost" ,
227
+ headers : {
228
+ "Cache-Control" : "max-age=300, s-maxage=3600" ,
229
+ Host : "localhost:3000" ,
230
+ "x-forwarded-host" : ":/spoofed"
231
+ } ,
232
+ } ) ;
233
+ let expressResponse = createResponse ( ) ;
234
+
235
+ let remixRequest = createRemixRequest ( expressRequest , expressResponse ) ;
236
+
237
+ expect ( remixRequest . method ) . toBe ( "GET" ) ;
238
+ expect ( remixRequest . headers . get ( "cache-control" ) ) . toBe (
239
+ "max-age=300, s-maxage=3600"
240
+ ) ;
241
+ expect ( remixRequest . headers . get ( "host" ) ) . toBe ( "localhost:3000" ) ;
242
+ expect ( remixRequest . url ) . toBe ( "http://localhost:3000/foo/bar" ) ;
243
+ } ) ;
220
244
} ) ;
Original file line number Diff line number Diff line change @@ -98,9 +98,15 @@ export function createRemixRequest(
98
98
) : Request {
99
99
// req.hostname doesn't include port information so grab that from
100
100
// `X-Forwarded-Host` or `Host`
101
- let [ , hostnamePort ] = req . get ( "X-Forwarded-Host" ) ?. split ( ":" ) ?? [ ] ;
102
- let [ , hostPort ] = req . get ( "host" ) ?. split ( ":" ) ?? [ ] ;
103
- let port = hostnamePort || hostPort ;
101
+ let [ , hostnamePortStr ] = req . get ( "X-Forwarded-Host" ) ?. split ( ":" ) ?? [ ] ;
102
+ let [ , hostPortStr ] = req . get ( "host" ) ?. split ( ":" ) ?? [ ] ;
103
+ let hostnamePort = Number . parseInt ( hostnamePortStr , 10 ) ;
104
+ let hostPort = Number . parseInt ( hostPortStr , 10 ) ;
105
+ let port = Number . isSafeInteger ( hostnamePort )
106
+ ? hostnamePort
107
+ : Number . isSafeInteger ( hostPort )
108
+ ? hostPort
109
+ : "" ;
104
110
// Use req.hostname here as it respects the "trust proxy" setting
105
111
let resolvedHost = `${ req . hostname } ${ port ? `:${ port } ` : "" } ` ;
106
112
// Use `req.originalUrl` so Remix is aware of the full path
You can’t perform that action at this time.
0 commit comments