25
25
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
26
*/
27
27
28
+ #if !__has_feature(objc_arc)
29
+ #error GCDWebServer requires ARC
30
+ #endif
31
+
28
32
#import < TargetConditionals.h>
29
33
#import < netdb.h>
30
34
#ifdef __GCDWEBSERVER_ENABLE_TESTING__
@@ -172,7 +176,6 @@ - (void)_readBodyWithRemainingLength:(NSUInteger)length completionBlock:(ReadBod
172
176
}
173
177
174
178
}];
175
- ARC_RELEASE (bodyData);
176
179
}
177
180
178
181
static inline NSUInteger _ScanHexNumber (const void * bytes, NSUInteger size) {
@@ -244,15 +247,8 @@ - (void)_readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCo
244
247
@implementation GCDWebServerConnection (Write)
245
248
246
249
- (void )_writeData : (NSData *)data withCompletionBlock : (WriteDataCompletionBlock)block {
247
- #if !__has_feature(objc_arc)
248
- [data retain ];
249
- #endif
250
250
dispatch_data_t buffer = dispatch_data_create (data.bytes , data.length , kGCDWebServerGCDQueue , ^{
251
- #if __has_feature(objc_arc)
252
251
[data self ]; // Keeps ARC from releasing data too early
253
- #else
254
- [data release ];
255
- #endif
256
252
});
257
253
dispatch_write (_socket, buffer, kGCDWebServerGCDQueue , ^(dispatch_data_t remainingData, int error) {
258
254
@@ -268,13 +264,15 @@ - (void)_writeData:(NSData*)data withCompletionBlock:(WriteDataCompletionBlock)b
268
264
}
269
265
270
266
});
271
- ARC_DISPATCH_RELEASE (buffer);
267
+ #if !OS_OBJECT_USE_OBJC_RETAIN_RELEASE
268
+ dispatch_release (buffer);
269
+ #endif
272
270
}
273
271
274
272
- (void )_writeHeadersWithCompletionBlock : (WriteHeadersCompletionBlock)block {
275
273
GWS_DCHECK (_responseMessage);
276
274
CFDataRef data = CFHTTPMessageCopySerializedMessage (_responseMessage);
277
- [self _writeData: (ARC_BRIDGE NSData *)data withCompletionBlock: block];
275
+ [self _writeData: (__bridge NSData *)data withCompletionBlock: block];
278
276
CFRelease (data);
279
277
}
280
278
@@ -349,11 +347,7 @@ + (void)initialize {
349
347
}
350
348
if (_continueData == nil ) {
351
349
CFHTTPMessageRef message = CFHTTPMessageCreateResponse (kCFAllocatorDefault , 100 , NULL , kCFHTTPVersion1_1 );
352
- #if __has_feature(objc_arc)
353
350
_continueData = CFBridgingRelease (CFHTTPMessageCopySerializedMessage (message));
354
- #else
355
- _continueData = (NSData *)CFHTTPMessageCopySerializedMessage (message);
356
- #endif
357
351
CFRelease (message);
358
352
GWS_DCHECK (_continueData);
359
353
}
@@ -362,7 +356,7 @@ + (void)initialize {
362
356
}
363
357
if (_digestAuthenticationNonce == nil ) {
364
358
CFUUIDRef uuid = CFUUIDCreate (kCFAllocatorDefault );
365
- _digestAuthenticationNonce = ARC_RETAIN ( GCDWebServerComputeMD5Digest (@" %@ " , ARC_BRIDGE_RELEASE (CFUUIDCreateString (kCFAllocatorDefault , uuid) )));
359
+ _digestAuthenticationNonce = GCDWebServerComputeMD5Digest (@" %@ " , CFBridgingRelease (CFUUIDCreateString (kCFAllocatorDefault , uuid)));
366
360
CFRelease (uuid);
367
361
}
368
362
}
@@ -376,8 +370,8 @@ - (void)_initializeResponseHeadersWithStatusCode:(NSInteger)statusCode {
376
370
_statusCode = statusCode;
377
371
_responseMessage = CFHTTPMessageCreateResponse (kCFAllocatorDefault , statusCode, NULL , kCFHTTPVersion1_1 );
378
372
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 ]));
381
375
}
382
376
383
377
- (void )_startProcessingRequest {
@@ -410,36 +404,36 @@ - (void)_finishProcessingRequest:(GCDWebServerResponse*)response {
410
404
if (hasBody && ![response performOpen: &error]) {
411
405
GWS_LOG_ERROR (@" Failed opening response body for socket %i : %@ " , _socket, error);
412
406
} else {
413
- _response = ARC_RETAIN ( response) ;
407
+ _response = response;
414
408
}
415
409
}
416
410
417
411
if (_response) {
418
412
[self _initializeResponseHeadersWithStatusCode: _response.statusCode];
419
413
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 ));
421
415
}
422
416
if (_response.eTag ) {
423
- CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" ETag" ), (ARC_BRIDGE CFStringRef)_response.eTag );
417
+ CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" ETag" ), (__bridge CFStringRef)_response.eTag );
424
418
}
425
419
if ((_response.statusCode >= 200 ) && (_response.statusCode < 300 )) {
426
420
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]);
428
422
} else {
429
423
CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Cache-Control" ), CFSTR (" no-cache" ));
430
424
}
431
425
}
432
426
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 ));
434
428
}
435
429
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]);
437
431
}
438
432
if (_response.usesChunkedTransferEncoding ) {
439
433
CFHTTPMessageSetHeaderFieldValue (_responseMessage, CFSTR (" Transfer-Encoding" ), CFSTR (" chunked" ));
440
434
}
441
435
[_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);
443
437
}];
444
438
[self _writeHeadersWithCompletionBlock: ^(BOOL success) {
445
439
@@ -524,7 +518,6 @@ - (void)_readChunkedBodyWithInitialData:(NSData*)initialData {
524
518
}
525
519
526
520
}];
527
- ARC_RELEASE (chunkData);
528
521
}
529
522
530
523
- (void )_readRequestHeaders {
@@ -533,23 +526,23 @@ - (void)_readRequestHeaders {
533
526
[self _readHeaders: headersData withCompletionBlock: ^(NSData * extraData) {
534
527
535
528
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
537
530
if (_server.shouldAutomaticallyMapHEADToGET && [requestMethod isEqualToString: @" HEAD" ]) {
538
531
requestMethod = @" GET" ;
539
532
_virtualHEAD = YES ;
540
533
}
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));
543
536
if (requestURL) {
544
537
requestURL = [self rewriteRequestURL: requestURL withMethod: requestMethod headers: requestHeaders];
545
538
GWS_DCHECK (requestURL);
546
539
}
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;
549
542
NSDictionary * requestQuery = queryString ? GCDWebServerParseURLEncodedForm (queryString) : @{};
550
543
if (requestMethod && requestURL && requestHeaders && requestPath && requestQuery) {
551
544
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);
553
546
if (_request) {
554
547
break ;
555
548
}
@@ -604,22 +597,20 @@ - (void)_readRequestHeaders {
604
597
}
605
598
606
599
}];
607
- ARC_RELEASE (headersData);
608
600
}
609
601
610
602
- (id )initWithServer : (GCDWebServer*)server localAddress : (NSData *)localAddress remoteAddress : (NSData *)remoteAddress socket : (CFSocketNativeHandle)socket {
611
603
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;
615
607
_socket = socket;
616
608
GWS_LOG_DEBUG (@" Did open connection on socket %i " , _socket);
617
609
618
610
[_server willStartConnection: self ];
619
611
620
612
if (![self open ]) {
621
613
close (_socket);
622
- ARC_RELEASE (self);
623
614
return nil ;
624
615
}
625
616
_opened = YES ;
@@ -650,26 +641,14 @@ - (void)dealloc {
650
641
}
651
642
652
643
[_server didEndConnection: self ];
653
- ARC_RELEASE (_server);
654
- ARC_RELEASE (_localAddress);
655
- ARC_RELEASE (_remoteAddress);
656
644
657
645
if (_requestMessage) {
658
646
CFRelease (_requestMessage);
659
647
}
660
- ARC_RELEASE (_request);
661
648
662
649
if (_responseMessage) {
663
650
CFRelease (_responseMessage);
664
651
}
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);
673
652
}
674
653
675
654
@end
@@ -681,11 +660,11 @@ - (BOOL)open {
681
660
if (_server.recordingEnabled ) {
682
661
_connectionIndex = OSAtomicIncrement32 (&_connectionCounter);
683
662
684
- _requestPath = ARC_RETAIN ( [NSTemporaryDirectory () stringByAppendingPathComponent: [[NSProcessInfo processInfo ] globallyUniqueString ]]) ;
663
+ _requestPath = [NSTemporaryDirectory () stringByAppendingPathComponent: [[NSProcessInfo processInfo ] globallyUniqueString ]];
685
664
_requestFD = open ([_requestPath fileSystemRepresentation ], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
686
665
GWS_DCHECK (_requestFD > 0 );
687
666
688
- _responsePath = ARC_RETAIN ( [NSTemporaryDirectory () stringByAppendingPathComponent: [[NSProcessInfo processInfo ] globallyUniqueString ]]) ;
667
+ _responsePath = [NSTemporaryDirectory () stringByAppendingPathComponent: [[NSProcessInfo processInfo ] globallyUniqueString ]];
689
668
_responseFD = open ([_responsePath fileSystemRepresentation ], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
690
669
GWS_DCHECK (_responseFD > 0 );
691
670
}
0 commit comments