MultipartFormDataRequest.swift 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //
  2. // MultipartFormDataRequest.swift
  3. // NexilisLite
  4. //
  5. // Created by Kevin Maulana on 13/04/22.
  6. //
  7. import Foundation
  8. public struct MultipartFormDataRequest {
  9. private let boundary: String = UUID().uuidString
  10. private var httpBody = NSMutableData()
  11. let url: URL
  12. public init(url: URL) {
  13. self.url = url
  14. }
  15. public func addTextField(named name: String, value: String) {
  16. httpBody.append(textFormField(named: name, value: value))
  17. }
  18. private func textFormField(named name: String, value: String) -> String {
  19. var fieldString = "--\(boundary)\r\n"
  20. fieldString += "Content-Disposition: form-data; name=\"\(name)\"\r\n"
  21. fieldString += "Content-Type: text/plain; charset=ISO-8859-1\r\n"
  22. fieldString += "Content-Transfer-Encoding: 8bit\r\n"
  23. fieldString += "\r\n"
  24. fieldString += "\(value)\r\n"
  25. return fieldString
  26. }
  27. public func addDataField(named name: String, data: Data, mimeType: String) {
  28. httpBody.append(dataFormField(named: name, data: data, mimeType: mimeType))
  29. }
  30. private func dataFormField(named name: String,
  31. data: Data,
  32. mimeType: String) -> Data {
  33. let fieldData = NSMutableData()
  34. fieldData.append("--\(boundary)\r\n")
  35. fieldData.append("Content-Disposition: form-data; name=\"\(name)\"\r\n")
  36. fieldData.append("Content-Type: \(mimeType)\r\n")
  37. fieldData.append("\r\n")
  38. fieldData.append(data)
  39. fieldData.append("\r\n")
  40. return fieldData as Data
  41. }
  42. public func asURLRequest() -> URLRequest {
  43. var request = URLRequest(url: url)
  44. request.httpMethod = "POST"
  45. request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
  46. httpBody.append("--\(boundary)--")
  47. request.httpBody = httpBody as Data
  48. return request
  49. }
  50. }
  51. extension NSMutableData {
  52. public func append(_ string: String) {
  53. if let data = string.data(using: .utf8) {
  54. self.append(data)
  55. }
  56. }
  57. }
  58. extension URLSession {
  59. public func dataTask(with request: MultipartFormDataRequest,
  60. completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void)
  61. -> URLSessionDataTask {
  62. return dataTask(with: request.asURLRequest(), completionHandler: completionHandler)
  63. }
  64. }