12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- //
- // MultipartFormDataRequest.swift
- // NexilisLite
- //
- // Created by Kevin Maulana on 13/04/22.
- //
- import Foundation
- public struct MultipartFormDataRequest {
- private let boundary: String = UUID().uuidString
- private var httpBody = NSMutableData()
- let url: URL
- public init(url: URL) {
- self.url = url
- }
- public func addTextField(named name: String, value: String) {
- httpBody.append(textFormField(named: name, value: value))
- }
- 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=ISO-8859-1\r\n"
- fieldString += "Content-Transfer-Encoding: 8bit\r\n"
- fieldString += "\r\n"
- fieldString += "\(value)\r\n"
- return fieldString
- }
- public func addDataField(named name: String, data: Data, mimeType: String) {
- httpBody.append(dataFormField(named: name, data: data, mimeType: mimeType))
- }
- 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
- }
-
- public func asURLRequest() -> URLRequest {
- var request = URLRequest(url: url)
- request.httpMethod = "POST"
- request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
- httpBody.append("--\(boundary)--")
- request.httpBody = httpBody as Data
- return request
- }
- }
- extension NSMutableData {
- public func append(_ string: String) {
- if let data = string.data(using: .utf8) {
- self.append(data)
- }
- }
- }
- extension URLSession {
- public func dataTask(with request: MultipartFormDataRequest,
- completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void)
- -> URLSessionDataTask {
- return dataTask(with: request.asURLRequest(), completionHandler: completionHandler)
- }
- }
|