@@ -371,11 +371,24 @@ - (void)requestDidFailWithRequest:(YTKBaseRequest *)request error:(NSError *)err
371371 YTKLog (@" Request %@ failed, status code = %ld , error = %@ " ,
372372 NSStringFromClass ([request class ]), (long )request.responseStatusCode , error.localizedDescription );
373373
374+ // Save incomplete download data.
374375 NSData *incompleteDownloadData = error.userInfo [NSURLSessionDownloadTaskResumeData ];
375376 if (incompleteDownloadData) {
376377 [incompleteDownloadData writeToURL: [self incompleteDownloadTempPathForDownloadPath: request.resumableDownloadPath] atomically: YES ];
377378 }
378379
380+ // Load response from file and clean up if download task failed.
381+ if ([request.responseObject isKindOfClass: [NSURL class ]]) {
382+ NSURL *url = request.responseObject ;
383+ if (url.isFileURL && [[NSFileManager defaultManager ] fileExistsAtPath: url.path]) {
384+ request.responseData = [NSData dataWithContentsOfURL: url];
385+ request.responseString = [[NSString alloc ] initWithData: request.responseData encoding: [YTKNetworkUtils stringEncodingWithRequest: request]];
386+
387+ [[NSFileManager defaultManager ] removeItemAtURL: url error: nil ];
388+ }
389+ request.responseObject = nil ;
390+ }
391+
379392 @autoreleasepool {
380393 [request requestFailedPreprocessor ];
381394 }
@@ -462,6 +475,14 @@ - (NSURLSessionDownloadTask *)downloadTaskWithDownloadPath:(NSString *)downloadP
462475 downloadTargetPath = downloadPath;
463476 }
464477
478+ // AFN use `moveItemAtURL` to move downloaded file to target path,
479+ // this method aborts the move attempt if a file already exist at the path.
480+ // So we remove the exist file before we start the download task.
481+ // https://github.com/AFNetworking/AFNetworking/issues/3775
482+ if ([[NSFileManager defaultManager ] fileExistsAtPath: downloadTargetPath]) {
483+ [[NSFileManager defaultManager ] removeItemAtPath: downloadTargetPath error: nil ];
484+ }
485+
465486 BOOL resumeDataFileExists = [[NSFileManager defaultManager ] fileExistsAtPath: [self incompleteDownloadTempPathForDownloadPath: downloadPath].path];
466487 NSData *data = [NSData dataWithContentsOfURL: [self incompleteDownloadTempPathForDownloadPath: downloadPath]];
467488 BOOL resumeDataIsValid = [YTKNetworkUtils validateResumeData: data];
0 commit comments