Questão Posso fazer o cURL falhar com um exitCode diferente de 0 se o código de status HTTP não for 200?


Eu estava sempre assumindo que quando o curl obtinha uma resposta HTTP 500 ele estava retornando um código de saída que significava falha (! = 0), mas isso parece ser não O caso.

Existe uma maneira que eu posso fazer cURL falhar com um exitCode diferente de 0 se o código de status HTTP não é 200? Eu sei que posso usar -w "%{http_code}" mas isso coloca em STDOUT, não como o código de saída (além disso, também estou interessado em capturar a saída, que não quero redirecionar para um arquivo, mas para a tela).


160


origem




Respostas:


curl --fail faz parte do que você quer:

a partir de man curl:

-f, --fail

(HTTP) Falha silenciosamente (sem saída) em erros do servidor. Isso é feito principalmente para habilitar melhor os scripts, etc., para lidar melhor com as tentativas fracassadas. Em casos normais, quando um servidor HTTP não consegue entregar um documento, ele retorna um documento em HTML declarando isso (o que frequentemente também descreve por que e mais). Esse sinalizador evitará que a curvatura produza isso e retorne o erro 22.

Este método não é à prova de falhas e há ocasiões em que códigos de resposta não bem-sucedidos passarão, especialmente quando a autenticação estiver envolvida (códigos de resposta 401 e 407).

Mas bloqueia a saída para a tela.


178



Então, quais partes fazem e não fazem? - rogerdpack
@rogerdpack tl; dr ele retorna diferente de zero quando detecta uma resposta ruim, mas não deixa a OP capturar a resposta - rampion
Isso não captura HTTP 301 Mover permanentemente. Curl ainda deu o código de saída 0. - wisbucky
@wisbucky 301 não é um erro, é um código de status de redirecionamento. Erros são códigos de status 4xx e 5xx. - M. Justin


Se você quiser apenas exibir o conteúdo da página enrolada, você pode fazer isso:

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

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

Isso grava o conteúdo da página em STDERR enquanto grava o código de status HTTP em STDOUT, para que possa ser atribuído à variável STATUSCODE.


61



Que tal se eu quiser produzir a resposta em caso de falha (não 200), mas devolva um não 0 código de status do script? - Justin
@Justin: E sobre if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi ? - ghoti
@ghoti: Apenas códigos de saída de 8 bits não assinados são suportados, o que pode tornar um pouco confuso. - Dennis
Ah, certo - e os códigos vão enrolar em 8 bits, então o erro 404 se torna o valor de saída 148, 500 se torna 244. Confuso, de fato! :-) - ghoti
Como uma pequena variação, isso captura o código em uma variável ao redirecionar a resposta para stdout, não stderr: { code=$(curl ... as above ...); } 2>&1 O truque é { ... } 2>&1 que permite redirecionar, enquanto não gerando um shell diferente ( ... ) seria. - Tobia


Eu consegui fazer isso usando uma combinação de sinalizadores:

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

--silente esconde o progresso e erro
--show-error mostra a mensagem de erro oculta por --silent
--falhou retorna um código de saída> 0 quando a solicitação falha


11



Isso não mostra a resposta do servidor. Eu não sou OP, mas suspeito que ele queria ver qualquer mensagem de erro do servidor que é retornado no corpo. Além de um --silent --show-error --fail funciona da mesma forma que -f/--fail. - waste
Na realidade, --fail retorna o código de saída 22, como documentado. - Quolonel Questions
Isso não captura HTTP 301 Mover permanentemente. Curl ainda deu o código de saída 0. - wisbucky
@wisbucky 301 não é um erro, é um código de status de redirecionamento. Erros são códigos de status 4xx e 5xx. - M. Justin