File tree Expand file tree Collapse file tree 2 files changed +22
-6
lines changed Expand file tree Collapse file tree 2 files changed +22
-6
lines changed Original file line number Diff line number Diff line change @@ -30,6 +30,14 @@ describe('Parse cookie', () => {
30
30
expect ( cookie [ 'tasty_cookie' ] ) . toBeUndefined ( )
31
31
} )
32
32
33
+ it ( 'Should parse one cookie specified by name even if it is not found' , ( ) => {
34
+ const cookieString = 'yummy_cookie=choco; tasty_cookie = strawberry '
35
+ const cookie : Cookie = parse ( cookieString , 'no_such_cookie' )
36
+ expect ( cookie [ 'yummy_cookie' ] ) . toBeUndefined ( )
37
+ expect ( cookie [ 'tasty_cookie' ] ) . toBeUndefined ( )
38
+ expect ( cookie [ 'no_such_cookie' ] ) . toBeUndefined ( )
39
+ } )
40
+
33
41
it ( 'Should parse cookies with no value' , ( ) => {
34
42
const cookieString = 'yummy_cookie=; tasty_cookie = ; best_cookie= ; last_cookie=""'
35
43
const cookie : Cookie = parse ( cookieString )
Original file line number Diff line number Diff line change @@ -77,17 +77,22 @@ const validCookieNameRegEx = /^[\w!#$%&'*.^`|~+-]+$/
77
77
const validCookieValueRegEx = / ^ [ ! # - : < - [ \] - ~ ] * $ /
78
78
79
79
export const parse = ( cookie : string , name ?: string ) : Cookie => {
80
+ if ( name && cookie . indexOf ( name ) === - 1 ) {
81
+ // Fast-path: return immediately if the demanded-key is not in the cookie string
82
+ return { }
83
+ }
80
84
const pairs = cookie . trim ( ) . split ( ';' )
81
- return pairs . reduce ( ( parsedCookie , pairStr ) => {
85
+ const parsedCookie : Cookie = { }
86
+ for ( let pairStr of pairs ) {
82
87
pairStr = pairStr . trim ( )
83
88
const valueStartPos = pairStr . indexOf ( '=' )
84
89
if ( valueStartPos === - 1 ) {
85
- return parsedCookie
90
+ continue
86
91
}
87
92
88
93
const cookieName = pairStr . substring ( 0 , valueStartPos ) . trim ( )
89
94
if ( ( name && name !== cookieName ) || ! validCookieNameRegEx . test ( cookieName ) ) {
90
- return parsedCookie
95
+ continue
91
96
}
92
97
93
98
let cookieValue = pairStr . substring ( valueStartPos + 1 ) . trim ( )
@@ -96,10 +101,13 @@ export const parse = (cookie: string, name?: string): Cookie => {
96
101
}
97
102
if ( validCookieValueRegEx . test ( cookieValue ) ) {
98
103
parsedCookie [ cookieName ] = decodeURIComponent_ ( cookieValue )
104
+ if ( name ) {
105
+ // Fast-path: return only the demanded-key immediately. Other keys are not needed.
106
+ break
107
+ }
99
108
}
100
-
101
- return parsedCookie
102
- } , { } as Cookie )
109
+ }
110
+ return parsedCookie
103
111
}
104
112
105
113
export const parseSigned = async (
You can’t perform that action at this time.
0 commit comments