Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

More than 1 multipart data support, PATCH support #66

Merged
merged 11 commits into from
Jun 7, 2020
Merged
2 changes: 1 addition & 1 deletion Carthage/Checkouts/Alamofire
Submodule Alamofire updated 190 files
37 changes: 24 additions & 13 deletions ws/WS+Requests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,27 +34,38 @@ extension WS {
data: Data,
fileName: String,
mimeType: String) -> WSRequest {
let c = call(url, verb: .post, params: params)
let multiPart = WSMultiPartData(
multipartData: data,
multipartName: name,
multipartFileName: fileName,
multipartMimeType: mimeType
)
return postMultipartRequest(url, params: params, multiParts: [multiPart])
}

public func postMultipartRequest(_ url: String,
params: Params = Params(),
multiParts: [WSMultiPartData],
verb: WSHTTPVerb = .post) -> WSRequest {
let c = call(url, verb: verb, params: params)
c.isMultipart = true
c.multipartData = data
c.multipartName = name
c.multipartFileName = fileName
c.multipartMimeType = mimeType
c.multiPartData = multiParts
return c
}

public func putMultipartRequest(_ url: String,
params: Params = Params(),
name: String,
data: Data,
fileName: String,
mimeType: String) -> WSRequest {
let c = call(url, verb: .put, params: params)
c.isMultipart = true
c.multipartData = data
c.multipartName = name
c.multipartFileName = fileName
c.multipartMimeType = mimeType
return c
let multiPart = WSMultiPartData(
multipartData: data,
multipartName: name,
multipartFileName: fileName,
multipartMimeType: mimeType
)
return postMultipartRequest(url, params: params, multiParts: [multiPart], verb: .put)
}

}
7 changes: 4 additions & 3 deletions ws/WS+TypedCalls.swift
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ extension WS {

// Apply corresponding JSON mapper
return c.fetch().registerThen { (json: JSON) -> T in
return WSModelJSONParser<T>().toModel(json, keypath: keypath)
}.resolveOnMainThread()
return WSModelJSONParser<T>().toModel(json, keypath: keypath ?? self.defaultObjectParsingKeyPath)
}.resolveOnMainThread()
}

}
Expand Down Expand Up @@ -119,7 +119,7 @@ extension WS {
return c.fetch()
.registerThen { (json: JSON) in
Promise<T> { (resolve, reject) in
if let t: T = WSModelJSONParser<T>().toModel(json, keypath: keypath) {
if let t: T = WSModelJSONParser<T>().toModel(json, keypath: keypath ?? self.defaultObjectParsingKeyPath) {
resolve(t)
} else {
reject(WSError.unableToParseResponse)
Expand All @@ -130,3 +130,4 @@ extension WS {
}

}

24 changes: 24 additions & 0 deletions ws/WS.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ open class WS {
*/
open var defaultCollectionParsingKeyPath: String?

// Same but for ArrowInitializable objects
open var defaultObjectParsingKeyPath: String?

@available(*, unavailable, renamed:"defaultCollectionParsingKeyPath")
open var jsonParsingColletionKey: String?

Expand Down Expand Up @@ -141,6 +144,15 @@ open class WS {
mimeType: mimeType)
return r.fetch().resolveOnMainThread()
}

open func postMultipart(_ url: String,
params: Params = Params(),
multiParts: [WSMultiPartData]) -> Promise<JSON> {
let r = postMultipartRequest(url,
params: params,
multiParts: multiParts)
return r.fetch().resolveOnMainThread()
}

open func putMultipart(_ url: String,
params: Params = Params(),
Expand All @@ -152,6 +164,18 @@ open class WS {
return r.fetch().resolveOnMainThread()
}

open func putMultipart(_ url: String,
params: Params = Params(),
multiParts: [WSMultiPartData]) -> Promise<JSON> {
let r = postMultipartRequest(url, params: params, multiParts: multiParts, verb: .put)
return r.fetch().resolveOnMainThread()
}

open func patchMultipart(_ url: String, params: Params = Params(), multiParts: [WSMultiPartData]) -> Promise<JSON> {
let r = postMultipartRequest(url, params: params, multiParts: multiParts, verb: .patch)
return r.fetch().resolveOnMainThread()
}

}

public extension Promise {
Expand Down
2 changes: 2 additions & 0 deletions ws/WSError.swift
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,8 @@ public struct WSError: Error {

public var jsonPayload: JSON?

public var responseData: Data?

public init(httpStatusCode: Int) {
self.status = Status(rawValue: httpStatusCode) ?? .unknown
}
Expand Down
1 change: 1 addition & 0 deletions ws/WSHTTPVerb.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,6 @@ public enum WSHTTPVerb: String {
case get = "GET"
case put = "PUT"
case post = "POST"
case patch = "PATCH"
case delete = "DELETE"
}
7 changes: 5 additions & 2 deletions ws/WSLogger.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,11 @@ class WSLogger {
for (k, v) in request.headers {
print(" \(k) : \(v)")
}
print(" name : \(request.multipartName),"
+ "mimeType: \(request.multipartMimeType), filename: \(request.multipartFileName)")
request.multiPartData.forEach {
print(" name : \($0.multipartName),"
+ "mimeType: \($0.multipartMimeType), filename: \($0.multipartFileName)")
}

if logLevels == .debug {
print()
}
Expand Down
36 changes: 27 additions & 9 deletions ws/WSRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,26 @@ import Arrow
import Foundation
import then

public struct WSMultiPartData {
public var multipartData = Data()
public var multipartName = ""
public var multipartFileName = "photo.jpg"
public var multipartMimeType = "image/*"

public init() {
}
public init(multipartData: Data, multipartName: String, multipartFileName: String? = nil, multipartMimeType: String) {
self.multipartData = multipartData
self.multipartName = multipartName
self.multipartFileName = multipartFileName ?? self.multipartFileName
self.multipartMimeType = multipartMimeType
}
}

open class WSRequest {

var isMultipart = false
var multipartData = Data()
var multipartName = ""
var multipartFileName = "photo.jpg"
var multipartMimeType = "image/jpeg"
var multiPartData = [WSMultiPartData]()

open var baseURL = ""
open var URL = ""
Expand Down Expand Up @@ -59,7 +72,7 @@ open class WSRequest {
}

var request: URLRequest?
if httpVerb == .post || httpVerb == .put {
if httpVerb == .post || httpVerb == .put || httpVerb == .patch {
request = try? postParameterEncoding.encode(r, with: params)
} else {
request = try? URLEncoding.default.encode(r, with: params)
Expand Down Expand Up @@ -139,10 +152,12 @@ open class WSRequest {
formData.append(data, withName: key)
}
}
formData.append(self.multipartData,
withName: self.multipartName,
fileName: self.multipartFileName,
mimeType: self.multipartMimeType)
self.multiPartData.forEach{ data in
formData.append(data.multipartData,
withName: data.multipartName,
fileName: data.multipartFileName,
mimeType: data.multipartMimeType)
}
}, with: self.buildRequest(),
encodingCompletion: { encodingResult in
switch encodingResult {
Expand Down Expand Up @@ -210,6 +225,7 @@ open class WSRequest {
data: Data? = nil,
reject: (_ error: Error) -> Void) {
var error = WSError(httpStatusCode: response?.statusCode ?? 0)
error.responseData = data
if let d = data,
let json = try? JSONSerialization.jsonObject(with: d,
options: JSONSerialization.ReadingOptions.allowFragments),
Expand All @@ -227,6 +243,8 @@ open class WSRequest {
return .post
case .put:
return .put
case .patch:
return .patch
case .delete:
return .delete
}
Expand Down