Ben Copsey

Fix leak in setting response headers

Alter read buffer size depending on the Content-length header
@@ -520,7 +520,7 @@ static NSError *ASIUnableToCreateRequestError; @@ -520,7 +520,7 @@ static NSError *ASIUnableToCreateRequestError;
520 [cancelledLock unlock]; 520 [cancelledLock unlock];
521 return; 521 return;
522 } 522 }
523 - unsigned long long byteCount = [[(NSNumber *)CFReadStreamCopyProperty (readStream, kCFStreamPropertyHTTPRequestBytesWrittenCount) autorelease] unsignedLongLongValue]; 523 + unsigned long long byteCount = [[(NSNumber *)CFReadStreamCopyProperty(readStream, kCFStreamPropertyHTTPRequestBytesWrittenCount) autorelease] unsignedLongLongValue];
524 524
525 // If this is the first time we've written to the buffer, byteCount will be the size of the buffer (currently seems to be 128KB on both Mac and iPhone) 525 // If this is the first time we've written to the buffer, byteCount will be the size of the buffer (currently seems to be 128KB on both Mac and iPhone)
526 // We will remove this from any progress display, as kCFStreamPropertyHTTPRequestBytesWrittenCount does not tell us how much data has actually be written 526 // We will remove this from any progress display, as kCFStreamPropertyHTTPRequestBytesWrittenCount does not tell us how much data has actually be written
@@ -755,7 +755,9 @@ static NSError *ASIUnableToCreateRequestError; @@ -755,7 +755,9 @@ static NSError *ASIUnableToCreateRequestError;
755 BOOL isAuthenticationChallenge = NO; 755 BOOL isAuthenticationChallenge = NO;
756 CFHTTPMessageRef headers = (CFHTTPMessageRef)CFReadStreamCopyProperty(readStream, kCFStreamPropertyHTTPResponseHeader); 756 CFHTTPMessageRef headers = (CFHTTPMessageRef)CFReadStreamCopyProperty(readStream, kCFStreamPropertyHTTPResponseHeader);
757 if (CFHTTPMessageIsHeaderComplete(headers)) { 757 if (CFHTTPMessageIsHeaderComplete(headers)) {
758 - [self setResponseHeaders:(NSDictionary *)CFHTTPMessageCopyAllHeaderFields(headers)]; 758 + CFDictionaryRef headerFields = CFHTTPMessageCopyAllHeaderFields(headers);
  759 + [self setResponseHeaders:(NSDictionary *)headerFields];
  760 + CFRelease(headerFields);
759 [self setResponseStatusCode:CFHTTPMessageGetResponseStatusCode(headers)]; 761 [self setResponseStatusCode:CFHTTPMessageGetResponseStatusCode(headers)];
760 762
761 // Is the server response a challenge for credentials? 763 // Is the server response a challenge for credentials?
@@ -1058,8 +1060,14 @@ static NSError *ASIUnableToCreateRequestError; @@ -1058,8 +1060,14 @@ static NSError *ASIUnableToCreateRequestError;
1058 return; 1060 return;
1059 } 1061 }
1060 } 1062 }
  1063 + int bufferSize = 2048;
  1064 + if (contentLength > 262144) {
  1065 + bufferSize = 65536;
  1066 + } else if (contentLength > 65536) {
  1067 + bufferSize = 16384;
  1068 + }
1061 1069
1062 - UInt8 buffer[2048]; 1070 + UInt8 buffer[bufferSize];
1063 CFIndex bytesRead = CFReadStreamRead(readStream, buffer, sizeof(buffer)); 1071 CFIndex bytesRead = CFReadStreamRead(readStream, buffer, sizeof(buffer));
1064 1072
1065 1073