mirror of
https://github.com/swisspol/GCDWebServer.git
synced 2024-10-07 08:32:16 +08:00
Added -abortRequest:withStatusCode: API
This commit is contained in:
parent
e85a0c9a61
commit
f61ff832ea
@ -43,6 +43,7 @@
|
|||||||
- (void)open;
|
- (void)open;
|
||||||
- (void)didUpdateBytesRead; // Called from arbitrary thread after @totalBytesRead is updated - Default implementation does nothing
|
- (void)didUpdateBytesRead; // Called from arbitrary thread after @totalBytesRead is updated - Default implementation does nothing
|
||||||
- (void)didUpdateBytesWritten; // Called from arbitrary thread after @totalBytesWritten is updated - Default implementation does nothing
|
- (void)didUpdateBytesWritten; // Called from arbitrary thread after @totalBytesWritten is updated - Default implementation does nothing
|
||||||
- (GCDWebServerResponse*)processRequest:(GCDWebServerRequest*)request withBlock:(GCDWebServerProcessBlock)block;
|
- (GCDWebServerResponse*)processRequest:(GCDWebServerRequest*)request withBlock:(GCDWebServerProcessBlock)block; // Only called if the request can be processed
|
||||||
|
- (void)abortRequest:(GCDWebServerRequest*)request withStatusCode:(NSInteger)statusCode; // If request headers was malformed, "request" will be nil
|
||||||
- (void)close;
|
- (void)close;
|
||||||
@end
|
@end
|
||||||
|
@ -62,6 +62,7 @@ static dispatch_queue_t _formatterQueue = NULL;
|
|||||||
GCDWebServerHandler* _handler;
|
GCDWebServerHandler* _handler;
|
||||||
CFHTTPMessageRef _responseMessage;
|
CFHTTPMessageRef _responseMessage;
|
||||||
GCDWebServerResponse* _response;
|
GCDWebServerResponse* _response;
|
||||||
|
NSInteger _statusCode;
|
||||||
}
|
}
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@ -398,6 +399,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)_initializeResponseHeadersWithStatusCode:(NSInteger)statusCode {
|
- (void)_initializeResponseHeadersWithStatusCode:(NSInteger)statusCode {
|
||||||
|
_statusCode = statusCode;
|
||||||
_responseMessage = CFHTTPMessageCreateResponse(kCFAllocatorDefault, statusCode, NULL, kCFHTTPVersion1_1);
|
_responseMessage = CFHTTPMessageCreateResponse(kCFAllocatorDefault, statusCode, NULL, kCFHTTPVersion1_1);
|
||||||
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Connection"), CFSTR("Close"));
|
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Connection"), CFSTR("Close"));
|
||||||
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Server"), (ARC_BRIDGE CFStringRef)[[_server class] serverName]);
|
CFHTTPMessageSetHeaderFieldValue(_responseMessage, CFSTR("Server"), (ARC_BRIDGE CFStringRef)[[_server class] serverName]);
|
||||||
@ -407,16 +409,6 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_abortWithStatusCode:(NSUInteger)statusCode {
|
|
||||||
DCHECK(_responseMessage == NULL);
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
|
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
|
||||||
- (void)_processRequest {
|
- (void)_processRequest {
|
||||||
DCHECK(_responseMessage == NULL);
|
DCHECK(_responseMessage == NULL);
|
||||||
@ -457,7 +449,6 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
[self _writeBodyWithCompletionBlock:^(BOOL successInner) {
|
[self _writeBodyWithCompletionBlock:^(BOOL successInner) {
|
||||||
|
|
||||||
[_response performClose];
|
[_response performClose];
|
||||||
LOG_VERBOSE(@"%@ | %@ \"%@ %@\" %i %lu", self.localAddressString, self.remoteAddressString, _request.method, _request.path, (int)_response.statusCode, (unsigned long)_bytesWritten);
|
|
||||||
|
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
@ -467,7 +458,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
|
|
||||||
}];
|
}];
|
||||||
} else {
|
} else {
|
||||||
[self _abortWithStatusCode:500];
|
[self abortRequest:_request withStatusCode:500];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -476,7 +467,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
NSError* error = nil;
|
NSError* error = nil;
|
||||||
if (![_request performOpen:&error]) {
|
if (![_request performOpen:&error]) {
|
||||||
LOG_ERROR(@"Failed opening request body for socket %i: %@", _socket, error);
|
LOG_ERROR(@"Failed opening request body for socket %i: %@", _socket, error);
|
||||||
[self _abortWithStatusCode:500];
|
[self abortRequest:_request withStatusCode:500];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -486,7 +477,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
if (![_request performClose:&error]) {
|
if (![_request performClose:&error]) {
|
||||||
LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
|
LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
|
||||||
}
|
}
|
||||||
[self _abortWithStatusCode:500];
|
[self abortRequest:_request withStatusCode:500];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
length -= initialData.length;
|
length -= initialData.length;
|
||||||
@ -500,7 +491,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
[self _processRequest];
|
[self _processRequest];
|
||||||
} else {
|
} else {
|
||||||
LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
|
LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
|
||||||
[self _abortWithStatusCode:500];
|
[self abortRequest:_request withStatusCode:500];
|
||||||
}
|
}
|
||||||
|
|
||||||
}];
|
}];
|
||||||
@ -509,7 +500,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
[self _processRequest];
|
[self _processRequest];
|
||||||
} else {
|
} else {
|
||||||
LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
|
LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
|
||||||
[self _abortWithStatusCode:500];
|
[self abortRequest:_request withStatusCode:500];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -518,7 +509,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
NSError* error = nil;
|
NSError* error = nil;
|
||||||
if (![_request performOpen:&error]) {
|
if (![_request performOpen:&error]) {
|
||||||
LOG_ERROR(@"Failed opening request body for socket %i: %@", _socket, error);
|
LOG_ERROR(@"Failed opening request body for socket %i: %@", _socket, error);
|
||||||
[self _abortWithStatusCode:500];
|
[self abortRequest:_request withStatusCode:500];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -530,7 +521,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
[self _processRequest];
|
[self _processRequest];
|
||||||
} else {
|
} else {
|
||||||
LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
|
LOG_ERROR(@"Failed closing request body for socket %i: %@", _socket, error);
|
||||||
[self _abortWithStatusCode:500];
|
[self abortRequest:_request withStatusCode:500];
|
||||||
}
|
}
|
||||||
|
|
||||||
}];
|
}];
|
||||||
@ -581,7 +572,7 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
}];
|
}];
|
||||||
} else {
|
} else {
|
||||||
LOG_ERROR(@"Unsupported 'Expect' / 'Content-Length' header combination on socket %i", _socket);
|
LOG_ERROR(@"Unsupported 'Expect' / 'Content-Length' header combination on socket %i", _socket);
|
||||||
[self _abortWithStatusCode:417];
|
[self abortRequest:_request withStatusCode:417];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (_request.usesChunkedTransferEncoding) {
|
if (_request.usesChunkedTransferEncoding) {
|
||||||
@ -592,16 +583,18 @@ static inline NSUInteger _ScanHexNumber(const void* bytes, NSUInteger size) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
LOG_ERROR(@"Unexpected 'Content-Length' header value on socket %i", _socket);
|
LOG_ERROR(@"Unexpected 'Content-Length' header value on socket %i", _socket);
|
||||||
[self _abortWithStatusCode:400];
|
[self abortRequest:_request withStatusCode:400];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
[self _processRequest];
|
[self _processRequest];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
[self _abortWithStatusCode:405];
|
_request = [[GCDWebServerRequest alloc] initWithMethod:requestMethod url:requestURL headers:requestHeaders path:requestPath query:requestQuery];
|
||||||
|
DCHECK(_request);
|
||||||
|
[self abortRequest:_request withStatusCode:405];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
[self _abortWithStatusCode:500];
|
[self abortRequest:nil withStatusCode:500];
|
||||||
}
|
}
|
||||||
|
|
||||||
}];
|
}];
|
||||||
@ -689,12 +682,23 @@ static NSString* _StringFromAddressData(NSData* data) {
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)abortRequest:(GCDWebServerRequest*)request withStatusCode:(NSInteger)statusCode {
|
||||||
|
DCHECK(_responseMessage == NULL);
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
- (void)close {
|
- (void)close {
|
||||||
int result = close(_socket);
|
int result = close(_socket);
|
||||||
if (result != 0) {
|
if (result != 0) {
|
||||||
LOG_ERROR(@"Failed closing socket %i for connection (%i): %s", _socket, errno, strerror(errno));
|
LOG_ERROR(@"Failed closing socket %i for connection (%i): %s", _socket, errno, strerror(errno));
|
||||||
}
|
}
|
||||||
LOG_DEBUG(@"Did close connection on socket %i", _socket);
|
LOG_DEBUG(@"Did close connection on socket %i", _socket);
|
||||||
|
LOG_VERBOSE(@"[%@] %@ %i \"%@ %@\" (%lu | %lu)", self.localAddressString, self.remoteAddressString, (int)_statusCode, _request.method, _request.path, (unsigned long)_bytesRead, (unsigned long)_bytesWritten);
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
Loading…
Reference in New Issue
Block a user