diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f3982db4..1373fe1b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## [Unreleased] +### Fixed + +- Fix for - [#10139](https://github.com/postmanlabs/postman-app-support/issues/10139) Modify Swift codegen to work with multipart/form-data format, used for video file upload + ## [v1.8.0] - 2023-06-27 - Fix for - [#10521](https://github.com/postmanlabs/postman-app-support/issues/10521) Add support for Dart Dio snippet generation diff --git a/codegens/swift/lib/swift.js b/codegens/swift/lib/swift.js index 0f3cf5320..a27f2fd8d 100644 --- a/codegens/swift/lib/swift.js +++ b/codegens/swift/lib/swift.js @@ -111,29 +111,34 @@ function parseFormData (body, mode, trim, indent) { parameters = '[\n' + _.join(parameters, ',\n') + ']'; bodySnippet = `let parameters = ${parameters} as [[String: Any]]\n\n`; bodySnippet += 'let boundary = "Boundary-\\(UUID().uuidString)"\n'; - bodySnippet += 'var body = ""\nvar error: Error? = nil\n'; + bodySnippet += 'var body = Data()\nvar error: Error? = nil\n'; bodySnippet += 'for param in parameters {\n'; bodySnippet += `${indent}if param["disabled"] != nil { continue }\n`; bodySnippet += `${indent}let paramName = param["key"]!\n`; - bodySnippet += `${indent}body += "--\\(boundary)\\r\\n"\n`; + bodySnippet += `${indent}body += Data("--\\(boundary)\\r\\n".utf8)\n`; // eslint-disable-next-line no-useless-escape - bodySnippet += `${indent}body += "Content-Disposition:form-data; name=\\"\\(paramName)\\"\"\n`; + bodySnippet += `${indent}body += Data("Content-Disposition:form-data; name=\\"\\(paramName)\\"\".utf8)\n`; bodySnippet += `${indent}if param["contentType"] != nil {\n`; - bodySnippet += `${indent.repeat(2)}body += "\\r\\nContent-Type: \\(param["contentType"] as! String)"\n`; + bodySnippet += `${indent.repeat(2)}body += Data("\\r\\nContent-Type: \\(param["contentType"] as! String)".utf8)\n`; bodySnippet += `${indent}}\n`; bodySnippet += `${indent}let paramType = param["type"] as! String\n`; bodySnippet += `${indent}if paramType == "text" {\n`; bodySnippet += `${indent.repeat(2)}let paramValue = param["value"] as! String\n`; - bodySnippet += `${indent.repeat(2)}body += "\\r\\n\\r\\n\\(paramValue)\\r\\n"\n`; + bodySnippet += `${indent.repeat(2)}body += Data("\\r\\n\\r\\n\\(paramValue)\\r\\n".utf8)\n`; bodySnippet += `${indent}} else {\n`; bodySnippet += `${indent.repeat(2)}let paramSrc = param["src"] as! String\n`; - bodySnippet += `${indent.repeat(2)}let fileData = try NSData(contentsOfFile: paramSrc, options: []) as Data\n`; - bodySnippet += `${indent.repeat(2)}let fileContent = String(data: fileData, encoding: .utf8)!\n`; - bodySnippet += `${indent.repeat(2)}body += "; filename=\\"\\(paramSrc)\\"\\r\\n"\n`; - bodySnippet += `${indent.repeat(2)} + "Content-Type: \\"content-type header\\"\\r\\n\\r\\n`; - bodySnippet += '\\(fileContent)\\r\\n"\n'; - bodySnippet += `${indent}}\n}\nbody += "--\\(boundary)--\\r\\n";\n`; - bodySnippet += 'let postData = body.data(using: .utf8)'; + bodySnippet += `${indent.repeat(2)}let fileURL = URL(fileURLWithPath: paramSrc)\n`; + bodySnippet += `${indent.repeat(2)}if let fileContent = try? Data(contentsOf: fileURL) {\n`; + bodySnippet += `${indent.repeat(3)}body += Data("; filename=\\"\\(paramSrc)\\"\\r\\n".utf8)\n`; + bodySnippet += `${indent.repeat(3)}body += Data("Content-Type: \\"content-type header\\"\\r\\n".utf8)\n`; + bodySnippet += `${indent.repeat(3)}body += Data("\\r\\n".utf8)\n`; + bodySnippet += `${indent.repeat(3)}body += fileContent\n`; + bodySnippet += `${indent.repeat(3)}body += Data("\\r\\n".utf8)\n`; + bodySnippet += `${indent.repeat(2)}}\n`; + bodySnippet += `${indent}}\n`; + bodySnippet += '}\n'; + bodySnippet += 'body += Data("--\\(boundary)--\\r\\n".utf8);\n'; + bodySnippet += 'let postData = body\n'; return bodySnippet; } diff --git a/codegens/swift/test/unit/convert.test.js b/codegens/swift/test/unit/convert.test.js index ba8997124..5be4966fe 100644 --- a/codegens/swift/test/unit/convert.test.js +++ b/codegens/swift/test/unit/convert.test.js @@ -62,7 +62,7 @@ describe('Swift Converter', function () { } expect(snippet).to.be.a('string'); expect(snippet).to.contain('if param["contentType"] != nil {'); - expect(snippet).to.contain('body += "\\r\\nContent-Type: \\(param["contentType"] as! String)"'); + expect(snippet).to.contain('body += Data("\\r\\nContent-Type: \\(param["contentType"] as! String)".utf8)'); }); });