Added support for third-party logging facilities

This commit is contained in:
Pierre-Olivier Latour
2014-10-13 22:45:07 -07:00
parent 5070e4fc33
commit c45053bc11
15 changed files with 367 additions and 321 deletions
+61 -61
View File
@@ -99,14 +99,14 @@ static int32_t _connectionCounter = 0;
block(YES);
} else {
if (_bytesRead > 0) {
LOG_ERROR(@"No more data available on socket %i", _socket);
GWS_LOG_ERROR(@"No more data available on socket %i", _socket);
} else {
LOG_WARNING(@"No data received from socket %i", _socket);
GWS_LOG_WARNING(@"No data received from socket %i", _socket);
}
block(NO);
}
} else {
LOG_ERROR(@"Error while reading from socket %i: %s (%i)", _socket, strerror(error), error);
GWS_LOG_ERROR(@"Error while reading from socket %i: %s (%i)", _socket, strerror(error), error);
block(NO);
}
}
@@ -115,7 +115,7 @@ static int32_t _connectionCounter = 0;
}
- (void)_readHeaders:(NSMutableData*)headersData withCompletionBlock:(ReadHeadersCompletionBlock)block {
DCHECK(_requestMessage);
GWS_DCHECK(_requestMessage);
[self _readData:headersData withLength:NSUIntegerMax completionBlock:^(BOOL success) {
if (success) {
@@ -128,11 +128,11 @@ static int32_t _connectionCounter = 0;
if (CFHTTPMessageIsHeaderComplete(_requestMessage)) {
block([headersData subdataWithRange:NSMakeRange(length, headersData.length - length)]);
} else {
LOG_ERROR(@"Failed parsing request headers from socket %i", _socket);
GWS_LOG_ERROR(@"Failed parsing request headers from socket %i", _socket);
block(nil);
}
} else {
LOG_ERROR(@"Failed appending request headers data from socket %i", _socket);
GWS_LOG_ERROR(@"Failed appending request headers data from socket %i", _socket);
block(nil);
}
}
@@ -144,7 +144,7 @@ static int32_t _connectionCounter = 0;
}
- (void)_readBodyWithRemainingLength:(NSUInteger)length completionBlock:(ReadBodyCompletionBlock)block {
DCHECK([_request hasBody] && ![_request usesChunkedTransferEncoding]);
GWS_DCHECK([_request hasBody] && ![_request usesChunkedTransferEncoding]);
NSMutableData* bodyData = [[NSMutableData alloc] initWithCapacity:kBodyReadCapacity];
[self _readData:bodyData withLength:length completionBlock:^(BOOL success) {
@@ -159,13 +159,13 @@ static int32_t _connectionCounter = 0;
block(YES);
}
} else {
LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error);
GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error);
block(NO);
}
} else {
LOG_ERROR(@"Unexpected extra content reading request body on socket %i", _socket);
GWS_LOG_ERROR(@"Unexpected extra content reading request body on socket %i", _socket);
block(NO);
DNOT_REACHED();
GWS_DNOT_REACHED();
}
} else {
block(NO);
@@ -185,7 +185,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
}
- (void)_readNextBodyChunk:(NSMutableData*)chunkData completionBlock:(ReadBodyCompletionBlock)block {
DCHECK([_request hasBody] && [_request usesChunkedTransferEncoding]);
GWS_DCHECK([_request hasBody] && [_request usesChunkedTransferEncoding]);
while (1) {
NSRange range = [chunkData rangeOfData:_CRLFData options:0 range:NSMakeRange(0, chunkData.length)];
@@ -205,12 +205,12 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
if ([_request performWriteData:[chunkData subdataWithRange:NSMakeRange(range.location + range.length, length)] error:&error]) {
[chunkData replaceBytesInRange:NSMakeRange(0, range.location + range.length + length + 2) withBytes:NULL length:0];
} else {
LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error);
GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error);
block(NO);
return;
}
} else {
LOG_ERROR(@"Missing terminating CRLF sequence for chunk reading request body on socket %i", _socket);
GWS_LOG_ERROR(@"Missing terminating CRLF sequence for chunk reading request body on socket %i", _socket);
block(NO);
return;
}
@@ -222,7 +222,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
}
}
} else {
LOG_ERROR(@"Invalid chunk length reading request body on socket %i", _socket);
GWS_LOG_ERROR(@"Invalid chunk length reading request body on socket %i", _socket);
block(NO);
return;
}
@@ -258,11 +258,11 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
@autoreleasepool {
if (error == 0) {
DCHECK(remainingData == NULL);
GWS_DCHECK(remainingData == NULL);
[self didWriteBytes:data.bytes length:data.length];
block(YES);
} else {
LOG_ERROR(@"Error while writing to socket %i: %s (%i)", _socket, strerror(error), error);
GWS_LOG_ERROR(@"Error while writing to socket %i: %s (%i)", _socket, strerror(error), error);
block(NO);
}
}
@@ -272,14 +272,14 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
}
- (void)_writeHeadersWithCompletionBlock:(WriteHeadersCompletionBlock)block {
DCHECK(_responseMessage);
GWS_DCHECK(_responseMessage);
CFDataRef data = CFHTTPMessageCopySerializedMessage(_responseMessage);
[self _writeData:(ARC_BRIDGE NSData*)data withCompletionBlock:block];
CFRelease(data);
}
- (void)_writeBodyWithCompletionBlock:(WriteBodyCompletionBlock)block {
DCHECK([_response hasBody]);
GWS_DCHECK([_response hasBody]);
NSError* error = nil;
NSData* data = [_response performReadData:&error];
if (data) {
@@ -289,7 +289,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
size_t hexLength = strlen(hexString);
NSData* chunk = [NSMutableData dataWithLength:(hexLength + 2 + data.length + 2)];
if (chunk == nil) {
LOG_ERROR(@"Failed allocating memory for response body chunk for socket %i: %@", _socket, error);
GWS_LOG_ERROR(@"Failed allocating memory for response body chunk for socket %i: %@", _socket, error);
block(NO);
return;
}
@@ -325,7 +325,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
}
}
} else {
LOG_ERROR(@"Failed reading response body for socket %i: %@", _socket, error);
GWS_LOG_ERROR(@"Failed reading response body for socket %i: %@", _socket, error);
block(NO);
}
}
@@ -339,11 +339,11 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
+ (void)initialize {
if (_CRLFData == nil) {
_CRLFData = [[NSData alloc] initWithBytes:"\r\n" length:2];
DCHECK(_CRLFData);
GWS_DCHECK(_CRLFData);
}
if (_CRLFCRLFData == nil) {
_CRLFCRLFData = [[NSData alloc] initWithBytes:"\r\n\r\n" length:4];
DCHECK(_CRLFCRLFData);
GWS_DCHECK(_CRLFCRLFData);
}
if (_continueData == nil) {
CFHTTPMessageRef message = CFHTTPMessageCreateResponse(kCFAllocatorDefault, 100, NULL, kCFHTTPVersion1_1);
@@ -353,7 +353,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
_continueData = (NSData*)CFHTTPMessageCopySerializedMessage(message);
#endif
CFRelease(message);
DCHECK(_continueData);
GWS_DCHECK(_continueData);
}
if (_lastChunkData == nil) {
_lastChunkData = [[NSData alloc] initWithBytes:"0\r\n\r\n" length:5];
@@ -374,7 +374,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
}
- (void)_startProcessingRequest {
DCHECK(_responseMessage == NULL);
GWS_DCHECK(_responseMessage == NULL);
GCDWebServerResponse* preflightResponse = [self preflightRequest:_request];
if (preflightResponse) {
@@ -388,7 +388,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
- (void)_finishProcessingRequest:(GCDWebServerResponse*)response {
DCHECK(_responseMessage == NULL);
GWS_DCHECK(_responseMessage == NULL);
BOOL hasBody = NO;
if (response) {
@@ -401,7 +401,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
}
NSError* error = nil;
if (hasBody && ![response performOpen:&error]) {
LOG_ERROR(@"Failed opening response body for socket %i: %@", _socket, error);
GWS_LOG_ERROR(@"Failed opening response body for socket %i: %@", _socket, error);
} else {
_response = ARC_RETAIN(response);
}
@@ -458,16 +458,16 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
- (void)_readBodyWithLength:(NSUInteger)length initialData:(NSData*)initialData {
NSError* error = nil;
if (![_request performOpen:&error]) {
LOG_ERROR(@"Failed opening request body for socket %i: %@", _socket, error);
GWS_LOG_ERROR(@"Failed opening request body for socket %i: %@", _socket, error);
[self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
return;
}
if (initialData.length) {
if (![_request performWriteData:initialData error:&error]) {
LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error);
GWS_LOG_ERROR(@"Failed writing request body on socket %i: %@", _socket, error);
if (![_request performClose:&error]) {
LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
}
[self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
return;
@@ -482,7 +482,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
if ([_request performClose:&localError]) {
[self _startProcessingRequest];
} else {
LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
[self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
}
@@ -491,7 +491,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
if ([_request performClose:&error]) {
[self _startProcessingRequest];
} else {
LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
[self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
}
}
@@ -500,7 +500,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
- (void)_readChunkedBodyWithInitialData:(NSData*)initialData {
NSError* error = nil;
if (![_request performOpen:&error]) {
LOG_ERROR(@"Failed opening request body for socket %i: %@", _socket, error);
GWS_LOG_ERROR(@"Failed opening request body for socket %i: %@", _socket, error);
[self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
return;
}
@@ -512,7 +512,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
if ([_request performClose:&localError]) {
[self _startProcessingRequest];
} else {
LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
GWS_LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
[self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
}
@@ -535,7 +535,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
NSURL* requestURL = ARC_BRIDGE_RELEASE(CFHTTPMessageCopyRequestURL(_requestMessage));
if (requestURL) {
requestURL = [self rewriteRequestURL:requestURL withMethod:requestMethod headers:requestHeaders];
DCHECK(requestURL);
GWS_DCHECK(requestURL);
}
NSString* requestPath = requestURL ? GCDWebServerUnescapeURLString(ARC_BRIDGE_RELEASE(CFURLCopyPath((CFURLRef)requestURL))) : nil; // Don't use -[NSURL path] which strips the ending slash
NSString* queryString = requestURL ? ARC_BRIDGE_RELEASE(CFURLCopyQueryString((CFURLRef)requestURL, NULL)) : nil; // Don't use -[NSURL query] to make sure query is not unescaped;
@@ -566,7 +566,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
}];
} else {
LOG_ERROR(@"Unsupported 'Expect' / 'Content-Length' header combination on socket %i", _socket);
GWS_LOG_ERROR(@"Unsupported 'Expect' / 'Content-Length' header combination on socket %i", _socket);
[self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_ExpectationFailed];
}
} else {
@@ -577,7 +577,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
}
}
} else {
LOG_ERROR(@"Unexpected 'Content-Length' header value on socket %i", _socket);
GWS_LOG_ERROR(@"Unexpected 'Content-Length' header value on socket %i", _socket);
[self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_BadRequest];
}
} else {
@@ -585,12 +585,12 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
}
} else {
_request = [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:requestPath query:requestQuery];
DCHECK(_request);
GWS_DCHECK(_request);
[self abortRequest:_request withStatusCode:kGCDWebServerHTTPStatusCode_MethodNotAllowed];
}
} else {
[self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
DNOT_REACHED();
GWS_DNOT_REACHED();
}
} else {
[self abortRequest:nil withStatusCode:kGCDWebServerHTTPStatusCode_InternalServerError];
@@ -606,7 +606,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
_localAddress = ARC_RETAIN(localAddress);
_remoteAddress = ARC_RETAIN(remoteAddress);
_socket = socket;
LOG_DEBUG(@"Did open connection on socket %i", _socket);
GWS_LOG_DEBUG(@"Did open connection on socket %i", _socket);
[_server willStartConnection:self];
@@ -630,7 +630,7 @@ static NSString* _StringFromAddressData(NSData* data) {
if (getnameinfo(addr, addr->sa_len, hostBuffer, sizeof(hostBuffer), serviceBuffer, sizeof(serviceBuffer), NI_NUMERICHOST | NI_NUMERICSERV | NI_NOFQDN) >= 0) {
string = [NSString stringWithFormat:@"%s:%s", hostBuffer, serviceBuffer];
} else {
DNOT_REACHED();
GWS_DNOT_REACHED();
}
return string;
}
@@ -646,9 +646,9 @@ static NSString* _StringFromAddressData(NSData* data) {
- (void)dealloc {
int result = close(_socket);
if (result != 0) {
LOG_ERROR(@"Failed closing socket %i for connection: %s (%i)", _socket, strerror(errno), errno);
GWS_LOG_ERROR(@"Failed closing socket %i for connection: %s (%i)", _socket, strerror(errno), errno);
} else {
LOG_DEBUG(@"Did close connection on socket %i", _socket);
GWS_LOG_DEBUG(@"Did close connection on socket %i", _socket);
}
if (_opened) {
@@ -689,11 +689,11 @@ static NSString* _StringFromAddressData(NSData* data) {
_requestPath = ARC_RETAIN([NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]);
_requestFD = open([_requestPath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
DCHECK(_requestFD > 0);
GWS_DCHECK(_requestFD > 0);
_responsePath = ARC_RETAIN([NSTemporaryDirectory() stringByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]]);
_responseFD = open([_responsePath fileSystemRepresentation], O_CREAT | O_TRUNC | O_WRONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
DCHECK(_responseFD > 0);
GWS_DCHECK(_responseFD > 0);
}
#endif
@@ -701,12 +701,12 @@ static NSString* _StringFromAddressData(NSData* data) {
}
- (void)didReadBytes:(const void*)bytes length:(NSUInteger)length {
LOG_DEBUG(@"Connection received %lu bytes on socket %i", (unsigned long)length, _socket);
GWS_LOG_DEBUG(@"Connection received %lu bytes on socket %i", (unsigned long)length, _socket);
_bytesRead += length;
#ifdef __GCDWEBSERVER_ENABLE_TESTING__
if ((_requestFD > 0) && (write(_requestFD, bytes, length) != (ssize_t)length)) {
LOG_ERROR(@"Failed recording request data: %s (%i)", strerror(errno), errno);
GWS_LOG_ERROR(@"Failed recording request data: %s (%i)", strerror(errno), errno);
close(_requestFD);
_requestFD = 0;
}
@@ -714,12 +714,12 @@ static NSString* _StringFromAddressData(NSData* data) {
}
- (void)didWriteBytes:(const void*)bytes length:(NSUInteger)length {
LOG_DEBUG(@"Connection sent %lu bytes on socket %i", (unsigned long)length, _socket);
GWS_LOG_DEBUG(@"Connection sent %lu bytes on socket %i", (unsigned long)length, _socket);
_bytesWritten += length;
#ifdef __GCDWEBSERVER_ENABLE_TESTING__
if ((_responseFD > 0) && (write(_responseFD, bytes, length) != (ssize_t)length)) {
LOG_ERROR(@"Failed recording response data: %s (%i)", strerror(errno), errno);
GWS_LOG_ERROR(@"Failed recording response data: %s (%i)", strerror(errno), errno);
close(_responseFD);
_responseFD = 0;
}
@@ -732,7 +732,7 @@ static NSString* _StringFromAddressData(NSData* data) {
// https://tools.ietf.org/html/rfc2617
- (GCDWebServerResponse*)preflightRequest:(GCDWebServerRequest*)request {
LOG_DEBUG(@"Connection on socket %i preflighting request \"%@ %@\" with %lu bytes body", _socket, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead);
GWS_LOG_DEBUG(@"Connection on socket %i preflighting request \"%@ %@\" with %lu bytes body", _socket, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead);
GCDWebServerResponse* response = nil;
if (_server.authenticationBasicAccounts) {
__block BOOL authenticated = NO;
@@ -782,12 +782,12 @@ static NSString* _StringFromAddressData(NSData* data) {
}
- (void)processRequest:(GCDWebServerRequest*)request completion:(GCDWebServerCompletionBlock)completion {
LOG_DEBUG(@"Connection on socket %i processing request \"%@ %@\" with %lu bytes body", _socket, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead);
GWS_LOG_DEBUG(@"Connection on socket %i processing request \"%@ %@\" with %lu bytes body", _socket, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead);
@try {
_handler.asyncProcessBlock(request, completion);
}
@catch (NSException* exception) {
LOG_EXCEPTION(exception);
GWS_LOG_EXCEPTION(exception);
}
}
@@ -813,20 +813,20 @@ static inline BOOL _CompareResources(NSString* responseETag, NSString* requestET
newResponse.cacheControlMaxAge = response.cacheControlMaxAge;
newResponse.lastModifiedDate = response.lastModifiedDate;
newResponse.eTag = response.eTag;
DCHECK(newResponse);
GWS_DCHECK(newResponse);
return newResponse;
}
return response;
}
- (void)abortRequest:(GCDWebServerRequest*)request withStatusCode:(NSInteger)statusCode {
DCHECK(_responseMessage == NULL);
DCHECK((statusCode >= 400) && (statusCode < 600));
GWS_DCHECK(_responseMessage == NULL);
GWS_DCHECK((statusCode >= 400) && (statusCode < 600));
[self _initializeResponseHeadersWithStatusCode:statusCode];
[self _writeHeadersWithCompletionBlock:^(BOOL success) {
; // Nothing more to do
}];
LOG_DEBUG(@"Connection aborted with status code %i on socket %i", (int)statusCode, _socket);
GWS_LOG_DEBUG(@"Connection aborted with status code %i on socket %i", (int)statusCode, _socket);
}
- (void)close {
@@ -840,8 +840,8 @@ static inline BOOL _CompareResources(NSString* responseETag, NSString* requestET
success = [[NSFileManager defaultManager] moveItemAtPath:_requestPath toPath:[[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent:name] error:&error];
}
if (!success) {
LOG_ERROR(@"Failed saving recorded request: %@", error);
DNOT_REACHED();
GWS_LOG_ERROR(@"Failed saving recorded request: %@", error);
GWS_DNOT_REACHED();
}
unlink([_requestPath fileSystemRepresentation]);
}
@@ -855,17 +855,17 @@ static inline BOOL _CompareResources(NSString* responseETag, NSString* requestET
success = [[NSFileManager defaultManager] moveItemAtPath:_responsePath toPath:[[[NSFileManager defaultManager] currentDirectoryPath] stringByAppendingPathComponent:name] error:&error];
}
if (!success) {
LOG_ERROR(@"Failed saving recorded response: %@", error);
DNOT_REACHED();
GWS_LOG_ERROR(@"Failed saving recorded response: %@", error);
GWS_DNOT_REACHED();
}
unlink([_responsePath fileSystemRepresentation]);
}
#endif
if (_request) {
LOG_VERBOSE(@"[%@] %@ %i \"%@ %@\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead, (unsigned long)_bytesWritten);
GWS_LOG_VERBOSE(@"[%@] %@ %i \"%@ %@\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, _virtualHEAD ? @"HEAD" : _request.method, _request.path, (unsigned long)_bytesRead, (unsigned long)_bytesWritten);
} else {
LOG_VERBOSE(@"[%@] %@ %i \"(invalid request)\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, (unsigned long)_bytesRead, (unsigned long)_bytesWritten);
GWS_LOG_VERBOSE(@"[%@] %@ %i \"(invalid request)\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, (unsigned long)_bytesRead, (unsigned long)_bytesWritten);
}
}