@@ -2651,13 +2651,13 @@ export interface WWWAuthenticateChallenge {
26512651}
26522652
26532653const tokenMatch = "[a-zA-Z0-9!#$%&\\'\\*\\+\\-\\.\\^_`\\|~]+"
2654- const token68Match = '[a-zA-Z0-9\\-\\._\\~\\+\\/]+[=] {0,2}'
2655- const quotedMatch = '"((?:[^"\\\\]|\\\\. )*)"'
2654+ const token68Match = '[a-zA-Z0-9\\-\\._\\~\\+\\/]+= {0,2}'
2655+ const quotedMatch = '"((?:[^"\\\\]|\\\\[\\s\\S] )*)"'
26562656
26572657const quotedParamMatcher = '(' + tokenMatch + ')\\s*=\\s*' + quotedMatch
26582658const paramMatcher = '(' + tokenMatch + ')\\s*=\\s*(' + tokenMatch + ')'
26592659
2660- const schemeRE = new RegExp ( '^[,\\s]*(' + tokenMatch + ')\\s(.*) ' )
2660+ const schemeRE = new RegExp ( '^[,\\s]*(' + tokenMatch + ')' )
26612661const quotedParamRE = new RegExp ( '^[,\\s]*' + quotedParamMatcher + '[,\\s]*(.*)' )
26622662const unquotedParamRE = new RegExp ( '^[,\\s]*' + paramMatcher + '[,\\s]*(.*)' )
26632663const token68ParamRE = new RegExp ( '^(' + token68Match + ')(?:$|[,\\s])(.*)' )
@@ -2680,45 +2680,60 @@ function parseWwwAuthenticateChallenges(
26802680 while ( rest ) {
26812681 let match : RegExpMatchArray | null = rest . match ( schemeRE )
26822682 const scheme = match ?. [ '1' ] . toLowerCase ( ) as Lowercase < string >
2683- rest = match ?. [ '2' ]
26842683 if ( ! scheme ) {
26852684 return undefined
26862685 }
26872686
2687+ // Calculate remainder after scheme
2688+ const afterScheme = rest . substring ( match ! [ 0 ] . length )
2689+ if ( afterScheme && ! afterScheme . match ( / ^ [ \s , ] / ) ) {
2690+ // Invalid: scheme must be followed by space, comma, or end
2691+ return undefined
2692+ }
2693+ // Check if there's a space after scheme (indicating parameters may follow)
2694+ const spaceMatch = afterScheme . match ( / ^ \s + ( .* ) $ / )
2695+ const hasParameters = ! ! spaceMatch
2696+ rest = spaceMatch ? spaceMatch [ 1 ] : undefined
2697+
26882698 const parameters : WWWAuthenticateChallenge [ 'parameters' ] = { }
26892699 let token68 : string | undefined
26902700
2691- while ( rest ) {
2692- let key : string
2693- let value : string
2694- if ( ( match = rest . match ( quotedParamRE ) ) ) {
2695- ; [ , key , value , rest ] = match
2696- if ( value . includes ( '\\' ) ) {
2697- try {
2698- value = JSON . parse ( `"${ value } "` )
2699- } catch { }
2701+ if ( hasParameters ) {
2702+ while ( rest ) {
2703+ let key : string
2704+ let value : string
2705+ if ( ( match = rest . match ( quotedParamRE ) ) ) {
2706+ ; [ , key , value , rest ] = match
2707+ if ( value . includes ( '\\' ) ) {
2708+ try {
2709+ value = JSON . parse ( `"${ value } "` )
2710+ } catch { }
2711+ }
2712+ // @ts -expect-error
2713+ parameters [ key . toLowerCase ( ) as Lowercase < string > ] = value
2714+ continue
27002715 }
2701- // @ts -expect-error
2702- parameters [ key . toLowerCase ( ) as Lowercase < string > ] = value
2703- continue
2704- }
27052716
2706- if ( ( match = rest . match ( unquotedParamRE ) ) ) {
2707- ; [ , key , value , rest ] = match
2708- // @ts -expect-error
2709- parameters [ key . toLowerCase ( ) as Lowercase < string > ] = value
2710- continue
2711- }
2717+ if ( ( match = rest . match ( unquotedParamRE ) ) ) {
2718+ ; [ , key , value , rest ] = match
2719+ // @ts -expect-error
2720+ parameters [ key . toLowerCase ( ) as Lowercase < string > ] = value
2721+ continue
2722+ }
27122723
2713- if ( ( match = rest . match ( token68ParamRE ) ) ) {
2714- if ( Object . keys ( parameters ) . length ) {
2724+ if ( ( match = rest . match ( token68ParamRE ) ) ) {
2725+ if ( Object . keys ( parameters ) . length ) {
2726+ break
2727+ }
2728+ ; [ , token68 , rest ] = match
27152729 break
27162730 }
2717- ; [ , token68 , rest ] = match
2718- break
2719- }
27202731
2721- return undefined
2732+ return undefined
2733+ }
2734+ } else {
2735+ // No space after scheme - set rest to the comma-prefixed remainder for next iteration
2736+ rest = afterScheme || undefined
27222737 }
27232738
27242739 const challenge : WWWAuthenticateChallenge = { scheme, parameters }
0 commit comments