@@ -165,39 +165,39 @@ freeWhenDone: YES]; } @interface OFHTTPServerReply: OFHTTPRequestReply { - OFTCPSocket *sock; - OFHTTPServer *server; - BOOL chunked, headersSent, closed; + OFTCPSocket *_socket; + OFHTTPServer *_server; + BOOL _chunked, _headersSent, _closed; } -- initWithSocket: (OFTCPSocket*)sock +- initWithSocket: (OFTCPSocket*)socket server: (OFHTTPServer*)server; @end @implementation OFHTTPServerReply -- initWithSocket: (OFTCPSocket*)sock_ - server: (OFHTTPServer*)server_ +- initWithSocket: (OFTCPSocket*)socket + server: (OFHTTPServer*)server { self = [super init]; - statusCode = 500; - sock = [sock_ retain]; - server = [server_ retain]; + _statusCode = 500; + _socket = [socket retain]; + _server = [server retain]; return self; } - (void)dealloc { - if (!closed) + if (!_closed) [self close]; - [sock release]; - [server release]; + [_socket release]; + [_server release]; [super dealloc]; } - (void)sendHeaders @@ -206,28 +206,28 @@ OFString *date = [[OFDate date] dateStringWithFormat: @"%a, %d %b %Y %H:%M:%S GMT"]; OFEnumerator *keyEnumerator, *valueEnumerator; OFString *key, *value; - [sock writeFormat: @"HTTP/%@ %d %s\r\n" - @"Server: %@\r\n" - @"Date: %@\r\n", - [self protocolVersionString], statusCode, - status_code_to_string(statusCode), - [server name], date]; - - keyEnumerator = [headers keyEnumerator]; - valueEnumerator = [headers objectEnumerator]; + [_socket writeFormat: @"HTTP/%@ %d %s\r\n" + @"Server: %@\r\n" + @"Date: %@\r\n", + [self protocolVersionString], _statusCode, + status_code_to_string(_statusCode), + [_server name], date]; + + keyEnumerator = [_headers keyEnumerator]; + valueEnumerator = [_headers objectEnumerator]; while ((key = [keyEnumerator nextObject]) != nil && (value = [valueEnumerator nextObject]) != nil) if (![key isEqual: @"Server"] && ![key isEqual: @"Date"]) - [sock writeFormat: @"%@: %@\r\n", key, value]; + [_socket writeFormat: @"%@: %@\r\n", key, value]; - [sock writeString: @"\r\n"]; + [_socket writeString: @"\r\n"]; - headersSent = YES; - chunked = [[headers objectForKey: @"Transfer-Encoding"] + _headersSent = YES; + _chunked = [[_headers objectForKey: @"Transfer-Encoding"] isEqual: @"chunked"]; objc_autoreleasePoolPop(pool); } @@ -234,99 +234,99 @@ - (void)lowlevelWriteBuffer: (const void*)buffer length: (size_t)length { void *pool; - if (!headersSent) + if (!_headersSent) [self sendHeaders]; - if (!chunked) { - [sock writeBuffer: buffer - length: length]; + if (!_chunked) { + [_socket writeBuffer: buffer + length: length]; return; } pool = objc_autoreleasePoolPush(); - [sock writeString: [OFString stringWithFormat: @"%zx\r\n", length]]; + [_socket writeString: [OFString stringWithFormat: @"%zx\r\n", length]]; objc_autoreleasePoolPop(pool); - [sock writeBuffer: buffer - length: length]; - [sock writeBuffer: "\r\n" - length: 2]; + [_socket writeBuffer: buffer + length: length]; + [_socket writeBuffer: "\r\n" + length: 2]; } - (void)close { - if (!headersSent) + if (!_headersSent) [self sendHeaders]; - if (chunked) - [sock writeBuffer: "0\r\n\r\n" - length: 5]; + if (_chunked) + [_socket writeBuffer: "0\r\n\r\n" + length: 5]; - [sock close]; + [_socket close]; - closed = YES; + _closed = YES; } - (int)fileDescriptorForWriting { - return [sock fileDescriptorForWriting]; + return [_socket fileDescriptorForWriting]; } @end @interface OFHTTPServer_Connection: OFObject { - OFTCPSocket *sock; - OFHTTPServer *server; - OFTimer *timer; + OFTCPSocket *_socket; + OFHTTPServer *_server; + OFTimer *_timer; enum { AWAITING_PROLOG, PARSING_HEADERS, SEND_REPLY - } state; - uint8_t HTTPMinorVersion; - of_http_request_type_t requestType; - OFString *host, *path; - uint16_t port; - OFMutableDictionary *headers; - size_t contentLength; - OFDataArray *POSTData; + } _state; + uint8_t _HTTPMinorVersion; + of_http_request_type_t _requestType; + OFString *_host, *_path; + uint16_t _port; + OFMutableDictionary *_headers; + size_t _contentLength; + OFDataArray *_POSTData; } - initWithSocket: (OFTCPSocket*)socket server: (OFHTTPServer*)server; -- (BOOL)socket: (OFTCPSocket*)sock +- (BOOL)socket: (OFTCPSocket*)socket didReadLine: (OFString*)line exception: (OFException*)exception; - (BOOL)parseProlog: (OFString*)line; - (BOOL)parseHeaders: (OFString*)line; -- (BOOL)socket: (OFTCPSocket*)sock +- (BOOL)socket: (OFTCPSocket*)socket didReadIntoBuffer: (const char*)buffer length: (size_t)length exception: (OFException*)exception; - (BOOL)sendErrorAndClose: (short)statusCode; - (void)createReply; @end @implementation OFHTTPServer_Connection -- initWithSocket: (OFTCPSocket*)sock_ - server: (OFHTTPServer*)server_ +- initWithSocket: (OFTCPSocket*)socket + server: (OFHTTPServer*)server { self = [super init]; @try { - sock = [sock_ retain]; - server = [server_ retain]; - timer = [[OFTimer + _socket = [socket retain]; + _server = [server retain]; + _timer = [[OFTimer scheduledTimerWithTimeInterval: 10 - target: sock + target: socket selector: @selector( cancelAsyncRequests) repeats: NO] retain]; - state = AWAITING_PROLOG; + _state = AWAITING_PROLOG; } @catch (id e) { [self release]; @throw e; } @@ -333,40 +333,40 @@ return self; } - (void)dealloc { - [sock release]; - [server release]; - - [timer invalidate]; - [timer release]; - - [host release]; - [path release]; - [headers release]; - [POSTData release]; + [_socket release]; + [_server release]; + + [_timer invalidate]; + [_timer release]; + + [_host release]; + [_path release]; + [_headers release]; + [_POSTData release]; [super dealloc]; } -- (BOOL)socket: (OFTCPSocket*)sock_ +- (BOOL)socket: (OFTCPSocket*)socket didReadLine: (OFString*)line exception: (OFException*)exception { if (line == nil || exception != nil) return NO; @try { - switch (state) { + switch (_state) { case AWAITING_PROLOG: return [self parseProlog: line]; case PARSING_HEADERS: if (![self parseHeaders: line]) return NO; - if (state == SEND_REPLY) { + if (_state == SEND_REPLY) { [self createReply]; return NO; } return YES; @@ -395,11 +395,11 @@ tmp = [version characterAtIndex: 8]; if (tmp < '0' || tmp > '9') return [self sendErrorAndClose: 400]; - HTTPMinorVersion = (uint8_t)(tmp - '0'); + _HTTPMinorVersion = (uint8_t)(tmp - '0'); } @catch (OFOutOfRangeException *e) { return [self sendErrorAndClose: 400]; } pos = [line rangeOfString: @" "].location; @@ -406,31 +406,31 @@ if (pos == OF_NOT_FOUND) return [self sendErrorAndClose: 400]; type = [line substringWithRange: of_range(0, pos)]; if ([type isEqual: @"GET"]) - requestType = OF_HTTP_REQUEST_TYPE_GET; + _requestType = OF_HTTP_REQUEST_TYPE_GET; else if ([type isEqual: @"POST"]) - requestType = OF_HTTP_REQUEST_TYPE_POST; + _requestType = OF_HTTP_REQUEST_TYPE_POST; else if ([type isEqual: @"HEAD"]) - requestType = OF_HTTP_REQUEST_TYPE_HEAD; + _requestType = OF_HTTP_REQUEST_TYPE_HEAD; else return [self sendErrorAndClose: 501]; @try { - path = [line substringWithRange: + _path = [line substringWithRange: of_range(pos + 1, [line length] - pos - 10)]; } @catch (OFOutOfRangeException *e) { return [self sendErrorAndClose: 400]; } - path = [[path stringByDeletingEnclosingWhitespaces] retain]; + _path = [[_path stringByDeletingEnclosingWhitespaces] retain]; - if (![path hasPrefix: @"/"]) + if (![_path hasPrefix: @"/"]) return [self sendErrorAndClose: 400]; - headers = [[OFMutableDictionary alloc] init]; - state = PARSING_HEADERS; + _headers = [[OFMutableDictionary alloc] init]; + _state = PARSING_HEADERS; return YES; } - (BOOL)parseHeaders: (OFString*)line @@ -437,39 +437,39 @@ { OFString *key, *value; size_t pos; if ([line length] == 0) { - switch (requestType) { + switch (_requestType) { case OF_HTTP_REQUEST_TYPE_GET: case OF_HTTP_REQUEST_TYPE_HEAD: - state = SEND_REPLY; + _state = SEND_REPLY; break; case OF_HTTP_REQUEST_TYPE_POST:; OFString *tmp; char *buffer; - tmp = [headers objectForKey: @"Content-Length"]; + tmp = [_headers objectForKey: @"Content-Length"]; if (tmp == nil) return [self sendErrorAndClose: 411]; @try { - contentLength = (size_t)[tmp decimalValue]; + _contentLength = (size_t)[tmp decimalValue]; } @catch (OFInvalidFormatException *e) { return [self sendErrorAndClose: 400]; } buffer = [self allocMemoryWithSize: BUFFER_SIZE]; - POSTData = [[OFDataArray alloc] init]; - - [sock asyncReadIntoBuffer: buffer - length: BUFFER_SIZE - target: self - selector: @selector(socket: - didReadIntoBuffer: - length:exception:)]; - [timer setFireDate: + _POSTData = [[OFDataArray alloc] init]; + + [_socket asyncReadIntoBuffer: buffer + length: BUFFER_SIZE + target: self + selector: @selector(socket: + didReadIntoBuffer: + length:exception:)]; + [_timer setFireDate: [OFDate dateWithTimeIntervalSinceNow: 5]]; return NO; } @@ -485,21 +485,21 @@ of_range(pos + 1, [line length] - pos - 1)]; key = normalized_key([key stringByDeletingTrailingWhitespaces]); value = [value stringByDeletingLeadingWhitespaces]; - [headers setObject: value - forKey: key]; + [_headers setObject: value + forKey: key]; if ([key isEqual: @"Host"]) { pos = [value rangeOfString: @":" options: OF_STRING_SEARCH_BACKWARDS].location; if (pos != OF_NOT_FOUND) { - [host release]; - host = [[value substringWithRange: + [_host release]; + _host = [[value substringWithRange: of_range(0, pos)] retain]; @try { of_range_t range = of_range(pos + 1, [value length] - pos - 1); @@ -507,62 +507,62 @@ substringWithRange: range] decimalValue]; if (portTmp < 1 || portTmp > UINT16_MAX) return [self sendErrorAndClose: 400]; - port = (uint16_t)portTmp; + _port = (uint16_t)portTmp; } @catch (OFInvalidFormatException *e) { return [self sendErrorAndClose: 400]; } } else { - [host release]; - host = [value retain]; - port = 80; + [_host release]; + _host = [value retain]; + _port = 80; } } return YES; } -- (BOOL)socket: (OFTCPSocket*)sock_ +- (BOOL)socket: (OFTCPSocket*)socket didReadIntoBuffer: (const char*)buffer length: (size_t)length exception: (OFException*)exception { - if ([sock_ isAtEndOfStream] || exception != nil) + if ([socket isAtEndOfStream] || exception != nil) return NO; - [POSTData addItems: buffer - count: length]; + [_POSTData addItems: buffer + count: length]; - if ([POSTData count] >= contentLength) { + if ([_POSTData count] >= _contentLength) { @try { [self createReply]; } @catch (OFWriteFailedException *e) { return NO; } return NO; } - [timer setFireDate: [OFDate dateWithTimeIntervalSinceNow: 5]]; + [_timer setFireDate: [OFDate dateWithTimeIntervalSinceNow: 5]]; return YES; } - (BOOL)sendErrorAndClose: (short)statusCode { OFString *date = [[OFDate date] dateStringWithFormat: @"%a, %d %b %Y %H:%M:%S GMT"]; - [sock writeFormat: @"HTTP/1.1 %d %s\r\n" - @"Date: %@\r\n" - @"Server: %@\r\n" - @"\r\n", - statusCode, status_code_to_string(statusCode), date, - [server name]]; - [sock close]; + [_socket writeFormat: @"HTTP/1.1 %d %s\r\n" + @"Date: %@\r\n" + @"Server: %@\r\n" + @"\r\n", + statusCode, status_code_to_string(statusCode), + date, [_server name]]; + [_socket close]; return NO; } - (void)createReply @@ -570,56 +570,57 @@ OFURL *URL; OFHTTPRequest *request; OFHTTPServerReply *reply; size_t pos; - [timer invalidate]; - [timer release]; - timer = nil; + [_timer invalidate]; + [_timer release]; + _timer = nil; - if (host == nil || port == 0) { - if (HTTPMinorVersion > 0) { + if (_host == nil || _port == 0) { + if (_HTTPMinorVersion > 0) { [self sendErrorAndClose: 400]; return; } - host = [[server host] retain]; - port = [server port]; + [_host release]; + _host = [[_server host] retain]; + _port = [_server port]; } URL = [OFURL URL]; [URL setScheme: @"http"]; - [URL setHost: host]; - [URL setPort: port]; - - if ((pos = [path rangeOfString: @"?"].location) != OF_NOT_FOUND) { - OFString *path_, *query; - - path_ = [path substringWithRange: of_range(0, pos)]; - query = [path substringWithRange: + [URL setHost: _host]; + [URL setPort: _port]; + + if ((pos = [_path rangeOfString: @"?"].location) != OF_NOT_FOUND) { + OFString *path, *query; + + path = [_path substringWithRange: of_range(0, pos)]; + query = [_path substringWithRange: of_range(pos + 1, [path length] - pos - 1)]; - [URL setPath: path_]; + [URL setPath: path]; [URL setQuery: query]; } else - [URL setPath: path]; + [URL setPath: _path]; request = [OFHTTPRequest requestWithURL: URL]; - [request setRequestType: requestType]; + [request setRequestType: _requestType]; [request setProtocolVersion: - (of_http_request_protocol_version_t){ 1, HTTPMinorVersion }]; - [request setHeaders: headers]; - [request setPOSTData: POSTData]; - [request setRemoteAddress: [sock remoteAddress]]; + (of_http_request_protocol_version_t){ 1, _HTTPMinorVersion }]; + [request setHeaders: _headers]; + [request setPOSTData: _POSTData]; + [request setRemoteAddress: [_socket remoteAddress]]; reply = [[[OFHTTPServerReply alloc] - initWithSocket: sock - server: server] autorelease]; + initWithSocket: _socket + server: _server] autorelease]; - [[server delegate] server: server - didReceiveRequest: request - reply: reply]; + [[_server delegate] server: _server + didReceiveRequest: request + reply: reply]; } @end @implementation OFHTTPServer + (instancetype)server @@ -629,105 +630,105 @@ - init { self = [super init]; - name = @"OFHTTPServer (ObjFW's HTTP server class " + _name = @"OFHTTPServer (ObjFW's HTTP server class " @")"; return self; } - (void)dealloc { - [host release]; - [listeningSocket release]; - [name release]; + [_host release]; + [_listeningSocket release]; + [_name release]; [super dealloc]; } -- (void)setHost: (OFString*)host_ +- (void)setHost: (OFString*)host { - OF_SETTER(host, host_, YES, 1) + OF_SETTER(_host, host, YES, 1) } - (OFString*)host { - OF_GETTER(host, YES) + OF_GETTER(_host, YES) } -- (void)setPort: (uint16_t)port_ +- (void)setPort: (uint16_t)port { - port = port_; + _port = port; } - (uint16_t)port { - return port; + return _port; } -- (void)setDelegate: (id )delegate_ +- (void)setDelegate: (id )delegate { - delegate = delegate_; + _delegate = delegate; } - (id )delegate { - return delegate; + return _delegate; } -- (void)setName: (OFString*)name_ +- (void)setName: (OFString*)name { - OF_SETTER(name, name_, YES, 1) + OF_SETTER(_name, name, YES, 1) } - (OFString*)name { - OF_GETTER(name, YES) + OF_GETTER(_name, YES) } - (void)start { - if (host == nil || port == 0) + if (_host == nil || _port == 0) @throw [OFInvalidArgumentException exceptionWithClass: [self class] selector: _cmd]; - if (listeningSocket != nil) + if (_listeningSocket != nil) @throw [OFAlreadyConnectedException exceptionWithClass: [self class] - socket: listeningSocket]; - - listeningSocket = [[OFTCPSocket alloc] init]; - [listeningSocket bindToHost: host - port: port]; - [listeningSocket listen]; - - [listeningSocket asyncAcceptWithTarget: self - selector: @selector(OF_socket: - didAcceptSocket: - exception:)]; + socket: _listeningSocket]; + + _listeningSocket = [[OFTCPSocket alloc] init]; + [_listeningSocket bindToHost: _host + port: _port]; + [_listeningSocket listen]; + + [_listeningSocket asyncAcceptWithTarget: self + selector: @selector(OF_socket: + didAcceptSocket: + exception:)]; } - (void)stop { - [listeningSocket cancelAsyncRequests]; - [listeningSocket release]; - listeningSocket = nil; + [_listeningSocket cancelAsyncRequests]; + [_listeningSocket release]; + _listeningSocket = nil; } - (BOOL)OF_socket: (OFTCPSocket*)socket didAcceptSocket: (OFTCPSocket*)clientSocket exception: (OFException*)exception { OFHTTPServer_Connection *connection; if (exception != nil) { - if ([delegate respondsToSelector: + if ([_delegate respondsToSelector: @selector(server:didReceiveExceptionOnListeningSocket:)]) - return [delegate server: self + return [_delegate server: self didReceiveExceptionOnListeningSocket: exception]; return NO; }