From 6bd89af00c442ae5a9bee9df9b65f75deef49b46 Mon Sep 17 00:00:00 2001 From: grittymindy Date: Fri, 13 Nov 2015 17:14:37 +0800 Subject: [PATCH 1/5] fix as cancel crash --- Classes/ASIHTTPRequest.m | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/Classes/ASIHTTPRequest.m b/Classes/ASIHTTPRequest.m index cb6bbeea..b9374d2d 100644 --- a/Classes/ASIHTTPRequest.m +++ b/Classes/ASIHTTPRequest.m @@ -2098,14 +2098,20 @@ - (void)failWithError:(NSError *)theError return; } - // If we have cached data, use it and ignore the error when using ASIFallbackToCacheIfLoadFailsCachePolicy - if ([self downloadCache] && ([self cachePolicy] & ASIFallbackToCacheIfLoadFailsCachePolicy)) { - if ([[self downloadCache] canUseCachedDataForRequest:self]) { - [self useDataFromCache]; - return; - } - } - + + //Use possible cached data ONLY when the request is not manually cancelled. + //`useDataFromCache` will mark the request as finished. If we are not in progress, we can't notify the queue we've finished(doing so can cause a crash later on). + // It's similar to https://github.com/jogu/asi-http-request/commit/887fcad0f77e9717f003273612804a9b9012a140 + if(theError != ASIRequestCancelledError){ + // If we have cached data, use it and ignore the error when using ASIFallbackToCacheIfLoadFailsCachePolicy + if ([self downloadCache] && ([self cachePolicy] & ASIFallbackToCacheIfLoadFailsCachePolicy)) { + if ([[self downloadCache] canUseCachedDataForRequest:self]) { + [self useDataFromCache]; + return; + } + } + } + [self setError:theError]; From 94f0e052e0835dcf5b222a712d5cf8211a3b6492 Mon Sep 17 00:00:00 2001 From: mindy Date: Mon, 16 Nov 2015 18:17:21 +0800 Subject: [PATCH 2/5] Update README.textile --- README.textile | 33 +++++---------------------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/README.textile b/README.textile index 7fe1f908..6f639f90 100644 --- a/README.textile +++ b/README.textile @@ -1,32 +1,9 @@ -ASIHTTPRequest is an easy to use wrapper around the CFNetwork API that makes some of the more tedious aspects of communicating with web servers easier. It is written in Objective-C and works in both Mac OS X and iPhone applications. +This fixes occasional crash when you cancel an ASIHTTPRequest. -It is suitable performing basic HTTP requests and interacting with REST-based services (GET / POST / PUT / DELETE). The included ASIFormDataRequest subclass makes it easy to submit POST data and files using multipart/form-data. -It provides: -* A straightforward interface for submitting data to and fetching data from webservers -* Download data to memory or directly to a file on disk -* Submit files on local drives as part of POST data, compatible with the HTML file input mechanism -* Stream request bodies directly from disk to the server, to conserve memory -* Resume for partial downloads -* Easy access to request and response HTTP headers -* Progress delegates (NSProgressIndicators and UIProgressViews) to show information about download AND upload progress -* Auto-magic management of upload and download progress indicators for operation queues -* Basic, Digest + NTLM authentication support, credentials are automatically re-used for the duration of a session, and can be stored for later in the Keychain. -* Cookie support -* [NEW] Requests can continue to run when your app moves to the background (iOS 4+) -* GZIP support for response data AND request bodies -* The included ASIDownloadCache class lets requests transparently cache responses, and allow requests for cached data to succeed even when there is no network available -* [NEW] ASIWebPageRequest - download complete webpages, including external resources like images and stylesheets. Pages of any size can be indefinitely cached, and displayed in a UIWebview / WebView even when you have no network connection. -* Easy to use support for Amazon S3 - no need to fiddle around signing requests yourself! -* Full support for Rackspace Cloud Files -* [NEW] Client certificates support -* Supports manual and auto-detected proxies, authenticating proxies, and PAC file auto-configuration. The built-in login dialog lets your iPhone application work transparently with authenticating proxies without any additional effort. -* Bandwidth throttling support -* Support for persistent connections -* Supports synchronous & asynchronous requests -* Get notifications about changes in your request state via delegation or [NEW] blocks (Mac OS X 10.6, iOS 4 and above) -* Comes with a broad range of unit tests +The crash can be reproduced when you cancel a request that satisfies: -ASIHTTPRequest is compatible with Mac OS 10.5 or later, and iOS 3.0 or later. + 1. currently waiting in queue, not been started yet + 2. there is valid cached data for this request in downloadCache -Documentation is available "here":http://allseeing-i.com/ASIHTTPRequest. \ No newline at end of file +The fix is similar to jogu@887fcad. That's, avoid calling markAsFinished unless we're in progress. From ac741c971e3b22ab3576b2da910446af7836c20c Mon Sep 17 00:00:00 2001 From: mindy Date: Mon, 16 Nov 2015 18:17:30 +0800 Subject: [PATCH 3/5] Update README.textile --- README.textile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.textile b/README.textile index 6f639f90..f565544d 100644 --- a/README.textile +++ b/README.textile @@ -3,7 +3,7 @@ This fixes occasional crash when you cancel an ASIHTTPRequest. The crash can be reproduced when you cancel a request that satisfies: - 1. currently waiting in queue, not been started yet + 1. currently waiting in queue, not been started yet 2. there is valid cached data for this request in downloadCache The fix is similar to jogu@887fcad. That's, avoid calling markAsFinished unless we're in progress. From 32340a74b7531604d5c62e9aab32db1ed6a83e72 Mon Sep 17 00:00:00 2001 From: mindy Date: Mon, 16 Nov 2015 18:18:05 +0800 Subject: [PATCH 4/5] Update README.textile --- README.textile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.textile b/README.textile index f565544d..7f3bd89c 100644 --- a/README.textile +++ b/README.textile @@ -3,7 +3,7 @@ This fixes occasional crash when you cancel an ASIHTTPRequest. The crash can be reproduced when you cancel a request that satisfies: - 1. currently waiting in queue, not been started yet - 2. there is valid cached data for this request in downloadCache +* currently waiting in queue, not been started yet +* there is valid cached data for this request in downloadCache The fix is similar to jogu@887fcad. That's, avoid calling markAsFinished unless we're in progress. From ca3b8bb5dad6ab9ec3695fa652204f422be97eab Mon Sep 17 00:00:00 2001 From: mindy Date: Mon, 16 Nov 2015 18:18:30 +0800 Subject: [PATCH 5/5] Update README.textile --- README.textile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.textile b/README.textile index 7f3bd89c..8c4cd820 100644 --- a/README.textile +++ b/README.textile @@ -6,4 +6,4 @@ The crash can be reproduced when you cancel a request that satisfies: * currently waiting in queue, not been started yet * there is valid cached data for this request in downloadCache -The fix is similar to jogu@887fcad. That's, avoid calling markAsFinished unless we're in progress. +The fix is similar to [jogu@887fcad](https://github.com/jogu/asi-http-request/commit/887fcad0f77e9717f003273612804a9b9012a140). That's, avoid calling markAsFinished unless we're in progress.