Httpie: http ne fonctionne pas dans une boucle bash

Créé le 23 nov. 2013  ·  3Commentaires  ·  Source: 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!

Commentaire le plus utile

C'est parce que HTTPie lit par défaut STDIN , s'il est redirigé (ce qui est ici à l'intérieur de la boucle).

Il existe plusieurs façons de s'en débarrasser :

  • Le meilleur moyen est d'utiliser --ignore-stdin (qui existe pour résoudre exactement ce problème):
cat links.txt | while read url; do 
        http --ignore-stdin --verbose $url
done
  • Ou remplacez STDIN par le terminal :
cat links.txt | while read url; do
        http --verbose $url < /dev/tty
done
  • Ou, ne redirigez pas STDIN en premier lieu (attention aux espaces cependant) :
for url in `cat links.txt`; do 
        http --verbose $url
done

Voir aussi #150.

Tous les 3 commentaires

C'est parce que HTTPie lit par défaut STDIN , s'il est redirigé (ce qui est ici à l'intérieur de la boucle).

Il existe plusieurs façons de s'en débarrasser :

  • Le meilleur moyen est d'utiliser --ignore-stdin (qui existe pour résoudre exactement ce problème):
cat links.txt | while read url; do 
        http --ignore-stdin --verbose $url
done
  • Ou remplacez STDIN par le terminal :
cat links.txt | while read url; do
        http --verbose $url < /dev/tty
done
  • Ou, ne redirigez pas STDIN en premier lieu (attention aux espaces cependant) :
for url in `cat links.txt`; do 
        http --verbose $url
done

Voir aussi #150.

Le --ignore-stdin est ce que je cherchais. J'ai dû mettre à jour l'installé
version, mais semble fonctionner comme prévu maintenant.
J'adore httpie, mais cette petite chose m'a parfois fait comprendre...

Merci pour la réponse très rapide.
Acclamations!

Le samedi 23 novembre 2013 à 16h17, Jakub Roztočil [email protected] a écrit :

Fermé #181 https://github.com/jkbr/httpie/issues/181.


Répondez directement à cet e-mail ou consultez-le sur Gi tHubhttps://github.com/jkbr/httpie/issues/181
.

Filipe Gomes Esperandio

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

Salut, j'ai eu un problème similaire qui a été résolu via --ignore-stdin mais mon contexte est un peu différent :

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

Je recevais HTTP/1.1 422 Unprocessable Entity

Le script run.sh ressemble à ceci : seq 5 | xargs -I {} -n1 "$@"

L'ajout --ignore-stdin résout le problème, mais je ne lis pas la demande de STDIN . Pourriez-vous s'il vous plaît m'expliquer comment cela fonctionne dans ce contexte?

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

Abdallah-Obaid picture Abdallah-Obaid  ·  4Commentaires

eliangcs picture eliangcs  ·  5Commentaires

poskadesign picture poskadesign  ·  7Commentaires

sensibleish picture sensibleish  ·  3Commentaires

chuma picture chuma  ·  3Commentaires