@@ -178,63 +178,35 @@ open class NextcloudKit {
178178 }
179179#endif
180180
181- /*
182- /// Evaluates an Alamofire response and returns the appropriate NKError.
181+ /// Evaluates a generic Alamofire response into NKError with simple HTTP-aware rules.
182+ /// - Note:
183+ /// - Explicit cancellations return `.cancelled`.
184+ /// - Any HTTP 2xx is considered success, regardless of body presence.
185+ /// - If no HTTP status is available, fall back to Alamofire's `Result`.
183186 func evaluateResponse< Data> ( _ response: AFDataResponse < Data > ) -> NKError {
184- // Treat explicit cancellations as a first-class outcome
187+ // 1) Cancellations take precedence
185188 if let afError = response. error? . asAFError,
186- afError.isExplicitlyCancelledError {
189+ afError. isExplicitlyCancelledError {
187190 return . cancelled
188191 }
189192
190- switch response.result {
191- case .failure(let error):
192- if let afError = error.asAFError,
193- case .responseSerializationFailed(let reason) = afError,
194- case .inputDataNilOrZeroLength = reason {
195- return .success
196- } else {
197- return NKError(error: error, afResponse: response, responseData: response.data)
198- }
199- case .success:
200- return .success
201- }
202- }
203- */
204-
205- /// Evaluates an Alamofire response and returns the appropriate NKError.
206- func evaluateResponse< Data> ( _ response: AFDataResponse < Data > ) -> NKError {
207- // Treat explicit cancellations as a first-class outcome
208- if let afError = response. error? . asAFError,
209- afError. isExplicitlyCancelledError {
210- return . cancelled
211- }
212-
213- // Prefer HTTP status code over serializer outcome for uploads
214- let statusCode = response. response? . statusCode
215- if let code = statusCode {
216- // Success on any 2xx; explicitly include 204/205 which carry no body by definition
217- if ( 200 ... 299 ) . contains ( code) || code == 204 || code == 205 {
193+ // 2) Prefer HTTP status code when available
194+ if let code = response. response? . statusCode {
195+ if ( 200 ... 299 ) . contains ( code) {
218196 return . success
219197 }
198+ // Non-2xx: let the error flow below (even if serializer said "success")
220199 }
221200
222- // Fall back to Alamofire's result only if HTTP status wasn't clearly successful
201+ // 3) Fall back to Alamofire's result (covers transport errors and missing status)
223202 switch response. result {
224203 case . success:
225204 return . success
226205
227206 case . failure( let error) :
228- // If the only failure reason is "no data" but status is actually OK, still succeed
229- if let afError = error. asAFError,
230- case . responseSerializationFailed( let reason) = afError,
231- case . inputDataNilOrZeroLength = reason,
232- let code = statusCode,
233- ( 200 ... 299 ) . contains ( code) || code == 204 || code == 205 {
234- return . success
235- }
236-
237- // Everything else is a real error: keep the payload for diagnostics
207+ // No need to special-case inputDataNilOrZeroLength here:
208+ // - If it was a 2xx, we already returned above.
209+ // - If it's not 2xx or no status code, it's a real failure for our purposes.
238210 return NKError ( error: error, afResponse: response, responseData: response. data)
239211 }
240212 }
0 commit comments