@@ -23,14 +23,60 @@ exports.serialize = serialize;
23
23
var __toString = Object . prototype . toString
24
24
25
25
/**
26
- * RegExp to match field-content in RFC 7230 sec 3.2
26
+ * RegExp to match cookie-name in RFC 6265 sec 4.1.1
27
+ * This refers out to the obsoleted definition of token in RFC 2616 sec 2.2
28
+ * which has been replaced by the token definition in RFC 7230 appendix B.
27
29
*
28
- * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ]
29
- * field-vchar = VCHAR / obs-text
30
- * obs-text = %x80-FF
30
+ * cookie-name = token
31
+ * token = 1*tchar
32
+ * tchar = "!" / "#" / "$" / "%" / "&" / "'" /
33
+ * "*" / "+" / "-" / "." / "^" / "_" /
34
+ * "`" / "|" / "~" / DIGIT / ALPHA
31
35
*/
32
36
33
- var fieldContentRegExp = / ^ [ \u0009 \u0020 - \u007e \u0080 - \u00ff ] + $ / ;
37
+ var cookieNameRegExp = / ^ [ ! # $ % & ' * + \- . ^ _ ` | ~ 0 - 9 A - Z a - z ] + $ / ;
38
+
39
+ /**
40
+ * RegExp to match cookie-value in RFC 6265 sec 4.1.1
41
+ *
42
+ * cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE )
43
+ * cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E
44
+ * ; US-ASCII characters excluding CTLs,
45
+ * ; whitespace DQUOTE, comma, semicolon,
46
+ * ; and backslash
47
+ */
48
+
49
+ var cookieValueRegExp = / ^ ( " ? ) [ \u0021 \u0023 - \u002B \u002D - \u003A \u003C - \u005B \u005D - \u007E ] * \1$ / ;
50
+
51
+ /**
52
+ * RegExp to match domain-value in RFC 6265 sec 4.1.1
53
+ *
54
+ * domain-value = <subdomain>
55
+ * ; defined in [RFC1034], Section 3.5, as
56
+ * ; enhanced by [RFC1123], Section 2.1
57
+ * <subdomain> = <label> | <subdomain> "." <label>
58
+ * <label> = <let-dig> [ [ <ldh-str> ] <let-dig> ]
59
+ * Labels must be 63 characters or less.
60
+ * 'let-dig' not 'letter' in the first char, per RFC1123
61
+ * <ldh-str> = <let-dig-hyp> | <let-dig-hyp> <ldh-str>
62
+ * <let-dig-hyp> = <let-dig> | "-"
63
+ * <let-dig> = <letter> | <digit>
64
+ * <letter> = any one of the 52 alphabetic characters A through Z in
65
+ * upper case and a through z in lower case
66
+ * <digit> = any one of the ten digits 0 through 9
67
+ */
68
+
69
+ var domainValueRegExp = / ^ ( [ a - z 0 - 9 ] ( [ a - z 0 - 9 - ] { 0 , 61 } [ a - z 0 - 9 ] ) ? ) ( [ . ] [ a - z 0 - 9 ] ( [ a - z 0 - 9 - ] { 0 , 61 } [ a - z 0 - 9 ] ) ? ) * $ / i;
70
+
71
+ /**
72
+ * RegExp to match path-value in RFC 6265 sec 4.1.1
73
+ *
74
+ * path-value = <any CHAR except CTLs or ";">
75
+ * CHAR = %x01-7F
76
+ * ; defined in RFC 5234 appendix B.1
77
+ */
78
+
79
+ var pathValueRegExp = / ^ [ \u0020 - \u003A \u003D - \u007E ] * $ / ;
34
80
35
81
/**
36
82
* Parse a cookie header.
@@ -116,13 +162,13 @@ function serialize(name, val, options) {
116
162
throw new TypeError ( 'option encode is invalid' ) ;
117
163
}
118
164
119
- if ( ! fieldContentRegExp . test ( name ) ) {
165
+ if ( ! cookieNameRegExp . test ( name ) ) {
120
166
throw new TypeError ( 'argument name is invalid' ) ;
121
167
}
122
168
123
169
var value = enc ( val ) ;
124
170
125
- if ( value && ! fieldContentRegExp . test ( value ) ) {
171
+ if ( value && ! cookieValueRegExp . test ( value ) ) {
126
172
throw new TypeError ( 'argument val is invalid' ) ;
127
173
}
128
174
@@ -139,15 +185,15 @@ function serialize(name, val, options) {
139
185
}
140
186
141
187
if ( opt . domain ) {
142
- if ( ! fieldContentRegExp . test ( opt . domain ) ) {
188
+ if ( ! domainValueRegExp . test ( opt . domain ) ) {
143
189
throw new TypeError ( 'option domain is invalid' ) ;
144
190
}
145
191
146
192
str += '; Domain=' + opt . domain ;
147
193
}
148
194
149
195
if ( opt . path ) {
150
- if ( ! fieldContentRegExp . test ( opt . path ) ) {
196
+ if ( ! pathValueRegExp . test ( opt . path ) ) {
151
197
throw new TypeError ( 'option path is invalid' ) ;
152
198
}
153
199
0 commit comments