Httpie: http não funciona dentro de um loop bash

Criado em 23 nov. 2013  ·  3Comentários  ·  Fonte: httpie/httpie

Looks like a leackage.

I have this file, links.txt:
www.google.com?q=1  
www.google.com?q=2  
www.google.com?q=3  
www.google.com?q=4  


Running this:
$ cat links.txt | while read line; do http --print BHhb GET $line; done

Expected result:
4 http calls, one for each line on the file.

Actual:
1 request executed to the first url in the file and request body having the other 3 lines.

GET /?q=1 HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate, compress
Content-Length: 63
Content-Type: application/json; charset=utf-8
Host: www.google.com
User-Agent: HTTPie/0.6.0

www.google.com?q=2
www.google.com?q=3
www.google.com?q=4

HTTP/1.0 400 Bad Request
Content-Length: 925
Content-Type: text/html; charset=UTF-8
Date: Sat, 23 Nov 2013 19:48:51 GMT
Server: GFE/2.0

<!DOCTYPE html>
<html lang=en>
  <meta charset=utf-8>
  <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
  <title>Error 400 (Bad Request)!!1</title>
  <style>
    *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}<strong i="5">@media</strong> screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}
  </style>
  <a href=//www.google.com/><img src=//www.google.com/images/errors/logo_sm.gif alt=Google></a>
  <p><b>400.</b> <ins>That’s an error.</ins>
  <p>Your client has issued a malformed or illegal request.  <ins>That’s all we know.</ins>



Running same script with curl instead works as expected.


cheers!

Comentários muito úteis

É porque HTTPie por padrão lê STDIN , se for redirecionado (que está aqui dentro do loop).

Existem várias maneiras de se livrar dele:

  • A melhor maneira é usar --ignore-stdin (que existe para resolver exatamente esse problema):
cat links.txt | while read url; do 
        http --ignore-stdin --verbose $url
done
  • Ou altere STDIN de volta para o terminal:
cat links.txt | while read url; do
        http --verbose $url < /dev/tty
done
  • Ou, não redirecione STDIN em primeiro lugar (cuidado com os espaços):
for url in `cat links.txt`; do 
        http --verbose $url
done

Veja também #150.

Todos 3 comentários

É porque HTTPie por padrão lê STDIN , se for redirecionado (que está aqui dentro do loop).

Existem várias maneiras de se livrar dele:

  • A melhor maneira é usar --ignore-stdin (que existe para resolver exatamente esse problema):
cat links.txt | while read url; do 
        http --ignore-stdin --verbose $url
done
  • Ou altere STDIN de volta para o terminal:
cat links.txt | while read url; do
        http --verbose $url < /dev/tty
done
  • Ou, não redirecione STDIN em primeiro lugar (cuidado com os espaços):
for url in `cat links.txt`; do 
        http --verbose $url
done

Veja também #150.

O --ignore-stdin é o que eu estava procurando. tive que atualizar o instalado
versão, mas parece estar funcionando como esperado agora.
Eu amo httpie, mas essa coisinha me fez pensar...

Obrigado pela resposta muito rápida.
Felicidades!

No sábado, 23 de novembro de 2013 às 16h17, Jakub Roztočil [email protected] escreveu :

Fechado #181 https://github.com/jkbr/httpie/issues/181.


Responda a este e-mail diretamente ou visualize-o no Gi tHubhttps://github.com/jkbr/httpie/issues/181
.

Filipe Gomes Esperança

Gtalk: [email protected]
Skype: filipesperandio
Google Voice: +1 650 701 7057

Oi, eu tive um problema semelhante que foi resolvido via --ignore-stdin mas meu contexto é um pouco diferente:

./run.sh http https://base-url/endpoint\?attributes=all\&nested_attribbutes\=all Authorization:Bearer\ bf54b184d7729ac9bfffb576782e2a1d3cd7bd76 Content-Type:application/json Accept:\ \*/\* -h

Eu estava recebendo HTTP/1.1 422 Unprocessable Entity

O script run.sh tem a seguinte aparência: seq 5 | xargs -I {} -n1 "$@"

Adicionar --ignore-stdin corrige o problema, mas não estou lendo a solicitação de STDIN . Você poderia me explicar como funciona neste contexto?

Esta página foi útil?
0 / 5 - 0 avaliações