Estou executando uma chamada curl do ASP com o objeto WScript.Shell.
Set objCmd = objWShell.Exec("cmd.exe /c echo "&dataString&" | /path/to/curl --cacert '/path/to/cert/cacert.pem' -X POST"&options&" -A """&useragent&""""&referer&" -F "&fileParamName&"=@-;type="&fileMIME&";filename=^"""&filename&"^"" --url """&url&"""")
O que este comando faz é enviar uma solicitação de curl com um arquivo anexado. O conteúdo do arquivo vem do stdin
(o echo
) para não precisar gravar um arquivo real no disco rígido.
Meu problema é que parece que algumas chamadas não estão funcionando corretamente, por causa dos caracteres no dataString
que quebram o comando. O dataString
contém JSON com entrada do usuário do banco de dados.
O conteúdo JSON já está codificado para que os caracteres sejam transformados em \b
, \t
, \n
, \f
, \r
, \"
, \/
, \
ou codificados como \uXXXX
caracteres, deixando o dataString
com esta aparência:
{"field":"User-String with \"encoded\" characters!\r\nSome other characters look like \u00FC or \u00E4.\r\nQuestion Marks?, Exclamation Marks!, 'SingleQuotes' and who knows what!"}
Então ... echo {"field":"..."} | ...
seria o String a ser executado.
Eu tentei até agora usar aspas duplas e aspas simples ou escapar com ^
, mas não está funcionando corretamente. Pelo menos se eu tentar simulá-lo com echo String | cat > testfile.txt
na minha janela de terminal.
De que personagens eu preciso escapar e como?
Editar:
Desde que eu escolhi a solução do devplayer para a chamada com a transferência de arquivos, você pode pensar que estou pronto. Mas agora eu tenho outro tipo de chamada sem uma transferência de arquivos sem a necessidade de um pipe, mas com o mesmo problema de entrada do usuário que precisa ser escapado corretamente.
É como:
curl ... -d "<properly escaped string>" --url ...