В первой части я показал, как просто обнаружить ошибки 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