Skip to content

Commit

Permalink
Merge pull request #714 from postmanlabs/github-10139-swift-generated…
Browse files Browse the repository at this point in the history
…-code-for-multipart-form-data-video-upload-does-not-work-from-device-simulator

[GITHUB-10139][Fix] Generated Swift code not working for multipart/form-data video upload
  • Loading branch information
aman-v-singh committed Jul 7, 2023
2 parents fce73e6 + e0c3bda commit 89f2f71
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 13 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
29 changes: 17 additions & 12 deletions codegens/swift/lib/swift.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion codegens/swift/test/unit/convert.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)');
});
});

Expand Down

0 comments on commit 89f2f71

Please sign in to comment.