6

Да, это связано с получением curl для вывода HTTP-кода состояния? но, к сожалению, не то же самое.

В сценарии я хотел бы запустить:

curl -qSfsw %{http_code} URL

где опция -f гарантирует, что код выхода не равен нулю, чтобы сигнализировать об ошибке. В случае успеха я хочу получить (текстовый) вывод из извлеченного файла, тогда как в противном случае я хочу использовать код ошибки.

Проблема:

  • Из-за условий гонки я не должен использовать более одного HTTP-запроса
  • Я не могу использовать временный файл для хранения контента

Как я могу все еще отделить код возврата HTTP от фактического вывода?


Псевдокод:

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

1 ответ1

16

Нет необходимости использовать временный файл. Следующий фрагмент сценария bash отправляет один запрос и печатает код выхода curl и код состояния HTTP или код состояния HTTP и ответ, в зависимости от ситуации.

# 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 (печатать все, кроме последней строки) требует GNU, не работает в BSD/OS X.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .