Linux, curl, обнаружение и анализ ошибок HTTP. Улучшаем скрипт.

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

Начало

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *