[network] Fix escaping of curl commands for cmd.exe.
When the parameters contain special characters like % or ", the
parameter has to be enclosed in ^"...^" instead of just "...".
Drive-by-fix: Narrow types for platform parameter.
Fixed: chromium:798498
Change-Id: I4201a32f9c6da67f908432153cbaea8f825137d9
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/5126052
Auto-Submit: Benedikt Meurer <[email protected]>
Reviewed-by: Simon Zünd <[email protected]>
diff --git a/front_end/panels/network/NetworkLogView.ts b/front_end/panels/network/NetworkLogView.ts
index 55edc3c..1573079 100644
--- a/front_end/panels/network/NetworkLogView.ts
+++ b/front_end/panels/network/NetworkLogView.ts
@@ -1817,12 +1817,12 @@
Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(JSON.stringify(harArchive, null, 2));
}
- private async copyCurlCommand(request: SDK.NetworkRequest.NetworkRequest, platform: string): Promise<void> {
+ private async copyCurlCommand(request: SDK.NetworkRequest.NetworkRequest, platform: 'unix'|'win'): Promise<void> {
const command = await NetworkLogView.generateCurlCommand(request, platform);
Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(command);
}
- private async copyAllCurlCommand(platform: string): Promise<void> {
+ private async copyAllCurlCommand(platform: 'unix'|'win'): Promise<void> {
const commands = await this.generateAllCurlCommand(Logs.NetworkLog.NetworkLog.instance().requests(), platform);
Host.InspectorFrontendHost.InspectorFrontendHostInstance.copyText(commands);
}
@@ -2266,15 +2266,15 @@
return commands.join(' ;\n');
}
- static async generateCurlCommand(request: SDK.NetworkRequest.NetworkRequest, platform: string): Promise<string> {
+ static async generateCurlCommand(request: SDK.NetworkRequest.NetworkRequest, platform: 'unix'|'win'):
+ Promise<string> {
let command: string[] = [];
// Most of these headers are derived from the URL and are automatically added by cURL.
// The |Accept-Encoding| header is ignored to prevent decompression errors. crbug.com/1015321
const ignoredHeaders = new Set<string>(['accept-encoding', 'host', 'method', 'path', 'scheme', 'version']);
function escapeStringWin(str: string): string {
- /* If there are no new line characters do not escape the " characters
- since it only uglifies the command.
+ /* Only escape the " characters when necessary.
Because cmd.exe parser and MS Crt arguments parsers use some of the
same escape characters, they can interact with each other in
@@ -2300,7 +2300,7 @@
new line is there to enact the escape command the second is the character
to escape (in this case new line).
*/
- const encapsChars = /[\r\n]/.test(str) ? '^"' : '"';
+ const encapsChars = /[\r\n]|[^a-zA-Z0-9\s_\-:=+~'\/.',?;()*`&]/.test(str) ? '^"' : '"';
return encapsChars +
str.replace(/\\/g, '\\\\')
.replace(/"/g, '\\"')
@@ -2382,7 +2382,7 @@
return 'curl ' + command.join(command.length >= 3 ? (platform === 'win' ? ' ^\n ' : ' \\\n ') : ' ');
}
- private async generateAllCurlCommand(requests: SDK.NetworkRequest.NetworkRequest[], platform: string):
+ private async generateAllCurlCommand(requests: SDK.NetworkRequest.NetworkRequest[], platform: 'unix'|'win'):
Promise<string> {
const nonBlobRequests = this.filterOutBlobRequests(requests);
const commands =