@@ -95,40 +95,49 @@ function parse(str, options) {
95
95
throw new TypeError ( 'argument str must be a string' ) ;
96
96
}
97
97
98
- var obj = { }
98
+ var obj = { } ;
99
99
var opt = options || { } ;
100
100
var dec = opt . decode || decode ;
101
101
102
- var index = 0
103
- while ( index < str . length ) {
104
- var eqIdx = str . indexOf ( '=' , index )
102
+ var index = 0 ;
103
+ var eqIdx = 0 ;
104
+ var endIdx = 0 ;
105
+ var len = str . length ;
106
+ var max = len - 2 ;
107
+
108
+ while ( index < max ) {
109
+ eqIdx = str . indexOf ( '=' , index ) ;
105
110
106
111
// no more cookie pairs
107
112
if ( eqIdx === - 1 ) {
108
- break
113
+ break ;
109
114
}
110
115
111
- var endIdx = str . indexOf ( ';' , index )
116
+ endIdx = str . indexOf ( ';' , index ) ;
112
117
113
118
if ( endIdx === - 1 ) {
114
- endIdx = str . length
115
- } else if ( endIdx < eqIdx ) {
119
+ endIdx = len ;
120
+ } else if ( eqIdx > endIdx ) {
116
121
// backtrack on prior semicolon
117
- index = str . lastIndexOf ( ';' , eqIdx - 1 ) + 1
118
- continue
122
+ index = str . lastIndexOf ( ';' , eqIdx - 1 ) + 1 ;
123
+ continue ;
119
124
}
120
125
121
- var key = str . slice ( index , eqIdx ) . trim ( )
126
+ var keyStartIdx = startIndex ( str , index , eqIdx ) ;
127
+ var keyEndIdx = endIndex ( str , eqIdx , keyStartIdx ) ;
128
+ var key = str . slice ( keyStartIdx , keyEndIdx ) ;
122
129
123
130
// only assign once
124
131
if ( undefined === obj [ key ] ) {
125
- var val = str . slice ( eqIdx + 1 , endIdx ) . trim ( )
132
+ var valStartIdx = startIndex ( str , eqIdx + 1 , endIdx ) ;
133
+ var valEndIdx = endIndex ( str , endIdx , valStartIdx ) ;
126
134
127
- // quoted values
128
- if ( val . charCodeAt ( 0 ) === 0x22 ) {
129
- val = val . slice ( 1 , - 1 )
135
+ if ( str . charCodeAt ( valStartIdx ) === 0x22 /* " */ && str . charCodeAt ( valEndIdx - 1 ) === 0x22 /* " */ ) {
136
+ valStartIdx ++ ;
137
+ valEndIdx -- ;
130
138
}
131
139
140
+ var val = str . slice ( valStartIdx , valEndIdx ) ;
132
141
obj [ key ] = tryDecode ( val , dec ) ;
133
142
}
134
143
@@ -138,6 +147,22 @@ function parse(str, options) {
138
147
return obj ;
139
148
}
140
149
150
+ function startIndex ( str , index , max ) {
151
+ do {
152
+ var code = str . charCodeAt ( index ) ;
153
+ if ( code !== 0x20 /* */ && code !== 0x09 /* \t */ ) return index ;
154
+ } while ( ++ index < max ) ;
155
+ return max ;
156
+ }
157
+
158
+ function endIndex ( str , index , min ) {
159
+ while ( index > min ) {
160
+ var code = str . charCodeAt ( -- index ) ;
161
+ if ( code !== 0x20 /* */ && code !== 0x09 /* \t */ ) return index + 1 ;
162
+ }
163
+ return min ;
164
+ }
165
+
141
166
/**
142
167
* Serialize data into a cookie header.
143
168
*
0 commit comments