diff --git a/Service.swift b/Service.swift index 7147999..97188fa 100644 --- a/Service.swift +++ b/Service.swift @@ -75,7 +75,8 @@ final class Service { // For example... (you probably want a more specific result type unpacked from the response though) func signUp(email: String, password: String, avatar: UIImage) -> Promise { let parameters = ["email" : email, "password" : password] - let request = postRequest(path: "/accounts", parameters: parameters) + let url = environment.baseURL.appendingPathComponent("accounts") + var request = HTTPRequest.post(url, contentType: .formEncoded, parameters: parameters) request.addMultipartJPEG(name: "avatar", image: avatar, quality: 1) return performRequest(request) } diff --git a/Sources/Osiris/HTTP.swift b/Sources/Osiris/HTTP.swift index 7837678..642d661 100644 --- a/Sources/Osiris/HTTP.swift +++ b/Sources/Osiris/HTTP.swift @@ -29,13 +29,17 @@ enum HTTPContentType { case multipart } -final class HTTPRequest { - let method: HTTPMethod - let url: URL - private(set) var contentType: HTTPContentType - let parameters: [String : Any]? - private(set) var headers: [String : String] = [:] - private(set) var parts: [MultipartFormEncoder.Part] = [] +struct HTTPRequest { + var method: HTTPMethod + var url: URL + var contentType: HTTPContentType + var parameters: [String : Any]? + var headers: [String : String] = [:] + var parts: [MultipartFormEncoder.Part] = [] { + didSet { + if !parts.isEmpty { contentType = .multipart } + } + } init(method: HTTPMethod, url: URL, contentType: HTTPContentType = .none, parameters: [String : Any]? = nil) { self.method = method @@ -44,28 +48,34 @@ final class HTTPRequest { self.parameters = parameters } - func addHeader(name: String, value: String) { - headers[name] = value + static func get(_ url: URL, contentType: HTTPContentType = .none) -> HTTPRequest { + HTTPRequest(method: .get, url: url, contentType: contentType) + } + + static func put(_ url: URL, contentType: HTTPContentType = .none, parameters: [String: Any]? = nil) -> HTTPRequest { + HTTPRequest(method: .put, url: url, contentType: contentType, parameters: parameters) + } + + static func post(_ url: URL, contentType: HTTPContentType = .none, parameters: [String: Any]? = nil) -> HTTPRequest { + HTTPRequest(method: .post, url: url, contentType: contentType, parameters: parameters) + } + + static func delete(_ url: URL, contentType: HTTPContentType = .none) -> HTTPRequest { + HTTPRequest(method: .delete, url: url, contentType: contentType) } #if canImport(UIKit) - func addMultipartJPEG(name: String, image: UIImage, quality: CGFloat, filename: String? = nil) { + mutating func addMultipartJPEG(name: String, image: UIImage, quality: CGFloat, filename: String? = nil) { guard let data = image.jpegData(compressionQuality: quality) else { assertionFailure() return } - let part = MultipartFormEncoder.Part(name: name, content: .binary(data, type: "image/jpeg", filename: filename ?? "image.jpeg")) - addPart(part) + parts.append(MultipartFormEncoder.Part( + name: name, + content: .binary(data, type: "image/jpeg", filename: filename ?? "image.jpeg") + )) } #endif - - private func addPart(_ part: MultipartFormEncoder.Part) { - // Convert this request to multipart - if parts.isEmpty { - contentType = .multipart - } - parts.append(part) - } } enum HTTPRequestError: Error { diff --git a/Sources/Osiris/RequestBuilder.swift b/Sources/Osiris/RequestBuilder.swift index 81c508e..720c53d 100644 --- a/Sources/Osiris/RequestBuilder.swift +++ b/Sources/Osiris/RequestBuilder.swift @@ -13,6 +13,7 @@ enum RequestBuilderError: Error { final class RequestBuilder { class func build(request: HTTPRequest) throws -> URLRequest { assert(!(request.method == .get && request.parameters != nil), "encoding GET params is not yet implemented") + assert(!(request.method == .delete && request.parameters != nil), "encoding DELETE params is not yet implemented") var result = URLRequest(url: request.url) result.httpMethod = request.method.string for (name, value) in request.headers {