2023-01-20 16:57:25 +01:00
|
|
|
//
|
|
|
|
// https://mczachurski.dev
|
|
|
|
// Copyright © 2022 Marcin Czachurski and the repository contributors.
|
|
|
|
// Licensed under the MIT License.
|
|
|
|
//
|
|
|
|
|
2023-01-10 08:04:25 +01:00
|
|
|
import Foundation
|
|
|
|
|
|
|
|
extension Data {
|
|
|
|
|
|
|
|
func getMultipartFormDataBuilder(withBoundary boundary: String) -> MultipartFormDataBuilder? {
|
|
|
|
return MultipartFormDataBuilder(data: self, boundary: boundary)
|
|
|
|
}
|
|
|
|
|
|
|
|
struct MultipartFormDataBuilder {
|
|
|
|
private let boundary: String
|
|
|
|
private var httpBody = NSMutableData()
|
|
|
|
|
|
|
|
private let data: Data
|
|
|
|
|
|
|
|
fileprivate init(data: Data, boundary: String) {
|
|
|
|
self.data = data
|
|
|
|
self.boundary = boundary
|
|
|
|
}
|
|
|
|
|
|
|
|
func addTextField(named name: String, value: String) -> Self {
|
|
|
|
httpBody.append(textFormField(named: name, value: value))
|
|
|
|
return self
|
|
|
|
}
|
|
|
|
|
|
|
|
private func textFormField(named name: String, value: String) -> String {
|
|
|
|
var fieldString = "--\(boundary)\r\n"
|
|
|
|
fieldString += "Content-Disposition: form-data; name=\"\(name)\"\r\n"
|
|
|
|
fieldString += "Content-Type: text/plain; charset=UTF-8\r\n"
|
|
|
|
fieldString += "\r\n"
|
|
|
|
fieldString += "\(value)\r\n"
|
|
|
|
|
|
|
|
return fieldString
|
|
|
|
}
|
|
|
|
|
|
|
|
func addDataField(named name: String, data: Data, mimeType: String) -> Self {
|
|
|
|
httpBody.append(dataFormField(named: name, data: data, mimeType: mimeType))
|
|
|
|
return self
|
|
|
|
}
|
|
|
|
|
|
|
|
private func dataFormField(named name: String, data: Data, mimeType: String) -> Data {
|
|
|
|
let fieldData = NSMutableData()
|
|
|
|
|
|
|
|
fieldData.append("--\(boundary)\r\n")
|
|
|
|
fieldData.append("Content-Disposition: form-data; name=\"\(name)\"\r\n")
|
|
|
|
fieldData.append("Content-Type: \(mimeType)\r\n")
|
|
|
|
fieldData.append("\r\n")
|
|
|
|
fieldData.append(data)
|
|
|
|
fieldData.append("\r\n")
|
|
|
|
|
|
|
|
return fieldData as Data
|
|
|
|
}
|
|
|
|
|
|
|
|
func build() -> Data {
|
|
|
|
return httpBody as Data
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
extension NSMutableData {
|
|
|
|
func append(_ string: String) {
|
|
|
|
if let data = string.data(using: .utf8) {
|
|
|
|
self.append(data)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|