Index: src/OFHTTPServer.m ================================================================== --- src/OFHTTPServer.m +++ src/OFHTTPServer.m @@ -31,13 +31,16 @@ #import "OFTimer.h" #import "OFAlreadyConnectedException.h" #import "OFInvalidArgumentException.h" #import "OFInvalidFormatException.h" +#import "OFNotConnectedException.h" #import "OFOutOfMemoryException.h" #import "OFOutOfRangeException.h" #import "OFWriteFailedException.h" + +#import "socket_helpers.h" #define BUFFER_SIZE 1024 /* * FIXME: Key normalization replaces headers like "DNT" with "Dnt". @@ -169,11 +172,11 @@ @interface OFHTTPServerResponse: OFHTTPResponse { OFTCPSocket *_socket; OFHTTPServer *_server; - bool _chunked, _headersSent, _closed; + bool _chunked, _headersSent; } - initWithSocket: (OFTCPSocket*)socket server: (OFHTTPServer*)server; @end @@ -191,14 +194,13 @@ return self; } - (void)dealloc { - if (!_closed) - [self close]; + if (_socket != nil) + [self close]; /* includes [_socket release] */ - [_socket release]; [_server release]; [super dealloc]; } @@ -236,10 +238,13 @@ - (void)lowlevelWriteBuffer: (const void*)buffer length: (size_t)length { void *pool; + if (_socket == nil) + @throw [OFNotConnectedException exceptionWithSocket: self]; + if (!_headersSent) [self OF_sendHeaders]; if (!_chunked) { [_socket writeBuffer: buffer @@ -257,24 +262,29 @@ length: 2]; } - (void)close { + if (_socket == nil) + @throw [OFNotConnectedException exceptionWithSocket: self]; + if (!_headersSent) [self OF_sendHeaders]; if (_chunked) [_socket writeBuffer: "0\r\n\r\n" length: 5]; - [_socket close]; - - _closed = true; + [_socket release]; + _socket = nil; } - (int)fileDescriptorForWriting { + if (_socket == nil) + return INVALID_SOCKET; + return [_socket fileDescriptorForWriting]; } @end @interface OFHTTPServer_Connection: OFObject @@ -560,11 +570,10 @@ @"Date: %@\r\n" @"Server: %@\r\n" @"\r\n", statusCode, statusCodeToString(statusCode), date, [_server name]]; - [_socket close]; return false; } - (void)createResponse