diff --git a/Sources/MeiliSearch/Request.swift b/Sources/MeiliSearch/Request.swift index 36381ebb..fcdf280b 100755 --- a/Sources/MeiliSearch/Request.swift +++ b/Sources/MeiliSearch/Request.swift @@ -19,6 +19,14 @@ public protocol URLSessionDataTaskProtocol { func resume() } +private enum HTTPMethod: String { + case get = "GET" + case put = "PUT" + case post = "POST" + case patch = "PATCH" + case delete = "DELETE" +} + public final class Request { private let config: Config private let session: URLSessionProtocol @@ -28,6 +36,33 @@ public final class Request { self.session = config.session ?? URLSession.shared } + private func request( + _ httpMethod: HTTPMethod, + _ url: URL, + _ headers: [String: String] = [:], + data: Data? = nil + ) -> URLRequest { + var request = URLRequest(url: url) + request.httpMethod = httpMethod.rawValue + request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent") + + if httpMethod != .get { + request.httpBody = data + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + } + + if let apiKey: String = config.apiKey { + let bearer = "Bearer \(apiKey)" + request.setValue(bearer, forHTTPHeaderField: "Authorization") + } + + headers.forEach { key, value in + request.addValue(value, forHTTPHeaderField: key) + } + + return request + } + func get( api: String, param: String? = nil, @@ -38,24 +73,11 @@ public final class Request { if let param: String = param, !param.isEmpty { urlString += param } - guard let url = URL(string: urlString) else { completion(.failure(MeiliSearch.Error.invalidURL(url: urlString))) return } - - var request = URLRequest(url: url) - request.httpMethod = "GET" - request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent") - headers.forEach { key, value in - request.addValue(value, forHTTPHeaderField: key) - } - - if let apiKey = config.apiKey { - let bearer = "Bearer \(apiKey)" - request.addValue(bearer, forHTTPHeaderField: "Authorization") - } - + let request = self.request(.get, url, headers) let task: URLSessionDataTaskProtocol = session.execute(with: request) { data, response, error in do { try MeiliSearch.errorHandler(url: url, data: data, response: response, error: error) @@ -73,6 +95,7 @@ public final class Request { func post( api: String, + headers: [String: String] = [:], _ data: Data, _ completion: @escaping (Result) -> Void) { guard let url = URL(string: config.url(api: api)) else { @@ -80,18 +103,7 @@ public final class Request { return } - var request = URLRequest(url: url) - request.httpMethod = "POST" - request.httpBody = data - request.setValue("application/json", forHTTPHeaderField: "Content-Type") - request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept") - request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent") - - if let apiKey: String = config.apiKey { - let bearer = "Bearer \(apiKey)" - request.addValue(bearer, forHTTPHeaderField: "Authorization") - } - + let request = self.request(.post, url, headers, data: data) let task: URLSessionDataTaskProtocol = session.execute(with: request) { data, response, error in do { try MeiliSearch.errorHandler(url: url, data: data, response: response, error: error) @@ -111,25 +123,14 @@ public final class Request { func put( api: String, + headers: [String: String] = [:], _ data: Data, _ completion: @escaping (Result) -> Void) { guard let url = URL(string: config.url(api: api)) else { completion(.failure(MeiliSearch.Error.invalidURL())) return } - - var request = URLRequest(url: url) - request.httpMethod = "PUT" - request.httpBody = data - request.setValue("application/json", forHTTPHeaderField: "Content-Type") - request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept") - request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent") - - if let apiKey: String = config.apiKey { - let bearer = "Bearer \(apiKey)" - request.addValue(bearer, forHTTPHeaderField: "Authorization") - } - + let request = self.request(.put, url, headers, data: data) let task: URLSessionDataTaskProtocol = session.execute(with: request) { data, response, error in do { try MeiliSearch.errorHandler(url: url, data: data, response: response, error: error) @@ -144,31 +145,19 @@ public final class Request { return } } - task.resume() } func patch( api: String, + headers: [String: String] = [:], _ data: Data, _ completion: @escaping (Result) -> Void) { guard let url = URL(string: config.url(api: api)) else { completion(.failure(MeiliSearch.Error.invalidURL())) return } - - var request = URLRequest(url: url) - request.httpMethod = "PATCH" - request.httpBody = data - request.setValue("application/json", forHTTPHeaderField: "Content-Type") - request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept") - request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent") - - if let apiKey: String = config.apiKey { - let bearer = "Bearer \(apiKey)" - request.setValue(bearer, forHTTPHeaderField: "Authorization") - } - + let request = self.request(.patch, url, headers, data: data) let task: URLSessionDataTaskProtocol = session.execute(with: request) { data, response, error in do { try MeiliSearch.errorHandler(url: url, data: data, response: response, error: error) @@ -183,29 +172,18 @@ public final class Request { return } } - task.resume() } func delete( api: String, + headers: [String: String] = [:], _ completion: @escaping (Result) -> Void) { guard let url = URL(string: config.url(api: api)) else { completion(.failure(MeiliSearch.Error.invalidURL())) return } - - var request = URLRequest(url: url) - request.httpMethod = "DELETE" - request.setValue("application/json", forHTTPHeaderField: "Content-Type") - request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept") - request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent") - - if let apiKey: String = config.apiKey { - let bearer = "Bearer \(apiKey)" - request.addValue(bearer, forHTTPHeaderField: "Authorization") - } - + let request = self.request(.delete, url, headers) let task: URLSessionDataTaskProtocol = session.execute(with: request) { data, response, error in do { try MeiliSearch.errorHandler(url: url, data: data, response: response, error: error)