Comment diviser le code d'erreur HTTP du contenu de cURL?

5

Oui, cela est lié à Obtenir curl pour afficher le code de statut HTTP? mais malheureusement pas la même chose.

Dans un script, j'aimerais lancer:

curl -qSfsw %{http_code} URL

où le -f Cette option garantit que le code de sortie est non nul pour signaler une erreur. En cas de succès, je souhaite obtenir la sortie (textuelle) du fichier récupéré, alors qu'autrement, je souhaite utiliser le code d'erreur.

Problème:

  • En raison de conditions de concurrence, je ne dois pas utiliser plus d'une requête HTTP.
  • Je ne peux pas utiliser de fichier temporaire pour stocker le contenu

Comment puis-je encore séparer le code de retour HTTP de la sortie réelle?


Pseudo code:

fetch URL
if http-error then
  print http-error-code
else
  print http-body # <- but without the HTTP status code
endif
0xC0000022L
la source

Réponses:

16

Il n'est pas nécessaire d'utiliser un fichier temporaire. L’extrait de script bash suivant envoie une seule demande et affiche le code de sortie de curl et le code d'état HTTP, ou le code d'état HTTP et la réponse, selon le cas.

# get output, append HTTP status code in separate line, discard error message
OUT=$( curl -qSfsw '\n%{http_code}' http://superuser.com ) 2>/dev/null

# get exit code
RET=$?

if [[ $RET -ne 0 ]] ; then
    # if error exit code, print exit code
    echo "Error $RET"

    # print HTTP error
    echo "HTTP Error: $(echo "$OUT" | tail -n1 )"
else
    # otherwise print last line of output, i.e. HTTP status code
    echo "Success, HTTP status is:"
    echo "$OUT" | tail -n1

    # and print all but the last line, i.e. the regular response
    echo "Response is:"
    echo "$OUT" | head -n-1
fi

head -n-1 (imprimer tout sauf la dernière ligne) nécessite GNU, ne fonctionne pas sous BSD / OS X.

Daniel Beck
la source
Pour OS X, remplacez ... head -n-1 ... par ... sed \ $ d
Zahnon