From 75c0d03ce64958ce0b834e07fda7d8d38c8dead3 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Thu, 17 Aug 2023 09:45:22 -0700 Subject: [PATCH] `HTTPClient`: also parse errors with `application/json;charset=utf8` (#3041) See #2529. --- .../Networking/HTTPClient/HTTPClient.swift | 3 +- .../Networking/HTTPClientTests.swift | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/Sources/Networking/HTTPClient/HTTPClient.swift b/Sources/Networking/HTTPClient/HTTPClient.swift index 92883f8de3..dd5e108dc9 100644 --- a/Sources/Networking/HTTPClient/HTTPClient.swift +++ b/Sources/Networking/HTTPClient/HTTPClient.swift @@ -604,7 +604,8 @@ private extension VerifiedHTTPResponse { private extension HTTPResponse where Body == Data { func parseUnsuccessfulResponse() -> NetworkError { - let isJSON = self.value(forHeaderField: HTTPClient.ResponseHeader.contentType) == "application/json" + let contentType = self.value(forHeaderField: HTTPClient.ResponseHeader.contentType) ?? "" + let isJSON = contentType.starts(with: "application/json") return .errorResponse( isJSON diff --git a/Tests/UnitTests/Networking/HTTPClientTests.swift b/Tests/UnitTests/Networking/HTTPClientTests.swift index 1e3f463c92..c1ece8303f 100644 --- a/Tests/UnitTests/Networking/HTTPClientTests.swift +++ b/Tests/UnitTests/Networking/HTTPClientTests.swift @@ -434,6 +434,39 @@ final class HTTPClientTests: BaseHTTPClientTests { expect(self.signing.requests).to(beEmpty()) } + func testServerSide500sWithCharsetContentType() throws { + let request = HTTPRequest(method: .get, path: .mockPath) + let errorCode = 500 + Int.random(in: 0..<50) + + stub(condition: isPath(request.path)) { _ in + let json = "{\"code\": 5000,\"message\": \"something is broken up in the cloud\"}" + return HTTPStubsResponse( + data: json.asData, + statusCode: Int32(errorCode), + headers: [ + HTTPClient.ResponseHeader.contentType.rawValue: "application/json;charset=utf8" + ] + ) + } + + let result = waitUntilValue { completion in + self.client.perform(request) { (response: DataResponse) in + completion(response) + } + } + + expect(result).to(beFailure()) + let error = try XCTUnwrap(result?.error) + + expect(error) == .errorResponse( + .init(code: .unknownBackendError, + originalCode: 5000, + message: "something is broken up in the cloud"), + HTTPStatusCode(rawValue: errorCode) + ) + expect(error.isServerDown) == true + } + func testServerSide500sWithUnknownBody() throws { let request = HTTPRequest(method: .get, path: .mockPath) let errorCode = 500 + Int.random(in: 0..<50)