@@ -326,11 +326,11 @@ OFURL *URL = [request URL]; OFString *scheme = [URL scheme]; of_http_request_method_t method = [request method]; OFMutableString *requestString; OFDictionary *headers = [request headers]; - OFDataArray *POSTData = [request POSTData]; + OFDataArray *entity = [request entity]; OFTCPSocket *socket; OFHTTPClientResponse *response; OFString *line, *path, *version, *redirect, *keepAlive; OFMutableDictionary *serverHeaders; OFEnumerator *keyEnumerator, *objectEnumerator; @@ -338,16 +338,10 @@ int status; if (![scheme isEqual: @"http"] && ![scheme isEqual: @"https"]) @throw [OFUnsupportedProtocolException exceptionWithURL: URL]; - if (method != OF_HTTP_REQUEST_METHOD_GET && - method != OF_HTTP_REQUEST_METHOD_HEAD && - method != OF_HTTP_REQUEST_METHOD_POST) - @throw [OFNotImplementedException exceptionWithSelector: _cmd - object: self]; - /* Can we reuse the socket? */ if (_socket != nil && [[_lastURL scheme] isEqual: [URL scheme]] && [[_lastURL host] isEqual: [URL host]] && [_lastURL port] == [URL port]) { /* @@ -409,23 +403,10 @@ while ((key = [keyEnumerator nextObject]) != nil && (object = [objectEnumerator nextObject]) != nil) [requestString appendFormat: @"%@: %@\r\n", key, object]; - if (method == OF_HTTP_REQUEST_METHOD_POST) { - OFString *contentType = [request MIMEType]; - - if (contentType == nil) - contentType = @"application/x-www-form-urlencoded; " - @"charset=UTF-8"; - - [requestString appendFormat: - @"Content-Type: %@\r\n" - @"Content-Length: %zu\r\n", - contentType, [POSTData count] * [POSTData itemSize]]; - } - if ([request protocolVersion].major == 1 && [request protocolVersion].minor == 0) [requestString appendString: @"Connection: keep-alive\r\n"]; [requestString appendString: @"\r\n"]; @@ -439,13 +420,13 @@ /* Reconnect in case a keep-alive connection timed out */ socket = [self OF_createSocketForRequest: request]; [socket writeString: requestString]; } - if (method == OF_HTTP_REQUEST_METHOD_POST) - [socket writeBuffer: [POSTData items] - length: [POSTData count] * [POSTData itemSize]]; + if (entity != nil) + [socket writeBuffer: [entity items] + length: [entity count] * [entity itemSize]]; @try { line = [socket readLine]; } @catch (OFInvalidEncodingException *e) { @throw [OFInvalidServerReplyException exception]; @@ -458,14 +439,14 @@ */ if (line == nil) { socket = [self OF_createSocketForRequest: request]; [socket writeString: requestString]; - if (method == OF_HTTP_REQUEST_METHOD_POST) - [socket writeBuffer: [POSTData items] - length: [POSTData count] * - [POSTData itemSize]]; + if (entity != nil) + [socket writeBuffer: [entity items] + length: [entity count] * + [entity itemSize]]; @try { line = [socket readLine]; } @catch (OFInvalidEncodingException *e) { @throw [OFInvalidServerReplyException exception]; @@ -578,18 +559,32 @@ OFHTTPRequest *newRequest; newRequest = [OFHTTPRequest requestWithURL: newURL]; [newRequest setMethod: method]; [newRequest setHeaders: headers]; - [newRequest setPOSTData: POSTData]; - [newRequest setMIMEType: [request MIMEType]]; + [newRequest setEntity: entity]; if (status == 303) { + OFMutableDictionary *newHeaders; + OFEnumerator *keyEnumerator, *objectEnumerator; + id key, object; + + newHeaders = [OFMutableDictionary dictionary]; + keyEnumerator = [headers keyEnumerator]; + objectEnumerator = [headers objectEnumerator]; + while ((key = [keyEnumerator nextObject]) != + nil && + (object = [objectEnumerator nextObject]) != + nil) + if (![key hasPrefix: @"Content-"]) + [newHeaders setObject: object + forKey: key]; + [newRequest setMethod: OF_HTTP_REQUEST_METHOD_GET]; - [newRequest setPOSTData: nil]; - [newRequest setMIMEType: nil]; + [newRequest setHeaders: newHeaders]; + [newRequest setEntity: nil]; } [newRequest retain]; objc_autoreleasePoolPop(pool); [newRequest autorelease];