Fix a bug where requests might erroneously timeout when not using a downloadProgressDelegate
Thanks to Martin Destagnol for his assistance in finding this issue!
Showing
5 changed files
with
24 additions
and
13 deletions
| @@ -566,7 +566,7 @@ static NSError *ASITooMuchRedirectionError; | @@ -566,7 +566,7 @@ static NSError *ASITooMuchRedirectionError; | ||
| 566 | // Prevent timeouts before 128KB* has been sent when the size of data to upload is greater than 128KB* (*32KB on iPhone 3.0 SDK) | 566 | // Prevent timeouts before 128KB* has been sent when the size of data to upload is greater than 128KB* (*32KB on iPhone 3.0 SDK) |
| 567 | // This is to workaround the fact that kCFStreamPropertyHTTPRequestBytesWrittenCount is the amount written to the buffer, not the amount actually sent | 567 | // This is to workaround the fact that kCFStreamPropertyHTTPRequestBytesWrittenCount is the amount written to the buffer, not the amount actually sent |
| 568 | // This workaround prevents erroneous timeouts in low bandwidth situations (eg iPhone) | 568 | // This workaround prevents erroneous timeouts in low bandwidth situations (eg iPhone) |
| 569 | - if (contentLength <= uploadBufferSize || (uploadBufferSize > 0 && totalBytesSent > uploadBufferSize)) { | 569 | + if (totalBytesSent || postLength <= uploadBufferSize || (uploadBufferSize > 0 && totalBytesSent > uploadBufferSize)) { |
| 570 | [self failWithError:ASIRequestTimedOutError]; | 570 | [self failWithError:ASIRequestTimedOutError]; |
| 571 | [self cancelLoad]; | 571 | [self cancelLoad]; |
| 572 | [self setComplete:YES]; | 572 | [self setComplete:YES]; |
| @@ -848,11 +848,6 @@ static NSError *ASITooMuchRedirectionError; | @@ -848,11 +848,6 @@ static NSError *ASITooMuchRedirectionError; | ||
| 848 | if (responseHeaders) { | 848 | if (responseHeaders) { |
| 849 | 849 | ||
| 850 | unsigned long long bytesReadSoFar = totalBytesRead+partialDownloadSize; | 850 | unsigned long long bytesReadSoFar = totalBytesRead+partialDownloadSize; |
| 851 | - | ||
| 852 | - if (bytesReadSoFar > lastBytesRead) { | ||
| 853 | - [self setLastActivityTime:[NSDate date]]; | ||
| 854 | - } | ||
| 855 | - | ||
| 856 | 851 | ||
| 857 | // We're using a progress queue or compatible controller to handle progress | 852 | // We're using a progress queue or compatible controller to handle progress |
| 858 | SEL selector = @selector(incrementDownloadProgressBy:); | 853 | SEL selector = @selector(incrementDownloadProgressBy:); |
| @@ -1365,6 +1360,7 @@ static NSError *ASITooMuchRedirectionError; | @@ -1365,6 +1360,7 @@ static NSError *ASITooMuchRedirectionError; | ||
| 1365 | } else if (bytesRead) { | 1360 | } else if (bytesRead) { |
| 1366 | 1361 | ||
| 1367 | [self setTotalBytesRead:[self totalBytesRead]+bytesRead]; | 1362 | [self setTotalBytesRead:[self totalBytesRead]+bytesRead]; |
| 1363 | + [self setLastActivityTime:[NSDate date]]; | ||
| 1368 | 1364 | ||
| 1369 | // Are we downloading to a file? | 1365 | // Are we downloading to a file? |
| 1370 | if ([self downloadDestinationPath]) { | 1366 | if ([self downloadDestinationPath]) { |
| @@ -97,7 +97,19 @@ | @@ -97,7 +97,19 @@ | ||
| 97 | 97 | ||
| 98 | BOOL success = [[request error] code] == ASIRequestTimedOutErrorType; | 98 | BOOL success = [[request error] code] == ASIRequestTimedOutErrorType; |
| 99 | GHAssertTrue(success,@"Timeout didn't generate the correct error"); | 99 | GHAssertTrue(success,@"Timeout didn't generate the correct error"); |
| 100 | +} | ||
| 101 | + | ||
| 102 | + | ||
| 103 | +// Test fix for a bug that might have caused timeouts when posting data | ||
| 104 | +- (void)testTimeOutWithoutDownloadDelegate | ||
| 105 | +{ | ||
| 106 | + ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:@"http://trails-network.net/Downloads/MemexTrails_1.0b1.zip"]]; | ||
| 107 | + [request setTimeOutSeconds:5]; | ||
| 108 | + [request setShowAccurateProgress:NO]; | ||
| 109 | + [request setPostBody:[NSMutableData dataWithData:[@"Small Body" dataUsingEncoding:NSUTF8StringEncoding]]]; | ||
| 110 | + [request start]; | ||
| 100 | 111 | ||
| 112 | + GHAssertNil([request error],@"Generated an error (most likely a timeout) - this test might fail on high latency connections"); | ||
| 101 | } | 113 | } |
| 102 | 114 | ||
| 103 | 115 | ||
| @@ -782,6 +794,7 @@ | @@ -782,6 +794,7 @@ | ||
| 782 | } | 794 | } |
| 783 | 795 | ||
| 784 | 796 | ||
| 797 | + | ||
| 785 | @end | 798 | @end |
| 786 | 799 | ||
| 787 | 800 |
| @@ -53,10 +53,10 @@ IMPORTANT | @@ -53,10 +53,10 @@ IMPORTANT | ||
| 53 | 53 | ||
| 54 | [networkQueue go]; | 54 | [networkQueue go]; |
| 55 | 55 | ||
| 56 | - while (!complete) { | 56 | + while (!complete) { |
| 57 | [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; | 57 | [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; |
| 58 | - } | 58 | + } |
| 59 | - | 59 | + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; |
| 60 | BOOL success = (progress > 0.95); | 60 | BOOL success = (progress > 0.95); |
| 61 | GHAssertTrue(success,@"Failed to increment progress properly"); | 61 | GHAssertTrue(success,@"Failed to increment progress properly"); |
| 62 | 62 | ||
| @@ -117,7 +117,7 @@ IMPORTANT | @@ -117,7 +117,7 @@ IMPORTANT | ||
| 117 | while (!complete) { | 117 | while (!complete) { |
| 118 | [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; | 118 | [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; |
| 119 | } | 119 | } |
| 120 | - | 120 | + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; |
| 121 | BOOL success = (progress > 0.95); | 121 | BOOL success = (progress > 0.95); |
| 122 | GHAssertTrue(success,@"Failed to increment progress properly"); | 122 | GHAssertTrue(success,@"Failed to increment progress properly"); |
| 123 | 123 | ||
| @@ -141,7 +141,7 @@ IMPORTANT | @@ -141,7 +141,7 @@ IMPORTANT | ||
| 141 | while (!complete) { | 141 | while (!complete) { |
| 142 | [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; | 142 | [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; |
| 143 | } | 143 | } |
| 144 | - | 144 | + [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.25]]; |
| 145 | success = (progress > 0.95); | 145 | success = (progress > 0.95); |
| 146 | GHAssertTrue(success,@"Failed to increment progress properly"); | 146 | GHAssertTrue(success,@"Failed to increment progress properly"); |
| 147 | 147 |
| @@ -34,7 +34,9 @@ | @@ -34,7 +34,9 @@ | ||
| 34 | [request addRequestHeader:@"User-Agent" value:@"ASIHTTPRequest"]; | 34 | [request addRequestHeader:@"User-Agent" value:@"ASIHTTPRequest"]; |
| 35 | 35 | ||
| 36 | [request start]; | 36 | [request start]; |
| 37 | - if ([request responseString]) { | 37 | + if ([request error]) { |
| 38 | + [htmlSource setString:[[request error] localizedDescription]]; | ||
| 39 | + } else if ([request responseString]) { | ||
| 38 | [htmlSource setString:[request responseString]]; | 40 | [htmlSource setString:[request responseString]]; |
| 39 | } | 41 | } |
| 40 | } | 42 | } |
-
Please register or login to post a comment