Index: src/OFDataArray.m ================================================================== --- src/OFDataArray.m +++ src/OFDataArray.m @@ -152,11 +152,11 @@ if ([result statusCode] != 200) @throw [OFHTTPRequestFailedException newWithClass: [request class] HTTPRequest: request - statusCode: [result statusCode]]; + result: result]; self = [[result data] retain]; [pool release]; return self; } Index: src/OFHTTPRequest.m ================================================================== --- src/OFHTTPRequest.m +++ src/OFHTTPRequest.m @@ -285,17 +285,10 @@ newWithClass: isa]; status = (int)[[line substringFromIndex: 9 toIndex: 12] decimalValue]; - if (status != 200 && status != 301 && status != 302 && - status != 303) - @throw [OFHTTPRequestFailedException - newWithClass: isa - HTTPRequest: self - statusCode: status]; - serverHeaders = [OFMutableDictionary dictionary]; while ((line = [sock readLine]) != nil) { OFString *key, *value; const char *line_c = [line cString], *tmp; @@ -392,11 +385,17 @@ if (cl > SIZE_MAX) @throw [OFOutOfRangeException newWithClass: isa]; - if (cl != bytesReceived) + /* + * We only want to throw on these status codes as we + * will throw an OFHTTPRequestFailedException for all + * other status codes later. + */ + if (cl != bytesReceived && (status == 200 || + status == 301 || status == 302 || status == 303)) @throw [OFTruncatedDataException newWithClass: isa]; } /* @@ -409,10 +408,17 @@ result = [[OFHTTPRequestResult alloc] initWithStatusCode: status headers: serverHeaders data: data]; + + if (status != 200 && status != 301 && status != 302 && + status != 303) + @throw [OFHTTPRequestFailedException + newWithClass: isa + HTTPRequest: self + result: result]; } @finally { [pool release]; } return [result autorelease]; Index: src/OFString.m ================================================================== --- src/OFString.m +++ src/OFString.m @@ -732,11 +732,11 @@ if ([result statusCode] != 200) @throw [OFHTTPRequestFailedException newWithClass: [request class] HTTPRequest: request - statusCode: [result statusCode]]; + result: result]; if (encoding == OF_STRING_ENCODING_AUTODETECT && (contentType = [[result headers] objectForKey: @"Content-Type"])) { contentType = [[contentType mutableCopy] autorelease]; [contentType lower]; Index: src/exceptions/OFHTTPRequestFailedException.h ================================================================== --- src/exceptions/OFHTTPRequestFailedException.h +++ src/exceptions/OFHTTPRequestFailedException.h @@ -15,52 +15,53 @@ */ #import "OFException.h" @class OFHTTPRequest; +@class OFHTTPRequestResult; /** * \brief An exception indicating that a HTTP request failed. */ @interface OFHTTPRequestFailedException: OFException { OFHTTPRequest *HTTPRequest; - short statusCode; + OFHTTPRequestResult *result; } #ifdef OF_HAVE_PROPERTIES @property (readonly, nonatomic) OFHTTPRequest *HTTPRequest; -@property (readonly) short statusCode; +@property (readonly, nonatomic) OFHTTPRequestResult *result; #endif /** * \param class_ The class of the object which caused the exception * \param request The HTTP request which failed - * \param code The status code of the fialed HTTP request + * \param result The result of the failed HTTP request * \return A new HTTP request failed exception */ + newWithClass: (Class)class_ HTTPRequest: (OFHTTPRequest*)request - statusCode: (short)code; + result: (OFHTTPRequestResult*)result; /** * Initializes an already allocated HTTP request failed exception * * \param class_ The class of the object which caused the exception * \param request The HTTP request which failed - * \param code The status code of the fialed HTTP request + * \param result The result of the failed HTTP request * \return A new HTTP request failed exception */ - initWithClass: (Class)class_ HTTPRequest: (OFHTTPRequest*)request - statusCode: (short)code; + result: (OFHTTPRequestResult*)result; /** * \return The HTTP request which failed */ - (OFHTTPRequest*)HTTPRequest; /** - * \return The status code of the HTTP request + * \return The result of the failed HTTP request */ -- (short)statusCode; +- (OFHTTPRequestResult*)result; @end Index: src/exceptions/OFHTTPRequestFailedException.m ================================================================== --- src/exceptions/OFHTTPRequestFailedException.m +++ src/exceptions/OFHTTPRequestFailedException.m @@ -24,15 +24,15 @@ #import "OFNotImplementedException.h" @implementation OFHTTPRequestFailedException + newWithClass: (Class)class_ HTTPRequest: (OFHTTPRequest*)request - statusCode: (short)code + result: (OFHTTPRequestResult*)result { return [[self alloc] initWithClass: class_ HTTPRequest: request - statusCode: code]; + result: result]; } - initWithClass: (Class)class_ { Class c = isa; @@ -41,17 +41,17 @@ selector: _cmd]; } - initWithClass: (Class)class_ HTTPRequest: (OFHTTPRequest*)request - statusCode: (short)code + result: (OFHTTPRequestResult*)result_ { self = [super initWithClass: class_]; @try { HTTPRequest = [request retain]; - statusCode = code; + result = [result_ retain]; } @catch (id e) { [self release]; @throw e; } @@ -59,10 +59,11 @@ } - (void)dealloc { [HTTPRequest release]; + [result release]; [super dealloc]; } - (OFString*)description @@ -87,11 +88,11 @@ pool = [[OFAutoreleasePool alloc] init]; description = [[OFString alloc] initWithFormat: @"A HTTP %s request in class %@ with URL %@ failed with code %d", - type, inClass, [HTTPRequest URL], statusCode]; + type, inClass, [HTTPRequest URL], [result statusCode]]; [pool release]; return description; } @@ -99,10 +100,10 @@ - (OFHTTPRequest*)HTTPRequest { return HTTPRequest; } -- (short)statusCode +- (OFHTTPRequestResult*)result { - return statusCode; + return result; } @end