@@ -18,16 +18,23 @@ const {
1818 Symbol,
1919} = primordials ;
2020
21+ const {
22+ _checkInvalidHeaderChar : checkInvalidHeaderChar ,
23+ _checkIsHttpToken : checkIsHttpToken ,
24+ } = require ( '_http_common' ) ;
25+
2126const binding = internalBinding ( 'http2' ) ;
2227const {
2328 codes : {
2429 ERR_HTTP2_HEADER_SINGLE_VALUE ,
2530 ERR_HTTP2_INVALID_CONNECTION_HEADERS ,
31+ ERR_HTTP2_INVALID_HEADER_VALUE ,
2632 ERR_HTTP2_INVALID_PSEUDOHEADER : { HideStackFramesError : ERR_HTTP2_INVALID_PSEUDOHEADER } ,
2733 ERR_HTTP2_INVALID_SETTING_VALUE ,
2834 ERR_HTTP2_TOO_MANY_CUSTOM_SETTINGS ,
2935 ERR_INVALID_ARG_TYPE ,
3036 ERR_INVALID_HTTP_TOKEN ,
37+ ERR_UNESCAPED_CHARACTERS ,
3138 } ,
3239 getMessage,
3340 hideStackFrames,
@@ -113,6 +120,18 @@ const kValidPseudoHeaders = new SafeSet([
113120 HTTP2_HEADER_PROTOCOL ,
114121] ) ;
115122
123+ const INVALID_PATH_REGEX = / [ ^ \u0021 - \u00ff ] / ;
124+
125+ function assertValidHeaderValue ( name , value ) {
126+ if ( name === HTTP2_HEADER_PATH && INVALID_PATH_REGEX . test ( value ) ) {
127+ throw new ERR_UNESCAPED_CHARACTERS ( 'Request path' ) ;
128+ }
129+
130+ if ( checkInvalidHeaderChar ( value ) ) {
131+ throw new ERR_HTTP2_INVALID_HEADER_VALUE ( value , name ) ;
132+ }
133+ }
134+
116135// This set contains headers that are permitted to have only a single
117136// value. Multiple instances must not be specified.
118137const kSingleValueHeaders = new SafeSet ( [
@@ -595,6 +614,8 @@ function mapToHeaders(map,
595614 let pseudoHeaders = '' ;
596615 let count = 0 ;
597616 const keys = ObjectKeys ( map ) ;
617+ const shouldValidateHeaderValue =
618+ assertValuePseudoHeader === assertValidPseudoHeader ;
598619 const singles = new SafeSet ( ) ;
599620 let i , j ;
600621 let isArray ;
@@ -640,6 +661,9 @@ function mapToHeaders(map,
640661 err = assertValuePseudoHeader ( key ) ;
641662 if ( err !== undefined )
642663 throw err ;
664+ if ( shouldValidateHeaderValue ) {
665+ assertValidHeaderValue ( key , value ) ;
666+ }
643667 pseudoHeaders += `${ key } \0${ value } \0${ flags } ` ;
644668 count ++ ;
645669 continue ;
@@ -653,11 +677,17 @@ function mapToHeaders(map,
653677 if ( isArray ) {
654678 for ( j = 0 ; j < value . length ; ++ j ) {
655679 const val = String ( value [ j ] ) ;
680+ if ( shouldValidateHeaderValue ) {
681+ assertValidHeaderValue ( key , val ) ;
682+ }
656683 headers += `${ key } \0${ val } \0${ flags } ` ;
657684 }
658685 count += value . length ;
659686 continue ;
660687 }
688+ if ( shouldValidateHeaderValue ) {
689+ assertValidHeaderValue ( key , value ) ;
690+ }
661691 headers += `${ key } \0${ value } \0${ flags } ` ;
662692 count ++ ;
663693 }
0 commit comments