Search code examples
iosobjective-camazon-s3gzipafnetworking-3

downloadProgress block in downloadTaskWithRequest is not called under AFNetworking 3.1.0 When downloading a gzip file


I'm using AFNetworking 3.1.0 to download some pdfs from AWS S3. The only issue is that when the file is gzipped, the download progress block is not getting called.

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"https://s3.amazonaws.com/awdtest/fullzip.pdf"];
NSURLRequest *request1 = [NSURLRequest requestWithURL:URL];

NSURLSessionDownloadTask *downloadTask1 = [manager downloadTaskWithRequest:request1 progress:^(NSProgress * _Nonnull downloadProgress)
{
    NSLog(@"Progress: %f", downloadProgress.fractionCompleted);
} destination:^NSURL *(NSURL *targetPath, NSURLResponse *response)
{
    NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
    return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error)
{
    NSLog(@"File downloaded to: %@", filePath);
}];
[downloadTask1 resume];

Response headers:

HTTP/1.1 200 OK
x-amz-id-2: CW06YcgIycOHZQy8bCJrT3aNfhatM9pty1mOjgYHumjCxRmNAQ+jhJHRQwl7mDIaQeTHI0fyrnU=
x-amz-request-id: 105E010DECC91897
Date: Sat, 14 May 2016 09:26:38 GMT
Content-Encoding: gzip
Last-Modified: Sat, 14 May 2016 09:21:29 GMT
ETag: "88bbe0b318bf11dd56a31176d3384e78"
Accept-Ranges: bytes
Content-Type: application/pdf
Content-Length: 1243325
Server: AmazonS3

the progress block gets called if I use a non gzipped file: https://s3.amazonaws.com/awdtest/full.pdf

Response headers:

HTTP/1.1 200 OK
x-amz-id-2: gFOVfhheaMdeJOBb+7H8oaXjLLeOqlQl616XnYx6C2Gj7PBVLKZ9kMIN2fJOrGBcSgQ/7nbQOc0=
x-amz-request-id: 26669D9B576E300A
Date: Sat, 14 May 2016 09:54:58 GMT
Last-Modified: Fri, 16 May 2014 05:42:35 GMT
ETag: "6f16d7e09023ce8b50fd67abba7825c4"
Accept-Ranges: bytes
Content-Type: application/pdf
Content-Length: 1411131
Server: AmazonS3

I would appreciate any help.

Thanks


Solution

  • The issue is that when the transmission is gzipped, the underlying NSURLSession doesn't know the size of the transmission, so while it calls the progress delegate method with updates, the expected size is unknown. Thus, percent-complete is unknown and it's therefore hard to update the NSProgress.

    You can call setDownloadTaskDidWriteDataBlock block, though, and get the count of bytes as they come in, at the very least. You'll see that the totalBytesExpectedToWrite is negative (i.e. NSURLResponseUnknownLength), indicating that it doesn't know the number of bytes expected:

    NSURLSessionDownloadTask *downloadTask1 = [manager downloadTaskWithRequest:request1 progress:^(NSProgress * _Nonnull downloadProgress) {
        NSLog(@"Progress: %f", downloadProgress.fractionCompleted);
    } destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
        NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
        return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
        NSLog(@"File downloaded to: %@", filePath);
    }];
    
    [manager setDownloadTaskDidWriteDataBlock:^(NSURLSession *session, NSURLSessionDownloadTask *downloadTask, int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {
        NSLog(@"setDownloadTaskDidWriteDataBlock: %lld %lld %lld", bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
    }];
    
    [downloadTask1 resume];
    

    That yields:

    2016-05-27 15:43:21.987 MyApp[41366:3034687] setDownloadTaskDidWriteDataBlock: 25510 25510 -1
    2016-05-27 15:43:22.086 MyApp[41366:3034654] setDownloadTaskDidWriteDataBlock: 18934 44444 -1
    2016-05-27 15:43:22.122 MyApp[41366:3034647] setDownloadTaskDidWriteDataBlock: 19184 63628 -1
    ...
    2016-05-27 15:43:22.884 MyApp[41366:3034698] setDownloadTaskDidWriteDataBlock: 20742 1397325 -1
    2016-05-27 15:43:22.885 MyApp[41366:3034637] setDownloadTaskDidWriteDataBlock: 13806 1411131 -1
    2016-05-27 15:43:23.018 MyApp[41366:3034381] File downloaded to: file:///Users/.../D8735AFD-77F4-4496-B358-162467169C96/Documents/fullzip.pdf