2525 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2626 */
2727
28+ #if !__has_feature(objc_arc)
29+ #error GCDWebServer requires ARC
30+ #endif
31+
2832#import < TargetConditionals.h>
2933#import < netdb.h>
3034#ifdef __GCDWEBSERVER_ENABLE_TESTING__
@@ -172,7 +176,6 @@ - (void)_readBodyWithRemainingLength:(NSUInteger)length completionBlock:(ReadBod
172176 }
173177
174178 }];
175- ARC_RELEASE (bodyData);
176179}
177180
178181static inline NSUInteger _ScanHexNumber (const void * bytes, NSUInteger size) {
@@ -244,15 +247,8 @@ - (void)_readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCo
244247@implementation GCDWebServerConnection (Write)
245248
246249- (void )_writeData : (NSData *)data withCompletionBlock : (WriteDataCompletionBlock)block {
247- #if !__has_feature(objc_arc)
248- [data retain ];
249- #endif
250250 dispatch_data_t buffer = dispatch_data_create (data.bytes , data.length , kGCDWebServerGCDQueue , ^{
251- #if __has_feature(objc_arc)
252251 [data self ]; // Keeps ARC from releasing data too early
253- #else
254- [data release ];
255- #endif
256252 });
257253 dispatch_write (_socket, buffer, kGCDWebServerGCDQueue , ^(dispatch_data_t remainingData, int error) {
258254
@@ -268,13 +264,15 @@ - (void)_writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)b
268264 }
269265
270266 });
271- ARC_DISPATCH_RELEASE (buffer);
267+ #if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE
268+ dispatch_release (buffer);
269+ #endif
272270}
273271
274272- (void )_writeHeadersWithCompletionBlock : (WriteHeadersCompletionBlock)block {
275273 GWS_DCHECK (_responseMessage);
276274 CFDataRef data = CFHTTPMessageCopySerializedMessage (_responseMessage);
277- [self _writeData: (ARC_BRIDGE NSData *)data withCompletionBlock: block];
275+ [self _writeData: (__bridge NSData *)data withCompletionBlock: block];
278276 CFRelease (data);
279277}
280278
@@ -349,11 +347,7 @@ + (void)initialize {
349347 }
350348 if (_continueData == nil ) {
351349 CFHTTPMessageRef message = CFHTTPMessageCreateResponse (kCFAllocatorDefault , 100 , NULL , kCFHTTPVersion1_1 );
352- #if __has_feature(objc_arc)
353350 _continueData = CFBridgingRelease (CFHTTPMessageCopySerializedMessage (message));
354- #else
355- _continueData = (NSData *)CFHTTPMessageCopySerializedMessage (message);
356- #endif
357351 CFRelease (message);
358352 GWS_DCHECK (_continueData);
359353 }
@@ -362,7 +356,7 @@ + (void)initialize {
362356 }
363357 if (_digestAuthenticationNonce == nil ) {
364358 CFUUIDRef uuid = CFUUIDCreate (kCFAllocatorDefault );
365- _digestAuthenticationNonce = ARC_RETAIN ( GCDWebServerComputeMD5Digest (@" %@ " , ARC_BRIDGE_RELEASE (CFUUIDCreateString (kCFAllocatorDefault , uuid) )));
359+ _digestAuthenticationNonce = GCDWebServerComputeMD5Digest (@" %@ " , CFBridgingRelease (CFUUIDCreateString (kCFAllocatorDefault , uuid)));
366360 CFRelease (uuid);
367361 }
368362}
@@ -376,8 +370,8 @@ - (void)_initializeResponseHeadersWithStatusCode:(NSInteger)statusCode {
376370 _statusCode = statusCode;
377371 _responseMessage = CFHTTPMessageCreateResponse (kCFAllocatorDefault , statusCode, NULL , kCFHTTPVersion1_1 );
378372 CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Connection" ), CFSTR (" Close" ));
379- CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Server" ), (ARC_BRIDGE CFStringRef)_server.serverName );
380- CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Date" ), (ARC_BRIDGE CFStringRef)GCDWebServerFormatRFC822 ([NSDate date ]));
373+ CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Server" ), (__bridge CFStringRef)_server.serverName );
374+ CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Date" ), (__bridge CFStringRef)GCDWebServerFormatRFC822 ([NSDate date ]));
381375}
382376
383377- (void )_startProcessingRequest {
@@ -410,36 +404,36 @@ - (void)_finishProcessingRequest:(GCDWebServerResponse*)response {
410404 if (hasBody && ![response performOpen: &error]) {
411405 GWS_LOG_ERROR (@" Failed opening response body for socket %i : %@ " , _socket, error);
412406 } else {
413- _response = ARC_RETAIN ( response) ;
407+ _response = response;
414408 }
415409 }
416410
417411 if (_response) {
418412 [self _initializeResponseHeadersWithStatusCode: _response.statusCode];
419413 if (_response.lastModifiedDate ) {
420- CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Last-Modified" ), (ARC_BRIDGE CFStringRef)GCDWebServerFormatRFC822 (_response.lastModifiedDate ));
414+ CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Last-Modified" ), (__bridge CFStringRef)GCDWebServerFormatRFC822 (_response.lastModifiedDate ));
421415 }
422416 if (_response.eTag ) {
423- CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" ETag" ), (ARC_BRIDGE CFStringRef)_response.eTag );
417+ CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" ETag" ), (__bridge CFStringRef)_response.eTag );
424418 }
425419 if ((_response.statusCode >= 200 ) && (_response.statusCode < 300 )) {
426420 if (_response.cacheControlMaxAge > 0 ) {
427- CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Cache-Control" ), (ARC_BRIDGE CFStringRef)[NSString stringWithFormat: @" max-age=%i , public" , (int )_response.cacheControlMaxAge]);
421+ CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Cache-Control" ), (__bridge CFStringRef)[NSString stringWithFormat: @" max-age=%i , public" , (int )_response.cacheControlMaxAge]);
428422 } else {
429423 CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Cache-Control" ), CFSTR (" no-cache" ));
430424 }
431425 }
432426 if (_response.contentType != nil ) {
433- CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Content-Type" ), (ARC_BRIDGE CFStringRef)GCDWebServerNormalizeHeaderValue (_response.contentType ));
427+ CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Content-Type" ), (__bridge CFStringRef)GCDWebServerNormalizeHeaderValue (_response.contentType ));
434428 }
435429 if (_response.contentLength != NSUIntegerMax) {
436- CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Content-Length" ), (ARC_BRIDGE CFStringRef)[NSString stringWithFormat: @" %lu " , (unsigned long )_response.contentLength]);
430+ CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Content-Length" ), (__bridge CFStringRef)[NSString stringWithFormat: @" %lu " , (unsigned long )_response.contentLength]);
437431 }
438432 if (_response.usesChunkedTransferEncoding ) {
439433 CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Transfer-Encoding" ), CFSTR (" chunked" ));
440434 }
441435 [_response.additionalHeaders enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL * stop) {
442- CFHTTPMessageSetHeaderFieldValue (_responseMessage, (ARC_BRIDGE CFStringRef)key, (ARC_BRIDGE CFStringRef)obj);
436+ CFHTTPMessageSetHeaderFieldValue (_responseMessage, (__bridge CFStringRef)key, (__bridge CFStringRef)obj);
443437 }];
444438 [self _writeHeadersWithCompletionBlock: ^(BOOL success) {
445439
@@ -524,7 +518,6 @@ - (void)_readChunkedBodyWithInitialData:(NSData*)initialData {
524518 }
525519
526520 }];
527- ARC_RELEASE (chunkData);
528521}
529522
530523- (void )_readRequestHeaders {
@@ -533,23 +526,23 @@ - (void)_readRequestHeaders {
533526 [self _readHeaders: headersData withCompletionBlock: ^(NSData * extraData) {
534527
535528 if (extraData) {
536- NSString * requestMethod = ARC_BRIDGE_RELEASE (CFHTTPMessageCopyRequestMethod (_requestMessage)); // Method verbs are case-sensitive and uppercase
529+ NSString * requestMethod = CFBridgingRelease (CFHTTPMessageCopyRequestMethod (_requestMessage)); // Method verbs are case-sensitive and uppercase
537530 if (_server.shouldAutomaticallyMapHEADToGET && [requestMethod isEqualToString: @" HEAD" ]) {
538531 requestMethod = @" GET" ;
539532 _virtualHEAD = YES ;
540533 }
541- NSDictionary * requestHeaders = ARC_BRIDGE_RELEASE (CFHTTPMessageCopyAllHeaderFields (_requestMessage)); // Header names are case-insensitive but CFHTTPMessageCopyAllHeaderFields() will standardize the common ones
542- NSURL * requestURL = ARC_BRIDGE_RELEASE (CFHTTPMessageCopyRequestURL (_requestMessage));
534+ NSDictionary * requestHeaders = CFBridgingRelease (CFHTTPMessageCopyAllHeaderFields (_requestMessage)); // Header names are case-insensitive but CFHTTPMessageCopyAllHeaderFields() will standardize the common ones
535+ NSURL * requestURL = CFBridgingRelease (CFHTTPMessageCopyRequestURL (_requestMessage));
543536 if (requestURL) {
544537 requestURL = [self rewriteRequestURL: requestURL withMethod: requestMethod headers: requestHeaders];
545538 GWS_DCHECK (requestURL);
546539 }
547- NSString * requestPath = requestURL ? GCDWebServerUnescapeURLString (ARC_BRIDGE_RELEASE (CFURLCopyPath ((CFURLRef)requestURL))) : nil ; // Don't use -[NSURL path] which strips the ending slash
548- NSString * queryString = requestURL ? ARC_BRIDGE_RELEASE (CFURLCopyQueryString ((CFURLRef)requestURL, NULL )) : nil ; // Don't use -[NSURL query] to make sure query is not unescaped;
540+ NSString * requestPath = requestURL ? GCDWebServerUnescapeURLString (CFBridgingRelease (CFURLCopyPath ((CFURLRef)requestURL))) : nil ; // Don't use -[NSURL path] which strips the ending slash
541+ NSString * queryString = requestURL ? CFBridgingRelease (CFURLCopyQueryString ((CFURLRef)requestURL, NULL )) : nil ; // Don't use -[NSURL query] to make sure query is not unescaped;
549542 NSDictionary * requestQuery = queryString ? GCDWebServerParseURLEncodedForm (queryString) : @{};
550543 if (requestMethod && requestURL && requestHeaders && requestPath && requestQuery) {
551544 for (_handler in _server.handlers ) {
552- _request = ARC_RETAIN ( _handler.matchBlock (requestMethod, requestURL, requestHeaders, requestPath, requestQuery) );
545+ _request = _handler.matchBlock (requestMethod, requestURL, requestHeaders, requestPath, requestQuery);
553546 if (_request) {
554547 break ;
555548 }
@@ -604,22 +597,20 @@ - (void)_readRequestHeaders {
604597 }
605598
606599 }];
607- ARC_RELEASE (headersData);
608600}
609601
610602- (id )initWithServer : (GCDWebServer*)server localAddress : (NSData *)localAddress remoteAddress : (NSData *)remoteAddress socket : (CFSocketNativeHandle)socket {
611603 if ((self = [super init ])) {
612- _server = ARC_RETAIN ( server) ;
613- _localAddress = ARC_RETAIN ( localAddress) ;
614- _remoteAddress = ARC_RETAIN ( remoteAddress) ;
604+ _server = server;
605+ _localAddress = localAddress;
606+ _remoteAddress = remoteAddress;
615607 _socket = socket;
616608 GWS_LOG_DEBUG (@" Did open connection on socket %i " , _socket);
617609
618610 [_server willStartConnection: self ];
619611
620612 if (![self open ]) {
621613 close (_socket);
622- ARC_RELEASE (self);
623614 return nil ;
624615 }
625616 _opened = YES ;
@@ -650,26 +641,14 @@ - (void)dealloc {
650641 }
651642
652643 [_server didEndConnection: self ];
653- ARC_RELEASE (_server);
654- ARC_RELEASE (_localAddress);
655- ARC_RELEASE (_remoteAddress);
656644
657645 if (_requestMessage) {
658646 CFRelease (_requestMessage);
659647 }
660- ARC_RELEASE (_request);
661648
662649 if (_responseMessage) {
663650 CFRelease (_responseMessage);
664651 }
665- ARC_RELEASE (_response);
666-
667- #ifdef __GCDWEBSERVER_ENABLE_TESTING__
668- ARC_RELEASE (_requestPath);
669- ARC_RELEASE (_responsePath);
670- #endif
671-
672- ARC_DEALLOC (super);
673652}
674653
675654@end
@@ -681,11 +660,11 @@ - (BOOL)open {
681660 if (_server.recordingEnabled ) {
682661 _connectionIndex = OSAtomicIncrement32 (&_connectionCounter);
683662
684- _requestPath = ARC_RETAIN ( [NSTemporaryDirectory () stringByAppendingPathComponent: [[NSProcessInfo processInfo ] globallyUniqueString ]]) ;
663+ _requestPath = [NSTemporaryDirectory () stringByAppendingPathComponent: [[NSProcessInfo processInfo ] globallyUniqueString ]];
685664 _requestFD = open ([_requestPath fileSystemRepresentation ], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
686665 GWS_DCHECK (_requestFD > 0 );
687666
688- _responsePath = ARC_RETAIN ( [NSTemporaryDirectory () stringByAppendingPathComponent: [[NSProcessInfo processInfo ] globallyUniqueString ]]) ;
667+ _responsePath = [NSTemporaryDirectory () stringByAppendingPathComponent: [[NSProcessInfo processInfo ] globallyUniqueString ]];
689668 _responseFD = open ([_responsePath fileSystemRepresentation ], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
690669 GWS_DCHECK (_responseFD > 0 );
691670 }
0 commit comments