@@ -205,33 +205,42 @@ } - (void)OF_sendHeaders { void *pool = objc_autoreleasePoolPush(); - OFString *date = [[OFDate date] - dateStringWithFormat: @"%a, %d %b %Y %H:%M:%S GMT"]; + OFMutableDictionary OF_GENERIC(OFString*, OFString*) *headers; OFEnumerator *keyEnumerator, *valueEnumerator; OFString *key, *value; - [_socket writeFormat: @"HTTP/%@ %d %s\r\n" - @"Server: %@\r\n" - @"Date: %@\r\n", + [_socket writeFormat: @"HTTP/%@ %d %s\r\n", [self protocolVersionString], _statusCode, - statusCodeToString(_statusCode), - [_server name], date]; + statusCodeToString(_statusCode)]; - keyEnumerator = [_headers keyEnumerator]; - valueEnumerator = [_headers objectEnumerator]; + headers = [[_headers mutableCopy] autorelease]; + + if ([headers objectForKey: @"Date"] == nil) { + OFString *date = [[OFDate date] + dateStringWithFormat: @"%a, %d %b %Y %H:%M:%S GMT"]; + + [headers setObject: date + forKey: @"Date"]; + } + + if ([headers objectForKey: @"Server"] == nil) + [headers setObject: [_server name] + forKey: @"Server"]; + + keyEnumerator = [headers keyEnumerator]; + valueEnumerator = [headers objectEnumerator]; while ((key = [keyEnumerator nextObject]) != nil && (value = [valueEnumerator nextObject]) != nil) - if (![key isEqual: @"Server"] && ![key isEqual: @"Date"]) - [_socket writeFormat: @"%@: %@\r\n", key, value]; + [_socket writeFormat: @"%@: %@\r\n", key, value]; [_socket writeString: @"\r\n"]; _headersSent = true; - _chunked = [[_headers objectForKey: @"Transfer-Encoding"] + _chunked = [[headers objectForKey: @"Transfer-Encoding"] isEqual: @"chunked"]; objc_autoreleasePoolPop(pool); } @@ -656,11 +665,11 @@ - init { self = [super init]; _name = @"OFHTTPServer (ObjFW's HTTP server class " - @")"; + @")"; return self; } - (void)dealloc