@@ -18,6 +18,10 @@ public struct UnsupportedImageError: Error {
18
18
public let data : Data
19
19
}
20
20
21
+ public struct InvalidStatusCodeError : Error {
22
+ public let statusCode : Int
23
+ }
24
+
21
25
/// FastImage is an Swift port of the Ruby project by Stephen Sykes. It's directive is too
22
26
/// request as little data as possible (usually just the first batch of bytes returned by a request),
23
27
/// to determine the size and type of a remote image.
@@ -124,6 +128,21 @@ public final class FastImage: NSObject {
124
128
// Not enough data
125
129
}
126
130
}
131
+
132
+ private func validate( request: Request ) -> Bool {
133
+ if let response = request. task. response as? HTTPURLResponse {
134
+ if !( 200 ..< 300 ) . contains ( response. statusCode) {
135
+ // Validate that the status code returned is a success code, otherwise fail
136
+ request. completion ( . failure( InvalidStatusCodeError ( statusCode: response. statusCode) ) )
137
+ if let urlString = request. task. originalRequest? . url? . absoluteString {
138
+ requests. removeValue ( forKey: urlString)
139
+ }
140
+ request. task. cancel ( )
141
+ return false
142
+ }
143
+ }
144
+ return true
145
+ }
127
146
}
128
147
129
148
extension FastImage : URLSessionDataDelegate {
@@ -132,6 +151,9 @@ extension FastImage: URLSessionDataDelegate {
132
151
let request = requests [ urlString] else {
133
152
return
134
153
}
154
+ if !validate( request: request) {
155
+ return
156
+ }
135
157
request. data. append ( data)
136
158
if ( !request. data. isEmpty) {
137
159
parse ( request: request)
@@ -145,6 +167,9 @@ extension FastImage: URLSessionDataDelegate {
145
167
let request = requests [ urlString] else {
146
168
return
147
169
}
170
+ if !validate( request: request) {
171
+ return
172
+ }
148
173
request. completion ( . failure( error ?? SizeNotFoundError ( data: request. data) ) )
149
174
requests. removeValue ( forKey: urlString)
150
175
}
0 commit comments