Httpie: http funktioniert nicht innerhalb einer Bash-Schleife

Erstellt am 23. Nov. 2013  ·  3Kommentare  ·  Quelle: 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!

Hilfreichster Kommentar

Das liegt daran, dass HTTPie standardmäßig STDIN liest, wenn es umgeleitet wird (was es hier in der Schleife ist).

Es gibt mehrere Möglichkeiten, es loszuwerden:

  • Der beste Weg ist, --ignore-stdin zu verwenden (das existiert, um genau dieses Problem zu lösen):
cat links.txt | while read url; do 
        http --ignore-stdin --verbose $url
done
  • Oder ändern STDIN zurück in Terminal:
cat links.txt | while read url; do
        http --verbose $url < /dev/tty
done
  • Oder leite STDIN gar nicht erst um (achte aber auf Leerzeichen):
for url in `cat links.txt`; do 
        http --verbose $url
done

Siehe auch Nr. 150.

Alle 3 Kommentare

Das liegt daran, dass HTTPie standardmäßig STDIN liest, wenn es umgeleitet wird (was es hier in der Schleife ist).

Es gibt mehrere Möglichkeiten, es loszuwerden:

  • Der beste Weg ist, --ignore-stdin zu verwenden (das existiert, um genau dieses Problem zu lösen):
cat links.txt | while read url; do 
        http --ignore-stdin --verbose $url
done
  • Oder ändern STDIN zurück in Terminal:
cat links.txt | while read url; do
        http --verbose $url < /dev/tty
done
  • Oder leite STDIN gar nicht erst um (achte aber auf Leerzeichen):
for url in `cat links.txt`; do 
        http --verbose $url
done

Siehe auch Nr. 150.

Das --ignore-stdin ist das, wonach ich gesucht habe. Ich musste die installierten aktualisieren
Version, scheint aber jetzt wie erwartet zu funktionieren.
Ich liebe httpie, aber dieses kleine Ding hat mich irgendwann dazu gebracht zu verstehen ...

Danke für die sehr schnelle Antwort.
Beifall!

Am Samstag, den 23. November 2013 um 16:17 Uhr schrieb Jakub Roztočil [email protected] :

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


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHubhttps://github.com/jkbr/httpie/issues/181 an
.

Filipe Gomes Esperandio

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

Hallo, ich hatte ein ähnliches Problem, das über --ignore-stdin gelöst wurde, aber mein Kontext ist etwas anders:

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

Ich bekam HTTP/1.1 422 Unprocessable Entity

Das Skript run.sh sieht folgendermaßen aus: seq 5 | xargs -I {} -n1 "$@"

Das Hinzufügen --ignore-stdin behebt das Problem, aber ich lese die Anfrage von STDIN nicht. Können Sie mir bitte erklären, wie es in diesem Zusammenhang funktioniert?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen