Overview
Comment: | Improve HTTP request method handling. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
c76896d937e096dc09c5b66a4d0d0aed |
User & Date: | js on 2013-09-28 01:50:27 |
Other Links: | manifest | tags |
Context
2013-09-28
| ||
15:25 | OFHTTP{Client,Server}: Handle all request methods. check-in: 7be34d8c40 user: js tags: trunk | |
01:50 | Improve HTTP request method handling. check-in: c76896d937 user: js tags: trunk | |
2013-09-20
| ||
10:57 | Move lookup asm files to src/runtime/lookup-asm. check-in: c4abdf467a user: js tags: trunk | |
Changes
Modified src/OFHTTPClient.m from [326cb8d0c5] to [97ab76e832].
︙ | ︙ | |||
31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #import "OFDataArray.h" #import "OFHTTPRequestFailedException.h" #import "OFInvalidEncodingException.h" #import "OFInvalidFormatException.h" #import "OFInvalidServerReplyException.h" #import "OFNotConnectedException.h" #import "OFOutOfMemoryException.h" #import "OFOutOfRangeException.h" #import "OFReadFailedException.h" #import "OFTruncatedDataException.h" #import "OFUnsupportedProtocolException.h" #import "OFUnsupportedVersionException.h" #import "OFWriteFailedException.h" | > | 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #import "OFDataArray.h" #import "OFHTTPRequestFailedException.h" #import "OFInvalidEncodingException.h" #import "OFInvalidFormatException.h" #import "OFInvalidServerReplyException.h" #import "OFNotConnectedException.h" #import "OFNotImplementedException.h" #import "OFOutOfMemoryException.h" #import "OFOutOfRangeException.h" #import "OFReadFailedException.h" #import "OFTruncatedDataException.h" #import "OFUnsupportedProtocolException.h" #import "OFUnsupportedVersionException.h" #import "OFWriteFailedException.h" |
︙ | ︙ | |||
320 321 322 323 324 325 326 | - (OFHTTPResponse*)performRequest: (OFHTTPRequest*)request redirects: (size_t)redirects { void *pool = objc_autoreleasePoolPush(); OFURL *URL = [request URL]; OFString *scheme = [URL scheme]; | | < > > > > > > | 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 | - (OFHTTPResponse*)performRequest: (OFHTTPRequest*)request redirects: (size_t)redirects { void *pool = objc_autoreleasePoolPush(); 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]; OFTCPSocket *socket; OFHTTPClientResponse *response; OFString *line, *path, *version, *redirect, *keepAlive; OFMutableDictionary *serverHeaders; OFEnumerator *keyEnumerator, *objectEnumerator; OFString *key, *object; 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]) { /* * Set _socket to nil, so that in case of an error it won't be |
︙ | ︙ | |||
364 365 366 367 368 369 370 | } [_lastResponse release]; _lastResponse = nil; } else socket = [self OF_createSocketForRequest: request]; | < < < < < < < > | > | | | 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 | } [_lastResponse release]; _lastResponse = nil; } else socket = [self OF_createSocketForRequest: request]; if ([(path = [URL path]) length] == 0) path = @"/"; /* * As a work around for a bug with split packets in lighttpd when using * HTTPS, we construct the complete request in a buffer string and then * send it all at once. */ if ([URL query] != nil) requestString = [OFMutableString stringWithFormat: @"%s %@?%@ HTTP/%@\r\n", of_http_request_method_to_string(method), path, [URL query], [request protocolVersionString]]; else requestString = [OFMutableString stringWithFormat: @"%s %@ HTTP/%@\r\n", of_http_request_method_to_string(method), path, [request protocolVersionString]]; if ([URL port] == 80) [requestString appendFormat: @"Host: %@\r\n", [URL host]]; else [requestString appendFormat: @"Host: %@:%d\r\n", [URL host], [URL port]]; if ([headers objectForKey: @"User-Agent"] == nil) [requestString appendString: @"User-Agent: Something using ObjFW " @"<https://webkeks.org/objfw>\r\n"]; keyEnumerator = [headers keyEnumerator]; objectEnumerator = [headers objectEnumerator]; 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: |
︙ | ︙ | |||
436 437 438 439 440 441 442 | @throw e; /* Reconnect in case a keep-alive connection timed out */ socket = [self OF_createSocketForRequest: request]; [socket writeString: requestString]; } | | | | 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 | @throw e; /* 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]]; @try { line = [socket readLine]; } @catch (OFInvalidEncodingException *e) { @throw [OFInvalidServerReplyException exception]; } /* * It's possible that the write succeeds on a connection that is * keep-alive, but the connection has already been closed by the remote * end due to a timeout. In this case, we need to reconnect. */ 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]]; @try { line = [socket readLine]; } @catch (OFInvalidEncodingException *e) { |
︙ | ︙ | |||
573 574 575 576 577 578 579 | shouldFollowRedirect: newURL request: request]; if (follow) { OFHTTPRequest *newRequest; newRequest = [OFHTTPRequest requestWithURL: newURL]; | | | | 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 | shouldFollowRedirect: newURL request: request]; if (follow) { OFHTTPRequest *newRequest; newRequest = [OFHTTPRequest requestWithURL: newURL]; [newRequest setMethod: method]; [newRequest setHeaders: headers]; [newRequest setPOSTData: POSTData]; [newRequest setMIMEType: [request MIMEType]]; if (status == 303) { [newRequest setMethod: OF_HTTP_REQUEST_METHOD_GET]; [newRequest setPOSTData: nil]; [newRequest setMIMEType: nil]; } [newRequest retain]; objc_autoreleasePoolPop(pool); [newRequest autorelease]; |
︙ | ︙ |
Modified src/OFHTTPRequest.h from [a983083af8] to [3c79d758cd].
︙ | ︙ | |||
26 27 28 29 30 31 32 | @class OFString; /*! @file */ /*! * @brief The type of an HTTP request. */ | | > > | > > | | | > > > > > > | | | | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | @class OFString; /*! @file */ /*! * @brief The type of an HTTP request. */ typedef enum of_http_request_method_t { /*! OPTIONS */ OF_HTTP_REQUEST_METHOD_OPTIONS, /*! GET */ OF_HTTP_REQUEST_METHOD_GET, /*! HEAD */ OF_HTTP_REQUEST_METHOD_HEAD, /*! POST */ OF_HTTP_REQUEST_METHOD_POST, /*! PUT */ OF_HTTP_REQUEST_METHOD_PUT, /*! DELETE */ OF_HTTP_REQUEST_METHOD_DELETE, /*! TRACE */ OF_HTTP_REQUEST_METHOD_TRACE, /*! CONNECT */ OF_HTTP_REQUEST_METHOD_CONNECT } of_http_request_method_t; /*! * @brief The HTTP version of the HTTP request. */ typedef struct of_http_request_protocol_version_t { /*! The major of the HTTP version */ uint8_t major; /*! The minor of the HTTP version */ uint8_t minor; } of_http_request_protocol_version_t; /*! * @brief A class for storing HTTP requests. */ @interface OFHTTPRequest: OFObject <OFCopying> { OFURL *_URL; of_http_request_method_t _method; of_http_request_protocol_version_t _protocolVersion; OFDictionary *_headers; OFDataArray *_POSTData; OFString *_MIMEType; OFString *_remoteAddress; } #ifdef OF_HAVE_PROPERTIES @property (copy) OFURL *URL; @property of_http_request_method_t method; @property of_http_request_protocol_version_t protocolVersion; @property (copy) OFDictionary *headers; @property (retain) OFDataArray *POSTData; @property (copy) OFString *MIMEType; @property (copy) OFString *remoteAddress; #endif |
︙ | ︙ | |||
107 108 109 110 111 112 113 | * @brief Returns the URL of the HTTP request. * * @return The URL of the HTTP request */ - (OFURL*)URL; /*! | | | | | | | | 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | * @brief Returns the URL of the HTTP request. * * @return The URL of the HTTP request */ - (OFURL*)URL; /*! * @brief Sets the request method of the HTTP request. * * @param method The request method of the HTTP request */ - (void)setMethod: (of_http_request_method_t)method; /*! * @brief Returns the request method of the HTTP request. * * @return The request method of the HTTP request */ - (of_http_request_method_t)method; /*! * @brief Sets the protocol version of the HTTP request. * * @param protocolVersion The protocol version of the HTTP request */ - (void)setProtocolVersion: (of_http_request_protocol_version_t)protocolVersion; |
︙ | ︙ | |||
205 206 207 208 209 210 211 | /*! * @brief Returns the remote address from which the request originates. * * @return The remote address from which the request originates */ - (OFString*)remoteAddress; @end | > > > > > > > > > > > > > > > > > > > > > > > > | 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 | /*! * @brief Returns the remote address from which the request originates. * * @return The remote address from which the request originates */ - (OFString*)remoteAddress; @end #ifdef __cplusplus extern "C" { #endif /*! * @brief Returns a C string describing the specified request method. * * @param method The request method which should be described as a C string * @return A C string describing the specified request method */ extern const char* of_http_request_method_to_string( of_http_request_method_t method); /*! * @brief Returns the request method for the specified string. * * @param string The string for which the request method should be returned * @return The request method for the specified string */ extern of_http_request_method_t of_http_request_method_from_string( const char *string); #ifdef __cplusplus } #endif |
Modified src/OFHTTPRequest.m from [5824c67d6a] to [e321453562].
︙ | ︙ | |||
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #import "OFHTTPRequest.h" #import "OFString.h" #import "OFURL.h" #import "OFDictionary.h" #import "OFDataArray.h" #import "OFArray.h" #import "autorelease.h" #import "macros.h" #import "OFInvalidFormatException.h" #import "OFOutOfRangeException.h" #import "OFUnsupportedVersionException.h" @implementation OFHTTPRequest + (instancetype)request { return [[[self alloc] init] autorelease]; } + (instancetype)requestWithURL: (OFURL*)URL { return [[[self alloc] initWithURL: URL] autorelease]; } - init { self = [super init]; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #include <string.h> #import "OFHTTPRequest.h" #import "OFString.h" #import "OFURL.h" #import "OFDictionary.h" #import "OFDataArray.h" #import "OFArray.h" #import "autorelease.h" #import "macros.h" #import "OFInvalidFormatException.h" #import "OFOutOfRangeException.h" #import "OFUnsupportedVersionException.h" const char* of_http_request_method_to_string(of_http_request_method_t method) { switch (method) { case OF_HTTP_REQUEST_METHOD_OPTIONS: return "OPTIONS"; case OF_HTTP_REQUEST_METHOD_GET: return "GET"; case OF_HTTP_REQUEST_METHOD_HEAD: return "HEAD"; case OF_HTTP_REQUEST_METHOD_POST: return "POST"; case OF_HTTP_REQUEST_METHOD_PUT: return "PUT"; case OF_HTTP_REQUEST_METHOD_DELETE: return "DELETE"; case OF_HTTP_REQUEST_METHOD_TRACE: return "TRACE"; case OF_HTTP_REQUEST_METHOD_CONNECT: return "CONNECT"; } return NULL; } of_http_request_method_t of_http_request_method_from_string(const char *string) { if (!strcmp(string, "OPTIONS")) return OF_HTTP_REQUEST_METHOD_OPTIONS; if (!strcmp(string, "GET")) return OF_HTTP_REQUEST_METHOD_GET; if (!strcmp(string, "HEAD")) return OF_HTTP_REQUEST_METHOD_HEAD; if (!strcmp(string, "POST")) return OF_HTTP_REQUEST_METHOD_POST; if (!strcmp(string, "PUT")) return OF_HTTP_REQUEST_METHOD_PUT; if (!strcmp(string, "DELETE")) return OF_HTTP_REQUEST_METHOD_DELETE; if (!strcmp(string, "TRACE")) return OF_HTTP_REQUEST_METHOD_TRACE; if (!strcmp(string, "CONNECT")) return OF_HTTP_REQUEST_METHOD_CONNECT; @throw [OFInvalidFormatException exception]; } @implementation OFHTTPRequest + (instancetype)request { return [[[self alloc] init] autorelease]; } + (instancetype)requestWithURL: (OFURL*)URL { return [[[self alloc] initWithURL: URL] autorelease]; } - init { self = [super init]; _method = OF_HTTP_REQUEST_METHOD_GET; _protocolVersion.major = 1; _protocolVersion.minor = 1; return self; } - initWithURL: (OFURL*)URL |
︙ | ︙ | |||
78 79 80 81 82 83 84 | } - copy { OFHTTPRequest *copy = [[OFHTTPRequest alloc] init]; @try { | | | 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | } - copy { OFHTTPRequest *copy = [[OFHTTPRequest alloc] init]; @try { copy->_method = _method; copy->_protocolVersion = _protocolVersion; [copy setURL: _URL]; [copy setHeaders: _headers]; [copy setPOSTData: _POSTData]; [copy setMIMEType: _MIMEType]; [copy setRemoteAddress: _remoteAddress]; } @catch (id e) { |
︙ | ︙ | |||
102 103 104 105 106 107 108 | OFHTTPRequest *request; if (![object isKindOfClass: [OFHTTPRequest class]]) return false; request = object; | | | | 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | OFHTTPRequest *request; if (![object isKindOfClass: [OFHTTPRequest class]]) return false; request = object; if (request->_method != _method || request->_protocolVersion.major != _protocolVersion.major || request->_protocolVersion.minor != _protocolVersion.minor || ![request->_URL isEqual: _URL] || ![request->_headers isEqual: _headers] || ![request->_POSTData isEqual: _POSTData] || ![request->_MIMEType isEqual: _MIMEType] || ![request->_remoteAddress isEqual: _remoteAddress]) return false; return true; } - (uint32_t)hash { uint32_t hash; OF_HASH_INIT(hash); OF_HASH_ADD(hash, _method); OF_HASH_ADD(hash, _protocolVersion.major); OF_HASH_ADD(hash, _protocolVersion.minor); OF_HASH_ADD_HASH(hash, [_URL hash]); OF_HASH_ADD_HASH(hash, [_headers hash]); OF_HASH_ADD_HASH(hash, [_POSTData hash]); OF_HASH_ADD_HASH(hash, [_MIMEType hash]); OF_HASH_ADD_HASH(hash, [_remoteAddress hash]); |
︙ | ︙ | |||
145 146 147 148 149 150 151 | } - (OFURL*)URL { OF_GETTER(_URL, true) } | | | | | | 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 | } - (OFURL*)URL { OF_GETTER(_URL, true) } - (void)setMethod: (of_http_request_method_t)method { _method = method; } - (of_http_request_method_t)method { return _method; } - (void)setProtocolVersion: (of_http_request_protocol_version_t)protocolVersion { if (protocolVersion.major != 1 || protocolVersion.minor > 1) @throw [OFUnsupportedVersionException exceptionWithVersion: [OFString stringWithFormat: @"%u.%u", |
︙ | ︙ | |||
244 245 246 247 248 249 250 | { OF_GETTER(_remoteAddress, true) } - (OFString*)description { void *pool = objc_autoreleasePoolPush(); | | < < < < < < < < < < < < | | | | 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 | { OF_GETTER(_remoteAddress, true) } - (OFString*)description { void *pool = objc_autoreleasePoolPush(); const char *method = of_http_request_method_to_string(_method); OFString *indentedHeaders, *indentedPOSTData, *ret; indentedHeaders = [[_headers description] stringByReplacingOccurrencesOfString: @"\n" withString: @"\n\t"]; indentedPOSTData = [[_POSTData description] stringByReplacingOccurrencesOfString: @"\n" withString: @"\n\t"]; ret = [[OFString alloc] initWithFormat: @"<%@:\n\tURL = %@\n" @"\tMethod = %s\n" @"\tHeaders = %@\n" @"\tPOST data = %@\n" @"\tPOST data MIME type = %@\n" @"\tRemote address = %@\n" @">", [self class], _URL, method, indentedHeaders, indentedPOSTData, _MIMEType, _remoteAddress]; objc_autoreleasePoolPop(pool); return [ret autorelease]; } @end |
Modified src/OFHTTPServer.m from [80673ced7f] to [86738768aa].
︙ | ︙ | |||
287 288 289 290 291 292 293 | OFTimer *_timer; enum { AWAITING_PROLOG, PARSING_HEADERS, SEND_RESPONSE } _state; uint8_t _HTTPMinorVersion; | | | 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 | OFTimer *_timer; enum { AWAITING_PROLOG, PARSING_HEADERS, SEND_RESPONSE } _state; uint8_t _HTTPMinorVersion; of_http_request_method_t _method; OFString *_host, *_path; uint16_t _port; OFMutableDictionary *_headers; size_t _contentLength; OFDataArray *_POSTData; } |
︙ | ︙ | |||
383 384 385 386 387 388 389 | } abort(); } - (bool)parseProlog: (OFString*)line { | | | 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 | } abort(); } - (bool)parseProlog: (OFString*)line { OFString *method; size_t pos; @try { OFString *version = [line substringWithRange: of_range([line length] - 9, 9)]; of_unichar_t tmp; |
︙ | ︙ | |||
407 408 409 410 411 412 413 | return [self sendErrorAndClose: 400]; } pos = [line rangeOfString: @" "].location; if (pos == OF_NOT_FOUND) return [self sendErrorAndClose: 400]; | | | > > > > > | < | < | < | | 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 | return [self sendErrorAndClose: 400]; } pos = [line rangeOfString: @" "].location; if (pos == OF_NOT_FOUND) return [self sendErrorAndClose: 400]; method = [line substringWithRange: of_range(0, pos)]; @try { _method = of_http_request_method_from_string( [method UTF8String]); } @catch (OFInvalidFormatException *e) { return [self sendErrorAndClose: 405]; } if (_method != OF_HTTP_REQUEST_METHOD_GET && _method != OF_HTTP_REQUEST_METHOD_HEAD && _method != OF_HTTP_REQUEST_METHOD_POST) return [self sendErrorAndClose: 405]; @try { _path = [line substringWithRange: of_range(pos + 1, [line length] - pos - 10)]; } @catch (OFOutOfRangeException *e) { return [self sendErrorAndClose: 400]; } |
︙ | ︙ | |||
440 441 442 443 444 445 446 | - (bool)parseHeaders: (OFString*)line { OFString *key, *value; size_t pos; if ([line length] == 0) { | | | < < < < | 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 | - (bool)parseHeaders: (OFString*)line { OFString *key, *value; size_t pos; if ([line length] == 0) { switch (_method) { case OF_HTTP_REQUEST_METHOD_POST:; OFString *tmp; char *buffer; tmp = [_headers objectForKey: @"Content-Length"]; if (tmp == nil) return [self sendErrorAndClose: 411]; |
︙ | ︙ | |||
472 473 474 475 476 477 478 479 480 481 482 483 484 485 | selector: @selector(socket: didReadIntoBuffer: length:exception:)]; [_timer setFireDate: [OFDate dateWithTimeIntervalSinceNow: 5]]; return false; } return true; } pos = [line rangeOfString: @":"].location; if (pos == OF_NOT_FOUND) | > > > | 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 | selector: @selector(socket: didReadIntoBuffer: length:exception:)]; [_timer setFireDate: [OFDate dateWithTimeIntervalSinceNow: 5]]; return false; default: _state = SEND_RESPONSE; break; } return true; } pos = [line rangeOfString: @":"].location; if (pos == OF_NOT_FOUND) |
︙ | ︙ | |||
606 607 608 609 610 611 612 | [URL setPath: path]; [URL setQuery: query]; } else [URL setPath: _path]; request = [OFHTTPRequest requestWithURL: URL]; | | | 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 | [URL setPath: path]; [URL setQuery: query]; } else [URL setPath: _path]; request = [OFHTTPRequest requestWithURL: URL]; [request setMethod: _method]; [request setProtocolVersion: (of_http_request_protocol_version_t){ 1, _HTTPMinorVersion }]; [request setHeaders: _headers]; [request setPOSTData: _POSTData]; [request setRemoteAddress: [_socket remoteAddress]]; response = [[[OFHTTPServerResponse alloc] |
︙ | ︙ |
Modified src/exceptions/OFHTTPRequestFailedException.h from [a02abda95d] to [aaa6f5e687].
︙ | ︙ | |||
20 21 22 23 24 25 26 | # error No sockets available! #endif @class OFHTTPRequest; @class OFHTTPResponse; /*! | | | 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | # error No sockets available! #endif @class OFHTTPRequest; @class OFHTTPResponse; /*! * @brief An exception indicating that an HTTP request failed. */ @interface OFHTTPRequestFailedException: OFException { OFHTTPRequest *_request; OFHTTPResponse *_response; } |
︙ | ︙ |
Modified src/exceptions/OFHTTPRequestFailedException.m from [1241a691b7] to [20d9b200ef].
︙ | ︙ | |||
62 63 64 65 66 67 68 | [_response release]; [super dealloc]; } - (OFString*)description { | | | < < < < < < < < < < | < | | 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | [_response release]; [super dealloc]; } - (OFString*)description { const char *method = of_http_request_method_to_string([_request method]); return [OFString stringWithFormat: @"An HTTP %s request with URL %@ failed with code %d!", method, [_request URL], [_response statusCode]]; } - (OFHTTPRequest*)request { OF_GETTER(_request, false) } |
︙ | ︙ |