@@ -75,6 +75,7 @@ @interface GCDWebServerHandler () {
7575#endif
7676
7777static NSDateFormatter * _dateFormatterRFC822 = nil ;
78+ static NSDateFormatter * _dateFormatterISO8601 = nil ;
7879static dispatch_queue_t _dateFormatterQueue = NULL ;
7980#if !TARGET_OS_IPHONE
8081static BOOL _run;
@@ -139,18 +140,34 @@ NSStringEncoding GCDWebServerStringEncodingFromCharset(NSString* charset) {
139140 return (encoding != kCFStringEncodingInvalidId ? encoding : NSUTF8StringEncoding);
140141}
141142
142- NSString * GCDWebServerFormatHTTPDate (NSDate * date) {
143+ NSString * GCDWebServerFormatRFC822 (NSDate * date) {
143144 __block NSString * string;
144145 dispatch_sync (_dateFormatterQueue, ^{
145- string = [_dateFormatterRFC822 stringFromDate: date]; // HTTP/1.1 server must use RFC822
146+ string = [_dateFormatterRFC822 stringFromDate: date];
146147 });
147148 return string;
148149}
149150
150- NSDate * GCDWebServerParseHTTPDate (NSString * string) {
151+ NSDate * GCDWebServerParseRFC822 (NSString * string) {
151152 __block NSDate * date;
152153 dispatch_sync (_dateFormatterQueue, ^{
153- date = [_dateFormatterRFC822 dateFromString: string]; // TODO: Handle RFC 850 and ANSI C's asctime() format (http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3)
154+ date = [_dateFormatterRFC822 dateFromString: string];
155+ });
156+ return date;
157+ }
158+
159+ NSString * GCDWebServerFormatISO8601 (NSDate * date) {
160+ __block NSString * string;
161+ dispatch_sync (_dateFormatterQueue, ^{
162+ string = [_dateFormatterISO8601 stringFromDate: date];
163+ });
164+ return string;
165+ }
166+
167+ NSDate * GCDWebServerParseISO8601 (NSString * string) {
168+ __block NSDate * date;
169+ dispatch_sync (_dateFormatterQueue, ^{
170+ date = [_dateFormatterISO8601 dateFromString: string];
154171 });
155172 return date;
156173}
@@ -324,6 +341,8 @@ + (void)load {
324341
325342#endif
326343
344+ // HTTP/1.1 server must use RFC822
345+ // TODO: Handle RFC 850 and ANSI C's asctime() format (http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3)
327346+ (void )initialize {
328347 if (_dateFormatterRFC822 == nil ) {
329348 DCHECK ([NSThread isMainThread ]); // NSDateFormatter should be initialized on main thread
@@ -333,6 +352,14 @@ + (void)initialize {
333352 _dateFormatterRFC822.locale = ARC_AUTORELEASE ([[NSLocale alloc ] initWithLocaleIdentifier: @" en_US" ]);
334353 DCHECK (_dateFormatterRFC822);
335354 }
355+ if (_dateFormatterISO8601 == nil ) {
356+ DCHECK ([NSThread isMainThread ]); // NSDateFormatter should be initialized on main thread
357+ _dateFormatterISO8601 = [[NSDateFormatter alloc ] init ];
358+ _dateFormatterISO8601.timeZone = [NSTimeZone timeZoneWithAbbreviation: @" GMT" ];
359+ _dateFormatterISO8601.dateFormat = @" yyyy-MM-dd'T'HH:mm:ss'+00:00'" ;
360+ _dateFormatterISO8601.locale = ARC_AUTORELEASE ([[NSLocale alloc ] initWithLocaleIdentifier: @" en_US" ]);
361+ DCHECK (_dateFormatterISO8601);
362+ }
336363 if (_dateFormatterQueue == NULL ) {
337364 _dateFormatterQueue = dispatch_queue_create (NULL , DISPATCH_QUEUE_SERIAL);
338365 DCHECK (_dateFormatterQueue);
0 commit comments