В первой части я показал, как просто обнаружить ошибки HTTP при работе с curl
. Но на самом деле, подход, использованный в скрипте, немного неправильный:
Клиент может не знать все коды состояния, но он обязан отреагировать в соответствии с классом кода. В настоящее время выделено пять классов кодов состояния.
Т.е. объясняя по рабоче-крестьянски, не только код 200 может свидетельствовать об успешном завершении запроса, а другие коды, кроме явных клиентских или серверных ошибок, могут требовать от нас каких-либо действий.
Вообще, коды ответа HTTP разделены на 5 классов:
1xx
— информационные
2xx
— успешное завершение
3xx
— требуется переопределение
4xx
— ошибка, допущенная со стороны клиента
5xx
— ошибка, допущенная со стороны сервера
Вот и модифицируем наш скрипт в соответствии со стандартом.
В общем, надо из кода ответа HTTP извлечь первую цифру, и, соответственно прореагировать. Привожу часть скрипта, ответственного за более подробную реакцию на код ответа HTTP:
curl -o $SAVEFILE $1 -D $HEADERDUMP >/dev/null 2>/dev/null
EXITCODE=$?
if [ $EXITCODE -ne 0 ]; then
echo "CURL error $EXITCODE"
else
HTTPSTATUS=`cat $HEADERDUMP|head -1|awk '{print $2}'` #get HTTP status code
HTTPSTATUSMESS=`cat $HEADERDUMP|head -1|cut -d ' ' -f 3-
HTTPSTATUSID=`echo $HTTPSTATUS|cut -c 1` #get first char status code
case "$HTTPSTATUSID" in
1 ) echo -n "Informational: ";;
2 ) echo -n "Success: ";;
3 ) echo -n "Redirection: ";;
4 ) echo -n "Client Error: ";;
5 ) echo -n "Server Error: ";;
* ) echo -n "Unknow status: ";;
esac
echo "$HTTPSTATUS $HTTPSTATUSMESS"
fi
Жирным шрифтом выделена строка, в которой мы получаем этот самый класс кода возврата.
Курсивом — строка, где мы получаем пояснения текстовые пояснения к коду ответа.
Используемая в процессе анализа утилита cut
, в первом случае, позволяет нам вывести в переменную все символы после с третьего пробела.
Перед первым у нас версия протокола http, потом код ошибки, а потом пояснение, которое может содержать несколько пробелов, поэтому awk
тут не подходит.
cut
так же может работать с текстовыми данными, в которых есть разделители, например пробелы, или же с отдельными символами, как в той строке кода, что выделена жирным — так мы можем извлечь первую цифру из кода ответа.
Дальнейший анализ осуществляется с помощью оператора case
Пример работы
Скрипты
Расширенный анализ кодов состояния HTTP:
На Pastebin
На Github
PHP скрипт для проверки:
На Pastebin
На Github
Дополнительные источники
Краткий справочник по командам curl и wget Копия
Утилита cut
Коды статуса HTTP
Оператор case
Начало