mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-05-25 17:09:53 +02:00
Skip splitting on escaped semicolons in splitCommands
A backslash-escaped semicolon (\;) outside quotes is a literal character in shell syntax, not a command separator. Reuse the existing isEscaped() helper to check delimiter parity. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -120,8 +120,8 @@ function splitCommands(rawData: string): string[] {
|
|||||||
|
|
||||||
const inQuote = inSingleQuote || inDoubleQuote || inDollarQuote;
|
const inQuote = inSingleQuote || inDoubleQuote || inDollarQuote;
|
||||||
|
|
||||||
// Split on ;, newline, or CRLF when not inside quotes
|
// Split on ;, newline, or CRLF when not inside quotes and not escaped
|
||||||
if (!inQuote && (ch === ';' || ch === '\n' || (ch === '\r' && next === '\n'))) {
|
if (!inQuote && !isEscaped(i) && (ch === ';' || ch === '\n' || (ch === '\r' && next === '\n'))) {
|
||||||
if (ch === '\r') i++; // Skip the \n in \r\n
|
if (ch === '\r') i++; // Skip the \n in \r\n
|
||||||
if (current.trim()) {
|
if (current.trim()) {
|
||||||
commands.push(current.trim());
|
commands.push(current.trim());
|
||||||
|
|||||||
@@ -599,6 +599,26 @@ describe('importer-curl', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Does not split on escaped semicolon outside quotes', () => {
|
||||||
|
// In shell, \; is a literal semicolon and should not split commands.
|
||||||
|
// This should be treated as a single curl command with the URL "https://yaak.app?a=1;b=2"
|
||||||
|
expect(
|
||||||
|
convertCurl('curl https://yaak.app?a=1\\;b=2'),
|
||||||
|
).toEqual({
|
||||||
|
resources: {
|
||||||
|
workspaces: [baseWorkspace()],
|
||||||
|
httpRequests: [
|
||||||
|
baseRequest({
|
||||||
|
url: 'https://yaak.app',
|
||||||
|
urlParameters: [
|
||||||
|
{ name: 'a', value: '1;b=2', enabled: true },
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
test('Imports multipart form data with text-only fields from --data-raw', () => {
|
test('Imports multipart form data with text-only fields from --data-raw', () => {
|
||||||
const curlCommand = `curl 'http://example.com/api' \
|
const curlCommand = `curl 'http://example.com/api' \
|
||||||
-H 'Content-Type: multipart/form-data; boundary=----FormBoundary123' \
|
-H 'Content-Type: multipart/form-data; boundary=----FormBoundary123' \
|
||||||
|
|||||||
Reference in New Issue
Block a user