Index: generators/TableGenerator.h ================================================================== --- generators/TableGenerator.h +++ generators/TableGenerator.h @@ -40,14 +40,18 @@ size_t _lowercaseTableSize; size_t _titlecaseTableSize; size_t _casefoldingTableSize; size_t _decompositionTableSize; size_t _decompositionCompatTableSize; + enum { + STATE_UNICODE_DATA, + STATE_CASE_FOLDING + } _state; } - (void)parseUnicodeData: (OFHTTPResponse *)response; - (void)parseCaseFolding: (OFHTTPResponse *)response; - (void)applyDecompositionRecursivelyForTable: (OFString *[0x110000])table; - (void)writeFiles; - (void)writeTablesToFile: (OFString *)path; - (void)writeHeaderToFile: (OFString *)path; @end Index: generators/TableGenerator.m ================================================================== --- generators/TableGenerator.m +++ generators/TableGenerator.m @@ -67,33 +67,35 @@ - (void)applicationDidFinishLaunching { OFHTTPRequest *request; [of_stdout writeString: @"Downloading UnicodeData.txt…"]; + _state = STATE_UNICODE_DATA; request = [OFHTTPRequest requestWithURL: [OFURL URLWithString: UNICODE_DATA_URL]]; - [_HTTPClient asyncPerformRequest: request - context: @"UnicodeData"]; + [_HTTPClient asyncPerformRequest: request]; } - (void)client: (OFHTTPClient *)client didPerformRequest: (OFHTTPRequest *)request response: (OFHTTPResponse *)response - context: (id)context { [of_stdout writeLine: @" done"]; - if ([context isEqual: @"UnicodeData"]) + switch (_state) { + case STATE_UNICODE_DATA: [self parseUnicodeData: response]; - else if ([context isEqual: @"CaseFolding"]) + break; + case STATE_CASE_FOLDING: [self parseCaseFolding: response]; + break; + } } -- (void)client: (OFHTTPClient *)client - didEncounterException: (id)exception - request: (OFHTTPRequest *)request - context: (id)context +- (void)client: (OFHTTPClient *)client + didFailWithException: (id)exception + request: (OFHTTPRequest *)request { @throw exception; } - (void)parseUnicodeData: (OFHTTPResponse *)response @@ -168,14 +170,14 @@ [self applyDecompositionRecursivelyForTable: _decompositionCompatTable]; [of_stdout writeLine: @" done"]; [of_stdout writeString: @"Downloading CaseFolding.txt…"]; + _state = STATE_CASE_FOLDING; request = [OFHTTPRequest requestWithURL: [OFURL URLWithString: CASE_FOLDING_URL]]; - [_HTTPClient asyncPerformRequest: request - context: @"CaseFolding"]; + [_HTTPClient asyncPerformRequest: request]; } - (void)parseCaseFolding: (OFHTTPResponse *)response { OFString *line; Index: src/OFHTTPClient.h ================================================================== --- src/OFHTTPClient.h +++ src/OFHTTPClient.h @@ -41,32 +41,26 @@ * @brief A callback which is called when an OFHTTPClient performed a request. * * @param client The OFHTTPClient which performed the request * @param request The request the OFHTTPClient performed * @param response The response to the request performed - * @param context The context object that was passed to - * @ref asyncPerformRequest:context: */ - (void)client: (OFHTTPClient *)client didPerformRequest: (OFHTTPRequest *)request - response: (OFHTTPResponse *)response - context: (nullable id)context; + response: (OFHTTPResponse *)response; /*! * @brief A callback which is called when an OFHTTPClient encountered an * exception while performing a request. * * @param client The client which encountered an exception * @param exception The exception the client encountered * @param request The request during which the client encountered the exception - * @param context The context object that was passed to - * @ref asyncPerformRequest:context: */ -- (void)client: (OFHTTPClient *)client - didEncounterException: (id)exception - request: (OFHTTPRequest *)request - context: (nullable id)context; +- (void)client: (OFHTTPClient *)client + didFailWithException: (id)exception + request: (OFHTTPRequest *)request; @optional /*! * @brief A callback which is called when an OFHTTPClient creates a socket. * @@ -76,50 +70,41 @@ * proxy it should use for this connection. * * @param client The OFHTTPClient that created a socket * @param socket The socket created by the OFHTTPClient * @param request The request for which the socket was created - * @param context The context object that was passed to - * @ref asyncPerformRequest:context: */ - (void)client: (OFHTTPClient *)client didCreateSocket: (OF_KINDOF(OFTCPSocket *))socket - request: (OFHTTPRequest *)request - context: (nullable id)context; + request: (OFHTTPRequest *)request; /*! * @brief A callback which is called when an OFHTTPClient wants to send the * body for a request. * * @param client The OFHTTPClient that wants to send the body * @param requestBody A stream into which the body of the request should be * written * @param request The request for which the OFHTTPClient wants to send the body - * @param context The context object that was passed to - * @ref asyncPerformRequest:context: */ - (void)client: (OFHTTPClient *)client wantsRequestBody: (OFStream *)requestBody - request: (OFHTTPRequest *)request - context: (nullable id)context; + request: (OFHTTPRequest *)request; /*! * @brief A callback which is called when an OFHTTPClient received headers. * * @param client The OFHTTPClient which received the headers * @param headers The headers received * @param statusCode The status code received * @param request The request for which the headers and status code have been * received - * @param context The context object that was passed to - * @ref asyncPerformRequest:context: */ - (void)client: (OFHTTPClient *)client didReceiveHeaders: (OFDictionary OF_GENERIC(OFString *, OFString *) *)headers statusCode: (int)statusCode - request: (OFHTTPRequest *)request - context: (nullable id)context; + request: (OFHTTPRequest *)request; /*! * @brief A callback which is called when an OFHTTPClient wants to follow a * redirect. * @@ -139,20 +124,17 @@ * You are allowed to change the request's headers from this * callback and they will be used when following the redirect * (e.g. to set the cookies for the new URL), however, keep in * mind that this will change the request you originally passed. * @param response The response indicating the redirect - * @param context The context object that was passed to - * @ref asyncPerformRequest:context: * @return A boolean whether the OFHTTPClient should follow the redirect */ - (bool)client: (OFHTTPClient *)client shouldFollowRedirect: (OFURL *)URL statusCode: (int)statusCode request: (OFHTTPRequest *)request - response: (OFHTTPResponse *)response - context: (nullable id)context; + response: (OFHTTPResponse *)response; @end /*! * @class OFHTTPClient OFHTTPClient.h ObjFW/OFHTTPClient.h * @@ -215,66 +197,30 @@ * @return The OFHTTPResponse for the request */ - (OFHTTPResponse *)performRequest: (OFHTTPRequest *)request redirects: (unsigned int)redirects; -/*! - * @brief Synchronously performs the specified HTTP request. - * - * @note You must not change the delegate while a synchronous request is - * running! If you want to change the delegate during the request, - * perform an asynchronous request instead! - * - * @param request The request to perform - * @param context A context object to be passed to the delegate - * @return The OFHTTPResponse for the request - */ -- (OFHTTPResponse *)performRequest: (OFHTTPRequest *)request - context: (nullable id)context; - -/*! - * @brief Synchronously performs the specified HTTP request. - * - * @note You must not change the delegate while a synchronous request is - * running! If you want to change the delegate during the request, - * perform an asynchronous request instead! - * - * @param request The request to perform - * @param redirects The maximum number of redirects after which no further - * attempt is done to follow the redirect, but instead the - * redirect is treated as an OFHTTPResponse - * @param context A context object to be passed to the delegate - * @return The OFHTTPResponse for the request - */ -- (OFHTTPResponse *)performRequest: (OFHTTPRequest *)request - redirects: (unsigned int)redirects - context: (nullable id)context; - /*! * @brief Asynchronously performs the specified HTTP request. * * @param request The request to perform - * @param context A context object to be passed to the delegate */ -- (void)asyncPerformRequest: (OFHTTPRequest *)request - context: (nullable id)context; +- (void)asyncPerformRequest: (OFHTTPRequest *)request; /*! * @brief Asynchronously performs the specified HTTP request. * * @param request The request to perform * @param redirects The maximum number of redirects after which no further * attempt is done to follow the redirect, but instead the * redirect is treated as an OFHTTPResponse - * @param context A context object to be passed to the delegate */ - (void)asyncPerformRequest: (OFHTTPRequest *)request - redirects: (unsigned int)redirects - context: (nullable id)context; + redirects: (unsigned int)redirects; /*! * @brief Closes connections that are still open due to keep-alive. */ - (void)close; @end OF_ASSUME_NONNULL_END Index: src/OFHTTPClient.m ================================================================== --- src/OFHTTPClient.m +++ src/OFHTTPClient.m @@ -55,21 +55,19 @@ { @public OFHTTPClient *_client; OFHTTPRequest *_request; unsigned int _redirects; - id _context; bool _firstLine; OFString *_version; int _status; OFMutableDictionary OF_GENERIC(OFString *, OFString *) *_serverHeaders; } - (instancetype)initWithClient: (OFHTTPClient *)client request: (OFHTTPRequest *)request - redirects: (unsigned int)redirects - context: (id)context; + redirects: (unsigned int)redirects; - (void)start; - (void)closeAndReconnect; @end @interface OFHTTPClientRequestBodyStream: OFStream @@ -103,12 +101,11 @@ OFHTTPResponse *_response; } - (instancetype)initWithClient: (OFHTTPClient *)client; - (OFHTTPResponse *)performRequest: (OFHTTPRequest *)request - redirects: (unsigned int)redirects - context: (id)context; + redirects: (unsigned int)redirects; @end static OFString * constructRequestString(OFHTTPRequest *request) { @@ -254,19 +251,17 @@ @implementation OFHTTPClientRequestHandler - (instancetype)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]; _serverHeaders = [[OFMutableDictionary alloc] init]; } @catch (id e) { [self release]; @throw e; } @@ -276,11 +271,10 @@ - (void)dealloc { [_client release]; [_request release]; - [_context release]; [_version release]; [_serverHeaders release]; [super dealloc]; } @@ -289,13 +283,12 @@ { [_client close]; _client->_inProgress = false; [_client->_delegate client: _client - didEncounterException: exception - request: _request - context: _context]; + didFailWithException: exception + request: _request]; } - (void)createResponseWithSocketOrThrow: (OFTCPSocket *)sock { OFURL *URL = [_request URL]; @@ -347,17 +340,16 @@ newURL = [OFURL URLWithString: location relativeToURL: URL]; if ([_client->_delegate respondsToSelector: @selector(client: - shouldFollowRedirect:statusCode:request:response:context:)]) + shouldFollowRedirect:statusCode:request:response:)]) follow = [_client->_delegate client: _client shouldFollowRedirect: newURL statusCode: _status request: _request - response: response - context: _context]; + response: response]; else follow = defaultShouldFollow( [_request method], _status); if (follow) { @@ -399,12 +391,11 @@ [newRequest setHeaders: newHeaders]; _client->_inProgress = false; [_client asyncPerformRequest: newRequest - redirects: _redirects - 1 - context: _context]; + redirects: _redirects - 1]; return; } } _client->_inProgress = false; @@ -413,15 +404,14 @@ @throw [OFHTTPRequestFailedException exceptionWithRequest: _request response: response]; [_client->_delegate performSelector: @selector(client:didPerformRequest: - response:context:) + response:) withObject: _client withObject: _request withObject: response - withObject: _context afterDelay: 0]; } - (void)createResponseWithSocket: (OFTCPSocket *)sock { @@ -470,16 +460,15 @@ if ([line length] == 0) { [_serverHeaders makeImmutable]; if ([_client->_delegate respondsToSelector: @selector(client: - didReceiveHeaders:statusCode:request:context:)]) + didReceiveHeaders:statusCode:request:)]) [_client->_delegate client: _client didReceiveHeaders: _serverHeaders statusCode: _status - request: _request - context: _context]; + request: _request]; [sock setDelegate: nil]; [self performSelector: @selector(createResponseWithSocket:) withObject: sock @@ -582,16 +571,14 @@ OFStream *requestBody = [[[OFHTTPClientRequestBodyStream alloc] initWithHandler: self socket: stream] autorelease]; if ([_client->_delegate respondsToSelector: - @selector(client:wantsRequestBody:request:context:)]) + @selector(client:wantsRequestBody:request:)]) [_client->_delegate client: _client wantsRequestBody: requestBody - request: _request - context: _context]; - + request: _request]; } else [stream asyncReadLine]; return nil; } @@ -626,15 +613,14 @@ [self raiseException: exception]; return; } if ([_client->_delegate respondsToSelector: - @selector(client:didCreateSocket:request:context:)]) + @selector(client:didCreateSocket:request:)]) [_client->_delegate client: _client didCreateSocket: sock - request: _request - context: _context]; + request: _request]; [self performSelector: @selector(handleSocket:) withObject: sock afterDelay: 0]; } @@ -662,10 +648,12 @@ [_client->_lastURL release]; _client->_lastURL = nil; [_client->_lastResponse release]; _client->_lastResponse = nil; + + [sock setDelegate: self]; [self performSelector: @selector(handleSocket:) withObject: sock afterDelay: 0]; } else @@ -1041,41 +1029,36 @@ [super dealloc]; } - (OFHTTPResponse *)performRequest: (OFHTTPRequest *)request redirects: (unsigned int)redirects - context: (id)context { [_client asyncPerformRequest: request - redirects: redirects - context: context]; + redirects: redirects]; [[OFRunLoop currentRunLoop] run]; return _response; } - (void)client: (OFHTTPClient *)client didPerformRequest: (OFHTTPRequest *)request response: (OFHTTPResponse *)response - context: (id)context { [[OFRunLoop currentRunLoop] stop]; [_response release]; _response = [response retain]; [_delegate client: client didPerformRequest: request - response: response - context: context]; + response: response]; } -- (void)client: (OFHTTPClient *)client - didEncounterException: (id)exception - request: (OFHTTPRequest *)request - context: (id)context +- (void)client: (OFHTTPClient *)client + didFailWithException: (id)exception + request: (OFHTTPRequest *)request { /* * Restore the delegate - we're giving up, but not reaching the release * of the autorelease pool that contains us, so resetting it via * -[dealloc] might be too late. @@ -1086,63 +1069,55 @@ } - (void)client: (OFHTTPClient *)client didCreateSocket: (OF_KINDOF(OFTCPSocket *))sock request: (OFHTTPRequest *)request - context: (id)context { if ([_delegate respondsToSelector: - @selector(client:didCreateSocket:request:context:)]) + @selector(client:didCreateSocket:request:)]) [_delegate client: client didCreateSocket: sock - request: request - context: context]; + request: request]; } - (void)client: (OFHTTPClient *)client wantsRequestBody: (OFStream *)body request: (OFHTTPRequest *)request - context: (id)context { if ([_delegate respondsToSelector: - @selector(client:wantsRequestBody:request:context:)]) + @selector(client:wantsRequestBody:request:)]) [_delegate client: client wantsRequestBody: body - request: request - context: context]; + request: request]; } - (void)client: (OFHTTPClient *)client didReceiveHeaders: (OFDictionary OF_GENERIC(OFString *, OFString *) *)headers statusCode: (int)statusCode request: (OFHTTPRequest *)request - context: (id)context { if ([_delegate respondsToSelector: - @selector(client:didReceiveHeaders:statusCode:request:context:)]) + @selector(client:didReceiveHeaders:statusCode:request:)]) [_delegate client: client didReceiveHeaders: headers statusCode: statusCode - request: request - context: context]; + request: request]; } - (bool)client: (OFHTTPClient *)client shouldFollowRedirect: (OFURL *)URL statusCode: (int)statusCode request: (OFHTTPRequest *)request response: (OFHTTPResponse *)response - context: (id)context { if ([_delegate respondsToSelector: @selector(client: - shouldFollowRedirect:statusCode:request:response:context:)]) + shouldFollowRedirect:statusCode:request:response:)]) return [_delegate client: client shouldFollowRedirect: URL statusCode: statusCode request: request - response: response - context: context]; + response: response]; else return defaultShouldFollow([request method], statusCode); } @end @@ -1163,60 +1138,38 @@ } - (OFHTTPResponse *)performRequest: (OFHTTPRequest *)request { return [self performRequest: request - redirects: REDIRECTS_DEFAULT - context: nil]; + redirects: REDIRECTS_DEFAULT]; } - (OFHTTPResponse *)performRequest: (OFHTTPRequest *)request redirects: (unsigned int)redirects { - return [self performRequest: request - redirects: redirects - context: nil]; -} - -- (OFHTTPResponse *)performRequest: (OFHTTPRequest *)request - context: (id)context -{ - return [self performRequest: request - redirects: REDIRECTS_DEFAULT - context: context]; -} - -- (OFHTTPResponse *)performRequest: (OFHTTPRequest *)request - redirects: (unsigned int)redirects - context: (id)context -{ void *pool = objc_autoreleasePoolPush(); OFHTTPClient_SyncPerformer *syncPerformer = [[[OFHTTPClient_SyncPerformer alloc] initWithClient: self] autorelease]; OFHTTPResponse *response = [syncPerformer performRequest: request - redirects: redirects - context: context]; + redirects: redirects]; [response retain]; objc_autoreleasePoolPop(pool); return [response autorelease]; } - (void)asyncPerformRequest: (OFHTTPRequest *)request - context: (id)context { [self asyncPerformRequest: request - redirects: REDIRECTS_DEFAULT - context: context]; + redirects: REDIRECTS_DEFAULT]; } - (void)asyncPerformRequest: (OFHTTPRequest *)request redirects: (unsigned int)redirects - context: (id)context { void *pool = objc_autoreleasePoolPush(); OFURL *URL = [request URL]; OFString *scheme = [URL scheme]; @@ -1230,12 +1183,11 @@ _inProgress = true; [[[[OFHTTPClientRequestHandler alloc] initWithClient: self request: request - redirects: redirects - context: context] autorelease] start]; + redirects: redirects] autorelease] start]; objc_autoreleasePoolPop(pool); } - (void)close Index: tests/OFHTTPClientTests.m ================================================================== --- tests/OFHTTPClientTests.m +++ tests/OFHTTPClientTests.m @@ -106,19 +106,17 @@ @implementation TestsAppDelegate (OFHTTPClientTests) - (void)client: (OFHTTPClient *)client wantsRequestBody: (OFStream *)body request: (OFHTTPRequest *)request - context: (id)context { [body writeString: @"Hello"]; } - (void)client: (OFHTTPClient *)client didPerformRequest: (OFHTTPRequest *)request response: (OFHTTPResponse *)response_ - context: (id)context { response = [response_ retain]; [[OFRunLoop mainRunLoop] stop]; } @@ -149,12 +147,11 @@ (client = [OFHTTPClient client]) && R([client setDelegate: self]) && (request = [OFHTTPRequest requestWithURL: URL]) && R([request setHeaders: [OFDictionary dictionaryWithObject: @"5" forKey: @"Content-Length"]]) && - R([client asyncPerformRequest: request - context: nil])) + R([client asyncPerformRequest: request])) [[OFRunLoop mainRunLoop] runUntilDate: [OFDate dateWithTimeIntervalSinceNow: 2]]; [response autorelease]; Index: utils/ofhttp/OFHTTP.m ================================================================== --- utils/ofhttp/OFHTTP.m +++ utils/ofhttp/OFHTTP.m @@ -58,12 +58,12 @@ { OFArray OF_GENERIC(OFString *) *_URLs; size_t _URLIndex; int _errorCode; OFString *_outputPath, *_currentFileName; - bool _continue, _force, _detectFileName, _detectedFileName; - bool _quiet, _verbose, _insecure; + bool _continue, _force, _detectFileName, _detectFileNameRequest; + bool _detectedFileName, _quiet, _verbose, _insecure; OFStream *_body; of_http_request_method_t _method; OFMutableDictionary *_clientHeaders; OFHTTPClient *_HTTPClient; char *_buffer; @@ -513,21 +513,19 @@ } - (void)client: (OFHTTPClient *)client didCreateSocket: (OF_KINDOF(OFTCPSocket *))sock request: (OFHTTPRequest *)request - context: (id)context { if (_insecure && [sock respondsToSelector: @selector(setCertificateVerificationEnabled:)]) [sock setCertificateVerificationEnabled: false]; } - (void)client: (OFHTTPClient *)client wantsRequestBody: (OFStream *)body request: (OFHTTPRequest *)request - context: (id)context { /* TODO: Do asynchronously and print status */ while (![_body isAtEndOfStream]) { char buffer[4096]; size_t length; @@ -542,11 +540,10 @@ - (bool)client: (OFHTTPClient *)client shouldFollowRedirect: (OFURL *)URL statusCode: (int)statusCode request: (OFHTTPRequest *)request response: (OFHTTPResponse *)response - context: (id)context { if (_verbose) { void *pool = objc_autoreleasePoolPush(); OFDictionary OF_GENERIC(OFString *, OFString *) *headers = [response headers]; @@ -567,14 +564,13 @@ [of_stdout writeFormat: @"☇ %@", [URL string]]; return true; } -- (void)client: (OFHTTPClient *)client - didEncounterException: (id)e - request: (OFHTTPRequest *)request - context: (id)context +- (void)client: (OFHTTPClient *)client + didFailWithException: (id)e + request: (OFHTTPRequest *)request { if ([e isKindOfClass: [OFResolveHostFailedException class]]) { if (!_quiet) [of_stdout writeString: @"\n"]; @@ -713,11 +709,10 @@ - (void)client: (OFHTTPClient *)client didReceiveHeaders: (OFDictionary OF_GENERIC(OFString *, OFString *) *)headers statusCode: (int)statusCode request: (OFHTTPRequest *)request - context: (id)context { if (!_quiet) { OFString *lengthString = [headers objectForKey: @"Content-Length"]; OFString *type = [headers objectForKey: @"Content-Type"]; @@ -803,13 +798,12 @@ } - (void)client: (OFHTTPClient *)client didPerformRequest: (OFHTTPRequest *)request response: (OFHTTPResponse *)response - context: (id)context { - if ([context isEqual: @"detectFileName"]) { + if (_detectFileNameRequest) { _currentFileName = [fileNameFromContentDisposition( [[response headers] objectForKey: @"Content-Disposition"]) copy]; _detectedFileName = true; @@ -928,12 +922,12 @@ request = [OFHTTPRequest requestWithURL: URL]; [request setHeaders: clientHeaders]; [request setMethod: OF_HTTP_REQUEST_METHOD_HEAD]; - [_HTTPClient asyncPerformRequest: request - context: @"detectFileName"]; + _detectFileNameRequest = true; + [_HTTPClient asyncPerformRequest: request]; return; } [_currentFileName release]; _currentFileName = nil; @@ -969,14 +963,14 @@ request = [OFHTTPRequest requestWithURL: URL]; [request setHeaders: clientHeaders]; [request setMethod: _method]; - [_HTTPClient asyncPerformRequest: request - context: nil]; + _detectFileNameRequest = false; + [_HTTPClient asyncPerformRequest: request]; return; next: [self performSelector: @selector(downloadNextURL) afterDelay: 0]; } @end