123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- #import <Foundation/Foundation.h>
- #import "HTTPResponse.h"
- @class HTTPConnection;
- /**
- * This is an asynchronous version of HTTPFileResponse.
- * It reads data from the given file asynchronously via GCD.
- *
- * It may be overriden to allow custom post-processing of the data that has been read from the file.
- * An example of this is the HTTPDynamicFileResponse class.
- **/
- @interface HTTPAsyncFileResponse : NSObject <HTTPResponse>
- {
- HTTPConnection *connection;
-
- NSString *filePath;
- UInt64 fileLength;
- UInt64 fileOffset; // File offset as pertains to data given to connection
- UInt64 readOffset; // File offset as pertains to data read from file (but maybe not returned to connection)
-
- BOOL aborted;
-
- NSData *data;
-
- int fileFD;
- void *readBuffer;
- NSUInteger readBufferSize; // Malloced size of readBuffer
- NSUInteger readBufferOffset; // Offset within readBuffer where the end of existing data is
- NSUInteger readRequestLength;
- dispatch_queue_t readQueue;
- dispatch_source_t readSource;
- BOOL readSourceSuspended;
- }
- - (id)initWithFilePath:(NSString *)filePath forConnection:(HTTPConnection *)connection;
- - (NSString *)filePath;
- @end
- /**
- * Explanation of Variables (excluding those that are obvious)
- *
- * fileOffset
- * This is the number of bytes that have been returned to the connection via the readDataOfLength method.
- * If 1KB of data has been read from the file, but none of that data has yet been returned to the connection,
- * then the fileOffset variable remains at zero.
- * This variable is used in the calculation of the isDone method.
- * Only after all data has been returned to the connection are we actually done.
- *
- * readOffset
- * Represents the offset of the file descriptor.
- * In other words, the file position indidcator for our read stream.
- * It might be easy to think of it as the total number of bytes that have been read from the file.
- * However, this isn't entirely accurate, as the setOffset: method may have caused us to
- * jump ahead in the file (lseek).
- *
- * readBuffer
- * Malloc'd buffer to hold data read from the file.
- *
- * readBufferSize
- * Total allocation size of malloc'd buffer.
- *
- * readBufferOffset
- * Represents the position in the readBuffer where we should store new bytes.
- *
- * readRequestLength
- * The total number of bytes that were requested from the connection.
- * It's OK if we return a lesser number of bytes to the connection.
- * It's NOT OK if we return a greater number of bytes to the connection.
- * Doing so would disrupt proper support for range requests.
- * If, however, the response is chunked then we don't need to worry about this.
- * Chunked responses inheritly don't support range requests.
- **/
|