-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStringEncoding.swift
More file actions
76 lines (63 loc) · 2.71 KB
/
StringEncoding.swift
File metadata and controls
76 lines (63 loc) · 2.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//
// StringEncoding.swift
// QuickHatch
//
// Created by Daniel Koster on 8/14/19.
// Copyright © 2019 DaVinci Labs. All rights reserved.
//
import Foundation
public class StringEncoding: ParameterEncoding {
public init(destination: ParamDestination = .queryString) {
self.paramDest = destination
}
private var paramDest: ParamDestination
public class var bodyEncoding: StringEncoding {
return StringEncoding(destination: .httpBody)
}
public class var urlEncoding: StringEncoding {
return StringEncoding()
}
public func encode(_ urlRequest: URLRequestProtocol, with parameters: Parameters?) throws -> URLRequest {
var request: URLRequest = try urlRequest.asURLRequest()
guard let url = request.url else {
throw EncodingError.parameterEncodingFailed(reason: ParameterEncodingFailureReason.missingURL)
}
if paramDest == .queryString {
urlEncoding(url: url, params: parameters, urlRequest: &request)
return request
}
bodyEncoding(params: parameters, urlRequest: &request)
return request
}
private func urlEncoding(url: URL, params: Parameters?, urlRequest: inout URLRequest) {
guard let validParams = params, !validParams.isEmpty else { return }
var urlString = url.absoluteString
validParams.forEach({ (key, value) in
let escapedParameter = EncodingHelpers.escape("{\(key)}")
urlString = urlString.replacingOccurrences(of: escapedParameter, with: EncodingHelpers.queryComponents(fromKey: key, value: value)[0].1)
})
urlRequest.url = URL(string: urlString)
}
private func bodyEncoding(params: Parameters?, urlRequest: inout URLRequest) {
guard let validParams = params, !validParams.isEmpty else { return }
var paramsEncoded: String = ""
validParams.forEach({ (key, value) in
paramsEncoded += EncodingHelpers.queryComponents(fromKey: key, value: value)[0].1 + "&"
})
paramsEncoded.removeLast()
urlRequest.httpBody = paramsEncoded.data(using: .utf8, allowLossyConversion: false)
}
}
public struct StringURLTransformer: URLTransformer {
public init() {
}
public func transform(url: String, parameters: [String : any Sendable]) -> String {
guard !parameters.isEmpty else { return url }
var urlString = url
for (key, value) in parameters {
let escapedKey = EncodingHelpers.escape("{\(key)}")
urlString = urlString.replacingOccurrences(of: escapedKey, with: EncodingHelpers.queryComponents(fromKey: key, value: value)[0].1)
}
return urlString
}
}