Index: src/OFDeflateStream.m ================================================================== --- src/OFDeflateStream.m +++ src/OFDeflateStream.m @@ -774,7 +774,17 @@ #ifndef DEFLATE64 - (bool)lowlevelIsAtEndOfStream { return _atEndOfStream; } + +- (int)fileDescriptorForReading +{ + return [_stream fileDescriptorForReading]; +} + +- (bool)hasDataInReadBuffer +{ + return ([super hasDataInReadBuffer] || [_stream hasDataInReadBuffer]); +} #endif @end Index: src/OFHTTPClient.m ================================================================== --- src/OFHTTPClient.m +++ src/OFHTTPClient.m @@ -236,14 +236,13 @@ - (int)fileDescriptorForReading { return [_socket fileDescriptorForReading]; } -- (size_t)numberOfBytesInReadBuffer +- (bool)hasDataInReadBuffer { - return [super numberOfBytesInReadBuffer] + - [_socket numberOfBytesInReadBuffer]; + return ([super hasDataInReadBuffer] || [_socket hasDataInReadBuffer]); } - (void)close { [_socket release]; Index: src/OFHTTPServer.m ================================================================== --- src/OFHTTPServer.m +++ src/OFHTTPServer.m @@ -203,11 +203,11 @@ [_server release]; [super dealloc]; } -- (void)sendHeaders +- (void)OF_sendHeaders { void *pool = objc_autoreleasePoolPush(); OFString *date = [[OFDate date] dateStringWithFormat: @"%a, %d %b %Y %H:%M:%S GMT"]; OFEnumerator *keyEnumerator, *valueEnumerator; @@ -240,11 +240,11 @@ length: (size_t)length { void *pool; if (!_headersSent) - [self sendHeaders]; + [self OF_sendHeaders]; if (!_chunked) { [_socket writeBuffer: buffer length: length]; return; @@ -261,11 +261,11 @@ } - (void)close { if (!_headersSent) - [self sendHeaders]; + [self OF_sendHeaders]; if (_chunked) [_socket writeBuffer: "0\r\n\r\n" length: 5]; Index: src/OFKernelEventObserver.m ================================================================== --- src/OFKernelEventObserver.m +++ src/OFKernelEventObserver.m @@ -405,11 +405,11 @@ size_t i, count = [_readObjects count]; bool foundInCache = false; for (i = 0; i < count; i++) { if ([objects[i] isKindOfClass: [OFStream class]] && - [objects[i] numberOfBytesInReadBuffer] > 0 && + [objects[i] hasDataInReadBuffer] && ![objects[i] OF_isWaitingForDelimiter]) { void *pool = objc_autoreleasePoolPush(); if ([_delegate respondsToSelector: @selector(objectIsReadyForReading:)]) Index: src/OFSeekableStream.m ================================================================== --- src/OFSeekableStream.m +++ src/OFSeekableStream.m @@ -11,10 +11,12 @@ * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ + +#define OF_SEEKABLE_STREAM_M #include "config.h" #include #include Index: src/OFStream.h ================================================================== --- src/OFStream.h +++ src/OFStream.h @@ -84,10 +84,13 @@ #ifdef OF_HAVE_SOCKETS OFReadyForReadingObserving, OFReadyForWritingObserving, #endif OFCopying> { +#ifndef OF_SEEKABLE_STREAM_M +@private +#endif char *_readBuffer, *_writeBuffer; size_t _readBufferLength, _writeBufferLength; bool _writeBufferEnabled, _blocking, _waitingForDelimiter; } @@ -1039,15 +1042,15 @@ */ - (size_t)writeFormat: (OFConstantString*)format arguments: (va_list)arguments; /*! - * @brief Returns the number of bytes still present in the internal read buffer. + * @brief Returns whether data is present in the internal read buffer. * - * @return The number of bytes still present in the internal read buffer. + * @return Whether data is present in the internal read buffer */ -- (size_t)numberOfBytesInReadBuffer; +- (bool)hasDataInReadBuffer; /*! * @brief Returns whether the stream is in blocking mode. * * @return Whether the stream is in blocking mode Index: src/OFStream.m ================================================================== --- src/OFStream.m +++ src/OFStream.m @@ -1461,13 +1461,13 @@ } return length; } -- (size_t)numberOfBytesInReadBuffer +- (bool)hasDataInReadBuffer { - return _readBufferLength; + return (_readBufferLength > 0); } - (bool)isBlocking { return _blocking;