@@ -19,8 +19,9 @@ extension AWSS3StorageService {
19
19
let downloadTaskCreatedHandler = AWSS3StorageService . makeDownloadTaskCreatedHandler ( onEvent: onEvent)
20
20
let expression = AWSS3TransferUtilityDownloadExpression ( )
21
21
expression. progressBlock = AWSS3StorageService . makeOnDownloadProgressHandler ( onEvent: onEvent)
22
- let onDownloadCompletedHandler = AWSS3StorageService . makeDownloadCompletedHandler ( onEvent: onEvent,
23
- serviceKey: serviceKey)
22
+ let onDownloadCompletedHandler = AWSS3StorageService . makeDownloadCompletedHandler ( fileURL: fileURL,
23
+ serviceKey: serviceKey,
24
+ onEvent: onEvent)
24
25
25
26
if let fileURL = fileURL {
26
27
transferUtility. download ( to: fileURL,
@@ -74,25 +75,27 @@ extension AWSS3StorageService {
74
75
}
75
76
76
77
private static func makeDownloadCompletedHandler(
77
- onEvent: @escaping StorageServiceDownloadEventHandler ,
78
- serviceKey: String ) -> AWSS3TransferUtilityDownloadCompletionHandlerBlock {
78
+ fileURL: URL ? = nil ,
79
+ serviceKey: String ,
80
+ onEvent: @escaping StorageServiceDownloadEventHandler ) -> AWSS3TransferUtilityDownloadCompletionHandlerBlock {
79
81
80
82
let block : AWSS3TransferUtilityDownloadCompletionHandlerBlock = { task, location, data, error in
81
83
guard let response = task. response else {
82
84
onEvent ( StorageEvent . failed ( StorageError . unknown ( " Missing HTTP Response " ) ) )
83
85
return
84
86
}
85
87
86
- let storageError = StorageErrorHelper . mapHttpResponseCode ( statusCode: response. statusCode,
87
- serviceKey: serviceKey)
88
- guard storageError == nil else {
89
- onEvent ( StorageEvent . failed ( storageError! ) )
88
+ if let storageError = StorageErrorHelper . mapHttpResponseCode ( statusCode: response. statusCode,
89
+ serviceKey: serviceKey) {
90
+ deleteFileIfKeyNotFound ( storageError : storageError , fileURL : fileURL )
91
+ onEvent ( StorageEvent . failed ( storageError) )
90
92
return
91
93
}
92
94
93
95
guard error == nil else {
94
96
let error = error! as NSError
95
97
let storageError = StorageErrorHelper . mapTransferUtilityError ( error)
98
+ deleteFileIfKeyNotFound ( storageError: storageError, fileURL: fileURL)
96
99
onEvent ( StorageEvent . failed ( storageError) )
97
100
return
98
101
}
@@ -102,4 +105,16 @@ extension AWSS3StorageService {
102
105
103
106
return block
104
107
}
108
+
109
+ // TransferUtility saves the error response at the file location when the key cannot be found in S3
110
+ // This is an best-effort attempt to ensure that the file is removed
111
+ private static func deleteFileIfKeyNotFound( storageError: StorageError , fileURL: URL ? ) {
112
+ if case . keyNotFound = storageError, let fileURL = fileURL {
113
+ do {
114
+ try FileManager . default. removeItem ( at: fileURL)
115
+ } catch {
116
+ Amplify . Logging. error ( error: error)
117
+ }
118
+ }
119
+ }
105
120
}
0 commit comments