Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSURLErrorDomain Code -1002 downloading pdf

I'm trying to cache a webpage that I can then later show using a UIWebView.

I have the relevant NSURLSessionDataTask inside a for loop (trying to cache 6 webpages) inside the completion block of another NSURLSessionDataTask. When I run, I keep getting this error:

Ayy there was error downloading, data:<> response:(null) error:Error Domain=NSURLErrorDomain Code=-1002 "The operation couldn’t be completed. (NSURLErrorDomain error -1002.)" UserInfo=0xdd89d30 {NSUnderlyingError=0xdd89ba0 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1002.)"}

Here's a snippet of what I'm calling

for (MAClass *class in [myDictResult objectForKey:@"classes"]) {
     NSString *PRURL = [[[class assignments] objectAtIndex:[[class assignments] count]-1] assignmentName];
     NSLog(@"PRURL is %@", PRURL);

     NSURLSessionDataTask *progressReportTask = [defaultSession dataTaskWithURL:[NSURL URLWithString:PRURL] completionHandler:^(NSData *progressReportData, NSURLResponse *progressReportResponse, NSError *progressReportError) {
         if ([progressReportData length] > 0 && progressReportError == nil) {
              NSLog(@"got dat data");
         } else NSLog(@"Error with getting data data:%@\nresponse:%@\nerror:%@", progressReportData, progressReportResponse, progressReportError);
      }];
      [progressReportTask resume];
      NSLog(@"After request");
}

I've made sure that the URL is valid, seeing that was the cause for other people with getting the same error (my urls are like https://mistar.oakland.k12.mi.us/novi/StudentPortal/Home/PrintProgressReport/20152193^HS4, which are valid when I put them into a browser)

What am I doing wrong?

like image 405
AndrewSB Avatar asked Jun 08 '14 01:06

AndrewSB


2 Answers

-1002 is NSURLErrorUnsupportedURL/kCFURLErrorUnsupportedURL. In the future, you can either search the Xcode documentation for NSURLErrorDomain or use quick open (shift+command+O) to browser the headers for the definition of NSURLErrorDomain. Either technique would have lead you to discover that -1002 in NSURLErrorDomain is NSURLErrorUnsupportedURL.

The reason for this error is that your URL contains some characters that have to be percent escaped. And web browsers will frequently do the necessary percent-escaping for you, which is why it works there.

You can use stringByAddingPercentEscapesUsingEncoding to convert the URL to an acceptable format:

NSString *urlString = @"https://mistar.oakland.k12.mi.us/novi/StudentPortal/Home/PrintProgressReport/20152193^HS4";
NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

NSURLSessionTask *task = [defaultSession dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    ...
}];

By the way, when reconciling web browser results against the app, Charles is very useful. Run the request from browser and again from the app and compare the results in Charles. If you had compared these, you would have seen that you needed to percent escape the URL.

By the way, you can also refer to section 2 of RFC 3986 for a technical description of what characters in URLs must be percent escaped.

like image 101
Rob Avatar answered Oct 03 '22 22:10

Rob


If your urlString contains a query string, also consider using NSURLQueryItem to build the queryString.

It will create the URL in its acceptable format.

Here is an example of how to put it into use: Building URLs with NSURLQueryItems and NSURLComponents.

like image 45
cohen72 Avatar answered Oct 03 '22 23:10

cohen72