Pregunta ¿Puedo hacer que cURL falle con un código de salida diferente de 0 si el código de estado HTTP no es 200?


Siempre estuve asumiendo que cuando curl obtuvo una respuesta HTTP 500 estaba devolviendo un código de salida que significaba falla (! = 0), pero eso parece ser no el caso.

¿Existe alguna manera de que pueda hacer que cURL falle con un código de salida diferente de 0 si el código de estado HTTP no es 200? Sé que puedo usar -w "%{http_code}" pero eso lo pone en STDOUT, no como el código de salida (además, también estoy interesado en capturar la salida, que no quiero redirigir a un archivo, sino a la pantalla).


160


origen




Respuestas:


curl --fail hace parte de lo que quieres:

de man curl:

-f, --fail

(HTTP) Falló silenciosamente (sin salida) en los errores del servidor. Esto se hace principalmente para habilitar mejor los scripts, etc., para tratar mejor los intentos fallidos. En casos normales, cuando un servidor HTTP no puede entregar un documento, devuelve un documento HTML que así lo indica (que a menudo también describe por qué y más). Este indicador evitará que curl lo genere y devuelva el error 22.

Este método no es seguro y hay ocasiones en que los códigos de respuesta no exitosos se deslizarán, especialmente cuando se trata de autenticación (códigos de respuesta 401 y 407).

Pero bloquea la salida a la pantalla.


178



Entonces, ¿qué partes de él hace y qué no hace? - rogerdpack
@rogerdpack tl; dr devuelve un valor distinto de cero cuando detecta una mala respuesta, pero no permite que OP capture la respuesta - rampion
Esto no detecta HTTP 301 Mover permanentemente. Curl todavía dio el código de salida 0. - wisbucky
@wisbucky 301 no es un error, es un código de estado de redirección. Los errores son códigos de estado 4xx y 5xx. - M. Justin


Si solo desea mostrar el contenido de la página curvada, puede hacer esto:

STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)

if test $STATUSCODE -ne 200; then
    # error handling
fi

Esto escribe el contenido de la página en STDERR mientras escribe el código de estado HTTP en STDOUT, por lo que se puede asignar a la variable CÓDIGO DE ESTADO.


61



¿Qué tal si quiero dar salida a la respuesta en caso de falla? (no 200), pero devuelve un no 0 código de estado del script? - Justin
@Justin: ¿Qué tal if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi ? - ghoti
@ghoti: Solo se admiten códigos de salida de 8 bits sin firmar, por lo que podría ser un poco confuso. - Dennis
Ah, a la derecha, y los códigos se envolverán en 8 bits, por lo que el error 404 se convierte en el valor de salida 148, 500 se convierte en 244. ¡De hecho, confuso! :-) - ghoti
Como una ligera variación, esto captura el código en una variable mientras se redirige la respuesta a stdout, no stderr: { code=$(curl ... as above ...); } 2>&1 El truco es { ... } 2>&1 que permite el redireccionamiento, mientras que no genera un shell diferente como ( ... ) haría. - Tobia


Pude hacerlo usando una combinación de banderas:

curl --silent --show-error --fail URL

--silencio oculta el progreso y el error
--show-error muestra el mensaje de error oculto por --silent
--fallar devuelve un código de salida> 0 cuando falla la solicitud


11



Esto no muestra la respuesta del servidor. No soy OP, pero sospecho que quería ver cualquier mensaje de error del servidor que se devuelve en el cuerpo. Además de un --silent --show-error --fail funciona igual que solo -f/--fail. - waste
Actualmente, --fail devuelve el código de salida 22, como documentado. - Quolonel Questions
Esto no detecta HTTP 301 Mover permanentemente. Curl todavía dio el código de salida 0. - wisbucky
@wisbucky 301 no es un error, es un código de estado de redirección. Los errores son códigos de estado 4xx y 5xx. - M. Justin