@@ -47,19 +47,21 @@ @interface OFHTTPClientRequestHandler: OFObject { OFHTTPClient *_client; OFHTTPRequest *_request; unsigned int _redirects; + id _context; bool _firstLine; OFString *_version; int _status; OFMutableDictionary OF_GENERIC(OFString *, OFString *) *_serverHeaders; } - initWithClient: (OFHTTPClient *)client request: (OFHTTPRequest *)request - redirects: (unsigned int)redirects; + redirects: (unsigned int)redirects + context: (id)context; - (void)start; @end @interface OFHTTPClientResponse: OFHTTPResponse { @@ -203,17 +205,19 @@ @implementation OFHTTPClientRequestHandler - initWithClient: (OFHTTPClient *)client request: (OFHTTPRequest *)request redirects: (unsigned int)redirects + context: (id)context { self = [super init]; @try { _client = [client retain]; _request = [request retain]; _redirects = redirects; + _context = [context retain]; _firstLine = true; _serverHeaders = [[OFMutableDictionary alloc] init]; } @catch (id e) { [self release]; @throw e; @@ -224,10 +228,11 @@ - (void)dealloc { [_client release]; [_request release]; + [_context release]; [_version release]; [_serverHeaders release]; [super dealloc]; } @@ -307,17 +312,18 @@ bool follow; newURL = [OFURL URLWithString: location relativeToURL: URL]; - if ([_client->_delegate respondsToSelector: @selector( - client:shouldFollowRedirect:statusCode:request:response:)]) + if ([_client->_delegate respondsToSelector: @selector(client: + shouldFollowRedirect:statusCode:request:response:context:)]) follow = [_client->_delegate client: _client shouldFollowRedirect: newURL statusCode: _status request: _request - response: response]; + response: response + context: _context]; else { of_http_request_method_t method = [_request method]; /* * 301, 302 and 307 should only redirect with user @@ -377,11 +383,12 @@ [newRequest setHeaders: newHeaders]; _client->_inProgress = false; [_client asyncPerformRequest: newRequest - redirects: _redirects - 1]; + redirects: _redirects - 1 + context: _context]; return; } } if (_status / 100 != 2) @@ -390,14 +397,15 @@ response: response]; _client->_inProgress = false; [_client->_delegate performSelector: @selector(client:didPerformRequest: - response:) + response:context:) withObject: _client withObject: _request withObject: response + withObject: _context afterDelay: 0]; } - (bool)handleFirstLine: (OFString *)line { @@ -436,16 +444,17 @@ @throw [OFInvalidServerReplyException exception]; if ([line length] == 0) { [_serverHeaders makeImmutable]; - if ([_client->_delegate respondsToSelector: - @selector(client:didReceiveHeaders:statusCode:request:)]) + if ([_client->_delegate respondsToSelector: @selector(client: + didReceiveHeaders:statusCode:request:context:)]) [_client->_delegate client: _client didReceiveHeaders: _serverHeaders statusCode: _status - request: _request]; + request: _request + context: _context]; [self performSelector: @selector(createResponseWithSocket:) withObject: socket afterDelay: 0]; @@ -499,11 +508,12 @@ [OFInvalidEncodingException class]]) exception = [OFInvalidServerReplyException exception]; [_client->_delegate client: _client didEncounterException: exception - forRequest: _request]; + forRequest: _request + context: _context]; return false; } @try { if (_firstLine) { @@ -513,11 +523,12 @@ return [self handleServerHeader: line socket: socket]; } @catch (id e) { [_client->_delegate client: _client didEncounterException: e - forRequest: _request]; + forRequest: _request + context: _context]; return false; } } - (size_t)socket: (OFTCPSocket *)socket @@ -527,11 +538,12 @@ exception: (id)exception { if (exception != nil) { [_client->_delegate client: _client didEncounterException: exception - forRequest: _request]; + forRequest: _request + context: _context]; return 0; } [socket asyncReadLineWithTarget: self selector: @selector(socket:didReadLine:context: @@ -557,11 +569,12 @@ return false; } [_client->_delegate client: _client didEncounterException: exception - forRequest: _request]; + forRequest: _request + context: _context]; return 0; } if ((body = [_request body]) != nil) { [socket asyncWriteBuffer: [body items] @@ -606,24 +619,26 @@ length:context:exception:) context: requestString]; } @catch (id e) { [_client->_delegate client: _client didEncounterException: e - forRequest: _request]; + forRequest: _request + context: _context]; return; } } - (void)socketDidConnect: (OFTCPSocket *)socket context: (id)context exception: (id)exception { if ([_client->_delegate respondsToSelector: - @selector(client:didCreateSocket:forRequest:)]) + @selector(client:didCreateSocket:forRequest:context:)]) [_client->_delegate client: _client didCreateSocket: socket - forRequest: _request]; + forRequest: _request + context: _context]; [self performSelector: @selector(handleSocket:) withObject: socket afterDelay: 0]; } @@ -635,11 +650,12 @@ exception: (id)exception { if (exception != nil) { [_client->_delegate client: _client didEncounterException: exception - forRequest: _request]; + forRequest: _request + context: _context]; return false; } if ([response isAtEndOfStream]) { [self freeMemory: buffer]; @@ -686,11 +702,11 @@ length: 512 target: self selector: @selector(throwAwayContent: buffer:length:context: exception:) - context: socket]; + context: socket]; } else { [_client->_lastResponse release]; _client->_lastResponse = nil; [self performSelector: @selector(handleSocket:) @@ -914,17 +930,20 @@ [super dealloc]; } - (void)asyncPerformRequest: (OFHTTPRequest *)request + context: (id)context { [self asyncPerformRequest: request - redirects: 10]; + redirects: 10 + context: context]; } - (void)asyncPerformRequest: (OFHTTPRequest *)request redirects: (unsigned int)redirects + context: (id)context { void *pool = objc_autoreleasePoolPush(); OFURL *URL = [request URL]; OFString *scheme = [URL scheme]; @@ -938,11 +957,12 @@ _inProgress = true; [[[[OFHTTPClientRequestHandler alloc] initWithClient: self request: request - redirects: redirects] autorelease] start]; + redirects: redirects + context: context] autorelease] start]; objc_autoreleasePoolPop(pool); } - (void)close