Httpie: http no funciona dentro de un ciclo bash

Creado en 23 nov. 2013  ·  3Comentarios  ·  Fuente: 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!

Comentario más útil

Es porque HTTPie de forma predeterminada lee STDIN , si se redirige (que está aquí dentro del bucle).

Hay varias formas de deshacerse de él:

  • La mejor manera es usar --ignore-stdin (que existe para resolver exactamente este problema):
cat links.txt | while read url; do 
        http --ignore-stdin --verbose $url
done
  • O cambie STDIN de regreso a la terminal:
cat links.txt | while read url; do
        http --verbose $url < /dev/tty
done
  • O bien, no redirija STDIN en primer lugar (sin embargo, tenga cuidado con los espacios):
for url in `cat links.txt`; do 
        http --verbose $url
done

Ver también #150.

Todos 3 comentarios

Es porque HTTPie de forma predeterminada lee STDIN , si se redirige (que está aquí dentro del bucle).

Hay varias formas de deshacerse de él:

  • La mejor manera es usar --ignore-stdin (que existe para resolver exactamente este problema):
cat links.txt | while read url; do 
        http --ignore-stdin --verbose $url
done
  • O cambie STDIN de regreso a la terminal:
cat links.txt | while read url; do
        http --verbose $url < /dev/tty
done
  • O bien, no redirija STDIN en primer lugar (sin embargo, tenga cuidado con los espacios):
for url in `cat links.txt`; do 
        http --verbose $url
done

Ver también #150.

El --ignore-stdin es lo que estaba buscando. Tuve que actualizar el instalado
versión, pero parece estar funcionando como se esperaba ahora.
Me encanta httpie, pero esta cosita me hizo pensar en algún momento...

Gracias por la respuesta muy rápida.
¡Salud!

El sábado 23 de noviembre de 2013 a las 16:17, Jakub Roztočil [email protected] escribió:

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


Responda a este correo electrónico directamente o véalo en Gi tHubhttps://github.com/jkbr/httpie/issues/181
.

Filipe Gomes Esperandio

Gtalk: [email protected]
Skype: Filipperando
Voz de Google: +1 650 701 7057

Hola, tuve un problema similar que se resolvió a través --ignore-stdin pero mi contexto es un poco diferente:

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

Estaba recibiendo HTTP/1.1 422 Unprocessable Entity

El script run.sh tiene el siguiente aspecto: seq 5 | xargs -I {} -n1 "$@"

Agregar --ignore-stdin soluciona el problema, pero no estoy leyendo la solicitud de STDIN . ¿Podría explicarme cómo funciona en este contexto?

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

eliangcs picture eliangcs  ·  5Comentarios

chuma picture chuma  ·  3Comentarios

loretoparisi picture loretoparisi  ·  6Comentarios

tonsV2 picture tonsV2  ·  4Comentarios

jclem picture jclem  ·  6Comentarios