@@ -124,6 +124,151 @@ func TestDateParsing(t *testing.T) {
124
124
}
125
125
}
126
126
127
+ func TestDateParsingCFWS (t * testing.T ) {
128
+ tests := []struct {
129
+ dateStr string
130
+ exp time.Time
131
+ valid bool
132
+ }{
133
+ // FWS-only. No date.
134
+ {
135
+ " " ,
136
+ // nil is not allowed
137
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
138
+ false ,
139
+ },
140
+ // FWS is allowed before optional day of week.
141
+ {
142
+ " Fri, 21 Nov 1997 09:55:06 -0600" ,
143
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
144
+ true ,
145
+ },
146
+ {
147
+ "21 Nov 1997 09:55:06 -0600" ,
148
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
149
+ true ,
150
+ },
151
+ {
152
+ "Fri 21 Nov 1997 09:55:06 -0600" ,
153
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
154
+ false , // missing ,
155
+ },
156
+ // FWS is allowed before day of month but HTAB fails.
157
+ {
158
+ "Fri, 21 Nov 1997 09:55:06 -0600" ,
159
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
160
+ true ,
161
+ },
162
+ // FWS is allowed before and after year but HTAB fails.
163
+ {
164
+ "Fri, 21 Nov 1997 09:55:06 -0600" ,
165
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
166
+ true ,
167
+ },
168
+ // FWS is allowed before zone but HTAB is not handled. Obsolete timezone is handled.
169
+ {
170
+ "Fri, 21 Nov 1997 09:55:06 CST" ,
171
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("CST" , 0 )),
172
+ true ,
173
+ },
174
+ // FWS is allowed after date and a CRLF is already replaced.
175
+ {
176
+ "Fri, 21 Nov 1997 09:55:06 CST (no leading FWS and a trailing CRLF) \r \n " ,
177
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("CST" , 0 )),
178
+ true ,
179
+ },
180
+ // CFWS is a reduced set of US-ASCII where space and accentuated are obsolete. No error.
181
+ {
182
+ "Fri, 21 Nov 1997 09:55:06 -0600 (MDT and non-US-ASCII signs éèç )" ,
183
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
184
+ true ,
185
+ },
186
+ // CFWS is allowed after zone including a nested comment.
187
+ // Trailing FWS is allowed.
188
+ {
189
+ "Fri, 21 Nov 1997 09:55:06 -0600 \r \n (thisisa(valid)cfws) \t " ,
190
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
191
+ true ,
192
+ },
193
+ // CRLF is incomplete and misplaced.
194
+ {
195
+ "Fri, 21 Nov 1997 \r 09:55:06 -0600 \r \n (thisisa(valid)cfws) \t " ,
196
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
197
+ false ,
198
+ },
199
+ // CRLF is complete but misplaced. No error is returned.
200
+ {
201
+ "Fri, 21 Nov 199\r \n 7 09:55:06 -0600 \r \n (thisisa(valid)cfws) \t " ,
202
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
203
+ true , // should be false in the strict interpretation of RFC 5322.
204
+ },
205
+ // Invalid ASCII in date.
206
+ {
207
+ "Fri, 21 Nov 1997 ù 09:55:06 -0600 \r \n (thisisa(valid)cfws) \t " ,
208
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
209
+ false ,
210
+ },
211
+ // CFWS chars () in date.
212
+ {
213
+ "Fri, 21 Nov () 1997 09:55:06 -0600 \r \n (thisisa(valid)cfws) \t " ,
214
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
215
+ false ,
216
+ },
217
+ // Timezone is invalid but T is found in comment.
218
+ {
219
+ "Fri, 21 Nov 1997 09:55:06 -060 \r \n (Thisisa(valid)cfws) \t " ,
220
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
221
+ false ,
222
+ },
223
+ // Date has no month.
224
+ {
225
+ "Fri, 21 1997 09:55:06 -0600" ,
226
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
227
+ false ,
228
+ },
229
+ // Invalid month : OCT iso Oct
230
+ {
231
+ "Fri, 21 OCT 1997 09:55:06 CST" ,
232
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
233
+ false ,
234
+ },
235
+ // A too short time zone.
236
+ {
237
+ "Fri, 21 Nov 1997 09:55:06 -060" ,
238
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
239
+ false ,
240
+ },
241
+ // A too short obsolete time zone.
242
+ {
243
+ "Fri, 21 1997 09:55:06 GT" ,
244
+ time .Date (1997 , 11 , 21 , 9 , 55 , 6 , 0 , time .FixedZone ("" , - 6 * 60 * 60 )),
245
+ false ,
246
+ },
247
+ }
248
+ for _ , test := range tests {
249
+ hdr := Header {
250
+ "Date" : []string {test .dateStr },
251
+ }
252
+ date , err := hdr .Date ()
253
+ if err != nil && test .valid {
254
+ t .Errorf ("Header(Date: %s).Date(): %v" , test .dateStr , err )
255
+ } else if err == nil && ! date .Equal (test .exp ) && test .valid {
256
+ t .Errorf ("Header(Date: %s).Date() = %+v, want %+v" , test .dateStr , date , test .exp )
257
+ } else if err == nil && ! test .valid { // an invalid expression was tested
258
+ t .Errorf ("Header(Date: %s).Date() did not return an error but %v" , test .dateStr , date )
259
+ }
260
+
261
+ date , err = ParseDate (test .dateStr )
262
+ if err != nil && test .valid {
263
+ t .Errorf ("ParseDate(%s): %v" , test .dateStr , err )
264
+ } else if err == nil && ! test .valid { // an invalid expression was tested
265
+ t .Errorf ("ParseDate(%s) did not return an error but %v" , test .dateStr , date )
266
+ } else if err == nil && test .valid && ! date .Equal (test .exp ) {
267
+ t .Errorf ("ParseDate(%s) = %+v, want %+v" , test .dateStr , date , test .exp )
268
+ }
269
+ }
270
+ }
271
+
127
272
func TestAddressParsingError (t * testing.T ) {
128
273
mustErrTestCases := [... ]struct {
129
274
text string
0 commit comments