Index: src/OFDataArray.m ================================================================== --- src/OFDataArray.m +++ src/OFDataArray.m @@ -188,43 +188,52 @@ - initWithContentsOfURL: (OFURL*)URL { void *pool; OFString *scheme; -#ifdef OF_HAVE_FILES - Class c = [self class]; -#endif - - [self release]; pool = objc_autoreleasePoolPush(); scheme = [URL scheme]; #ifdef OF_HAVE_FILES if ([scheme isEqual: @"file"]) - self = [[c alloc] initWithContentsOfFile: [URL path]]; + self = [self initWithContentsOfFile: [URL path]]; else #endif #ifdef OF_HAVE_SOCKETS if ([scheme isEqual: @"http"] || [scheme isEqual: @"https"]) { OFHTTPClient *client = [OFHTTPClient client]; OFHTTPRequest *request = [OFHTTPRequest requestWithURL: URL]; OFHTTPResponse *response = [client performRequest: request]; + size_t pageSize; + char *buffer; OFDictionary *headers; OFString *contentLength; if ([response statusCode] != 200) @throw [OFHTTPRequestFailedException exceptionWithRequest: request response: response]; - /* - * TODO: This can be optimized by allocating a data array with - * the capacity from the Content-Length header. - */ - self = [[response readDataArrayTillEndOfStream] retain]; + self = [self init]; + + pageSize = [OFSystemInfo pageSize]; + buffer = [self allocMemoryWithSize: pageSize]; + + @try { + while (![response isAtEndOfStream]) { + size_t length; + + length = [response readIntoBuffer: buffer + length: pageSize]; + [self addItems: buffer + count: length]; + } + } @finally { + [self freeMemory: buffer]; + } headers = [response headers]; if ((contentLength = [headers objectForKey: @"Content-Length"]) != nil) if ([self count] !=