From 46fec025db30b98996b6c942b3e8287fe20427ef Mon Sep 17 00:00:00 2001 From: askalf <263217947+askalf@users.noreply.github.com> Date: Thu, 24 Sep 2026 12:32:18 +0000 Subject: [PATCH] fix: use --data-binary in cURL sample for application/octet-stream body --- .../__tests__/convertRequestToSample.spec.ts | 23 +++++++++++++++++++ .../RequestSamples/convertRequestToSample.ts | 4 +++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/elements-core/src/components/RequestSamples/__tests__/convertRequestToSample.spec.ts b/packages/elements-core/src/components/RequestSamples/__tests__/convertRequestToSample.spec.ts index f79e36f63..6b5c9bb24 100644 --- a/packages/elements-core/src/components/RequestSamples/__tests__/convertRequestToSample.spec.ts +++ b/packages/elements-core/src/components/RequestSamples/__tests__/convertRequestToSample.spec.ts @@ -116,3 +116,26 @@ describe('curly bracket encoding', () => { expect(result).toContain('%7B%22categories%22'); // Query parameter curly brackets should be encoded }); }); + +describe('application/octet-stream body', () => { + const harWithFile = { + method: 'POST', + url: 'https://todos.stoplight.io/todos', + httpVersion: 'HTTP/1.1', + cookies: [], + headers: [{ name: 'Content-Type', value: 'application/octet-stream' }], + queryString: [], + postData: { + mimeType: 'application/octet-stream', + text: '@some-file.bin', + }, + headersSize: -1, + bodySize: -1, + }; + + it('should send the file unmodified with --data-binary in curl', async () => { + const result = await convertRequestToSample('shell', 'curl', harWithFile); + + expect(result).toContain('--data-binary @some-file.bin'); + }); +}); diff --git a/packages/elements-core/src/components/RequestSamples/convertRequestToSample.ts b/packages/elements-core/src/components/RequestSamples/convertRequestToSample.ts index aaa1d9c4c..316ce6037 100644 --- a/packages/elements-core/src/components/RequestSamples/convertRequestToSample.ts +++ b/packages/elements-core/src/components/RequestSamples/convertRequestToSample.ts @@ -12,7 +12,9 @@ export const convertRequestToSample = async ( try { const snippet = new HTTPSnippet(request); - let converted = await snippet.convert(language, library); + // Makes cURL use --data-binary, as --data strips newlines and null bytes from the uploaded file + const options = request.postData?.mimeType === 'application/octet-stream' ? { binary: true } : undefined; + let converted = await snippet.convert(language, library, options); if (Array.isArray(converted)) { converted = converted[0];