Search code examples
iosios5newsstand-kitnsurlconnectiondelegate

SSErrorDomain error code 109. NewsStand download from Amazon S3


While downloading a file from Amazon S3 in iOS. Intermittently NSURLConnectionDownloadDelegate's method didFailWithError: get called and this is what I got when I logged received NSError object

Error Code: 109 Error Domain: SSErrorDomain Error Description: "Cannot connect to .s3.amazonaws.com"

Searched all the Apple documentation, StackOverflow and other sites but not found anything on this. Today I raised a technical query to Apple also for this using my developer account.

Any idea ?

Update:

So after looking into HTTP response error code (403 Forbidden), I got the idea. It is because of "RequestTimeTooSkewed" error from S3 (The difference between the request time and the current time is too large.). I cross checked it by changing iPad's/Mac's system time by 1 hour and this error is coming immediately now, even for a small (200kb) file.

Now as suggested in many blogs I am first making a HEAD request to AWS as below to get the Date string and not passing the system Date

NSString *awsURL = @"http://s3.amazonaws.com";
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:awsURL]];  
    [request setHTTPMethod:@"HEAD"];  

    NSHTTPURLResponse *response;  
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error: NULL];  

    NSString *dateString = nil;  

    if ([response respondsToSelector:@selector(allHeaderFields)]) {  
        dateString = [[response allHeaderFields] objectForKey:@"Date"];  
    }   
    return dateString;

and setting this as Date header in NSMutableURLRequest

[urlRequest setValue:awsDateString forHTTPHeaderField:@"Date"];

This request I am adding to my issue for download

 NKAssetDownload *nkAssetDownload = [nkIssue addAssetWithRequest:urlRequest];

Still the same error !!!! It now more crazier than my last situation.

Anyone ?

Update 2

I was able to make request successfully (even the system clock of my iPad is incorrect) by replacing "GMT" with "+0000" in the date string.

Update 3 Still some requests fail with same error which is weird, but I am assuming it is something the NewsStand Framework is messing up.


Solution

  • So it is RequestTimeTooSkewed error and the above code to fetch date from S3 server's head response to add in request does the trick.