-
Notifications
You must be signed in to change notification settings - Fork 127
Expand file tree
/
Copy pathMultipartFormDataBuilder.swift
More file actions
80 lines (66 loc) · 2 KB
/
Copy pathMultipartFormDataBuilder.swift
File metadata and controls
80 lines (66 loc) · 2 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
77
78
79
80
//
// MultipartFormDataBuilder.swift
//
//
// Created by James Rochabrun on 10/11/23.
//
import Foundation
// MARK: MultipartFormDataBuilder
struct MultipartFormDataBuilder {
let boundary: String
let entries: [MultipartFormDataEntry]
init(
boundary: String,
entries: [MultipartFormDataEntry])
{
self.boundary = boundary
self.entries = entries
}
func build() -> Data {
var httpData = entries
.map { $0.makeData(boundary: boundary) }
.reduce(Data(), +)
httpData.append("--\(boundary)--\r\n")
return httpData
}
}
// MARK: MultipartFormDataEntry
enum MultipartFormDataEntry {
case file(paramName: String, fileName: String?, fileData: Data?, contentType: String)
case string(paramName: String, value: Any?)
}
// MARK: MultipartFormDataEntry+Data
extension MultipartFormDataEntry {
func makeData(boundary: String) -> Data {
var body = Data()
switch self {
case .file(let paramName, let fileName, let fileData, let contentType):
if let fileData {
body.append("--\(boundary)\r\n")
if let fileName = fileName {
body.append("Content-Disposition: form-data; name=\"\(paramName)\"; filename=\"\(fileName)\"\r\n")
} else {
body.append("Content-Disposition: form-data; name=\"\(paramName)\"\r\n")
}
body.append("Content-Type: \(contentType)\r\n\r\n")
body.append(fileData)
body.append("\r\n")
}
case .string(let paramName, let value):
if let value {
body.append("--\(boundary)\r\n")
body.append("Content-Disposition: form-data; name=\"\(paramName)\"\r\n\r\n")
body.append("\(value)\r\n")
}
}
return body
}
}
private extension Data {
mutating func append(_ string: String) {
let data = string.data(
using: String.Encoding.utf8,
allowLossyConversion: true)
append(data!)
}
}