C'est une limitation douloureuse de curl --fail
. De man curl
:
-f, --fail (HTTP) Échoue silencieusement (aucune sortie) en cas d'erreurs du serveur
Mais il n'y a aucun moyen d'obtenir à la fois le code de retour non nul ET le corps de la réponse dans stdout.
Basé sur la réponse de pvandenberk et cette autre astuce très utile apprise sur SO, voici un contournement :
curl_with_error_code () {
_curl_with_error_code "$@" | sed '$d'
}
_curl_with_error_code () {
local curl_error_code http_code
exec 17>&1
http_code=$(curl --write-out '\n%{http_code}\n' "$@" | tee /dev/fd/17 | tail -n 1)
curl_error_code=$?
exec 17>&-
if [ $curl_error_code -ne 0 ]; then
return $curl_error_code
fi
if [ $http_code -ge 400 ] && [ $http_code -lt 600 ]; then
echo "HTTP $http_code" >&2
return 127
fi
}
Cette fonction se comporte exactement comme curl
, mais renverra 127 (un code de retour non utilisé par curl
) en cas de code HTTP dans la plage [400, 600[.
0 votes
Pour ma part, je peux voir dans le manuel comment obtenir le code de statut HTTP, mais l'option -w ne fonctionne pas. J'ai signalé le bug à Apple.
71 votes
Le drapeau
-i
, comme danscurl -i https://www.example.com/
, est probablement ce que vous voulez, selon superuser.com/a/514798/1901880 votes
Pourquoi ne pas simplement quelque chose comme
curl -IL http://www.example.com | grep "^HTTP\/"
?11 votes
Ne pas oublier à ton futur toi-même : la réponse que tu veux est probablement celle de Cyril David (actuellement en 4ème position)