diff --git a/Sources/Hermes/Hermes.swift b/Sources/Hermes/Hermes.swift index 2f2832b..0545a2b 100644 --- a/Sources/Hermes/Hermes.swift +++ b/Sources/Hermes/Hermes.swift @@ -58,11 +58,13 @@ public struct Resource { let url: URL var method: HTTPMethod = .get([]) var modelType: T.Type + var headers: [String: String] - public init(url: URL, method: HTTPMethod, modelType: T.Type) { + public init(url: URL, method: HTTPMethod, modelType: T.Type, headers: [String: String] = [:]) { self.url = url self.method = method self.modelType = modelType + self.headers = headers } } @@ -79,39 +81,37 @@ public final class Hermes { } private var defaultHeaders: [String: String] { - var headers = ["Content-Type": "application/json"] - if let token = UserDefaults.standard.string(forKey: "authToken") { - headers["Authorization"] = "Bearer \(token)" - } - headers.merge(config.defaultHeaders) { (_, new) in new } - return headers + return config.defaultHeaders } public func load(_ resource: Resource) async throws -> T { - var request = URLRequest(url: resource.url) request.httpMethod = resource.method.name switch resource.method { - case .get(let queryItems): - if let queryItems = queryItems { - var components = URLComponents(url: resource.url, resolvingAgainstBaseURL: false) - components?.queryItems = queryItems - request.url = components?.url - } - case .post(let data), - .put(let data), - .patch(let data): - request.httpBody = data - case .delete: - break + case .get(let queryItems): + if let queryItems = queryItems { + var components = URLComponents(url: resource.url, resolvingAgainstBaseURL: false) + components?.queryItems = queryItems + request.url = components?.url + } + case .post(let data), + .put(let data), + .patch(let data): + request.httpBody = data + case .delete: + break } - request.allHTTPHeaderFields = defaultHeaders + var headers = defaultHeaders - let configuration = URLSessionConfiguration.default - configuration.httpAdditionalHeaders = defaultHeaders - let session = URLSession(configuration: configuration) + if !resource.headers.isEmpty { + headers.merge(resource.headers) { _, new in new } + } + + request.allHTTPHeaderFields = headers + + let session = URLSession(configuration: URLSessionConfiguration.default) let (data, response) = try await session.data(for: request) @@ -133,7 +133,7 @@ public final class Hermes { private func validate(response: HTTPURLResponse) throws { switch response.statusCode { - case 200...299: + case 200 ... 299: return case 400: throw NetworkError.badRequest diff --git a/Tests/HermesTests/HermesTests.swift b/Tests/HermesTests/HermesTests.swift index c304585..d5c4e6f 100644 --- a/Tests/HermesTests/HermesTests.swift +++ b/Tests/HermesTests/HermesTests.swift @@ -8,7 +8,7 @@ final class HermesTests: XCTestCase { } private func configureHermes() { - let defaultHeaders = ["Custom-Header": "HeaderValue"] + let defaultHeaders = ["Content-Type": "application/json"] let decodingStrategy = JSONDecoder.KeyDecodingStrategy.convertFromSnakeCase let config = HermesConfiguration(defaultHeaders: defaultHeaders, decodingStrategy: decodingStrategy) Hermes.shared.configure(config)