File tree Expand file tree Collapse file tree 4 files changed +60
-2
lines changed Expand file tree Collapse file tree 4 files changed +60
-2
lines changed Original file line number Diff line number Diff line change @@ -2829,7 +2829,13 @@ This can be overridden for servers and client requests by passing the
28292829<!-- YAML
28302830added: v0.3.6
28312831changes:
2832- - version: v15.3.0
2832+ - version: REPLACEME
2833+ pr-url: https://github.com/nodejs/node/pull/39310
2834+ description: When using a `URL` object parsed username and
2835+ password will now be properly URI decoded.
2836+ - version:
2837+ - v15.3.0
2838+ - v14.17.0
28332839 pr-url: https://github.com/nodejs/node/pull/36048
28342840 description: It is possible to abort a request with an AbortSignal.
28352841 - version:
Original file line number Diff line number Diff line change @@ -251,6 +251,10 @@ Global instance of [`https.Agent`][] for all HTTPS client requests.
251251<!-- YAML
252252added: v0.3.6
253253changes:
254+ - version: REPLACEME
255+ pr-url: https://github.com/nodejs/node/pull/39310
256+ description: When using a `URL` object parsed username
257+ and password will now be properly URI decoded.
254258 - version:
255259 - v14.1.0
256260 - v13.14.0
Original file line number Diff line number Diff line change @@ -1303,7 +1303,7 @@ function urlToHttpOptions(url) {
13031303 options . port = Number ( url . port ) ;
13041304 }
13051305 if ( url . username || url . password ) {
1306- options . auth = `${ url . username } :${ url . password } ` ;
1306+ options . auth = `${ decodeURIComponent ( url . username ) } :${ decodeURIComponent ( url . password ) } ` ;
13071307 }
13081308 return options ;
13091309}
Original file line number Diff line number Diff line change 1+ 'use strict' ;
2+ require ( '../common' ) ;
3+ const assert = require ( 'assert' ) ;
4+ const http = require ( 'http' ) ;
5+
6+ const testCases = [
7+ {
8+ username : 'test@test"' ,
9+ password : '123456^' ,
10+ expected : 'dGVzdEB0ZXN0IjoxMjM0NTZe'
11+ } ,
12+ {
13+ username : 'test%40test' ,
14+ password : '123456' ,
15+ expected : 'dGVzdEB0ZXN0OjEyMzQ1Ng=='
16+ } ,
17+ {
18+ username : 'not%3Agood' ,
19+ password : 'god' ,
20+ expected : 'bm90Omdvb2Q6Z29k'
21+ } ,
22+ {
23+ username : 'not%22good' ,
24+ password : 'g%5Eod' ,
25+ expected : 'bm90Imdvb2Q6Z15vZA=='
26+ } ,
27+ {
28+ username : 'test1234::::' ,
29+ password : 'mypass' ,
30+ expected : 'dGVzdDEyMzQ6Ojo6Om15cGFzcw=='
31+ } ,
32+ ] ;
33+
34+ for ( const testCase of testCases ) {
35+ const server = http . createServer ( function ( request , response ) {
36+ // The correct authorization header is be passed
37+ assert . strictEqual ( request . headers . authorization , `Basic ${ testCase . expected } ` ) ;
38+ response . writeHead ( 200 , { } ) ;
39+ response . end ( 'ok' ) ;
40+ server . close ( ) ;
41+ } ) ;
42+
43+ server . listen ( 0 , function ( ) {
44+ // make the request
45+ const url = new URL ( `http://${ testCase . username } :${ testCase . password } @localhost:${ this . address ( ) . port } ` ) ;
46+ http . request ( url ) . end ( ) ;
47+ } ) ;
48+ }
You can’t perform that action at this time.
0 commit comments