Fix leak in setting response headers
Alter read buffer size depending on the Content-length header
Showing
1 changed file
with
12 additions
and
4 deletions
| @@ -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? |
| @@ -1028,7 +1030,7 @@ static NSError *ASIUnableToCreateRequestError; | @@ -1028,7 +1030,7 @@ static NSError *ASIUnableToCreateRequestError; | ||
| 1028 | 1030 | ||
| 1029 | 1031 | ||
| 1030 | - (void)handleNetworkEvent:(CFStreamEventType)type | 1032 | - (void)handleNetworkEvent:(CFStreamEventType)type |
| 1031 | -{ | 1033 | +{ |
| 1032 | // Dispatch the stream events. | 1034 | // Dispatch the stream events. |
| 1033 | switch (type) { | 1035 | switch (type) { |
| 1034 | case kCFStreamEventHasBytesAvailable: | 1036 | case kCFStreamEventHasBytesAvailable: |
| @@ -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 |
-
Please register or login to post a comment