У меня есть сценарий круглосуточного мониторинга на Linux, который пытается поймать случайный сбой непослушной конечной точки HTTP. curl
сбои команд регистрируются.
Наша команда: $ curl --verbose --fail --location --cookie cookiejar.txt --header 'Content-Type: application/json' --header 'X-TOKEN: XYZ' --request POST --data @body.json --dump-header response_headers.txt --output response_body.txt https://example.com/search 2> stderr.txt
(Интересно, что эта команда выводит ничего в STDOUT.)
Поскольку мы выкладываем данные, curl
добавляет стандартный заголовок запроса Expect: 100-continue
. Таким образом, ответ сервера начинается с: HTTP/1.1 100 Continue
, но затем заканчивается (в случае ошибки) одним из следующих вариантов:
HTTP/1.1 504 Gateway Timeout
HTTP/1.1 500 Internal Server Error
После сбоя команды файл response_headers.txt
слишком короткий (см. Пример ниже), а файл response_body.txt
пуст. Этот ответ об ошибке должен возвращать заголовки и необязательное тело. Если я использую Google Chrome Developer Tools, обычно все HTTP-ответы имеют заголовки, включая ошибки (5xx).
Вопрос: Мне не хватает другого curl
аргумента команды для сброса всего HTTP заголовки (и тело) ответа при сбое после продолжения?
Насколько я помню, в других тестах запросы HTTP GET, которые завершаются неудачно без продолжения, будут отображать заголовки и тело ответа. У меня эта проблема возникает только с HTTP POST -> продолжить -> сбой.
Примеры выходных данных:
---------------------------------------------------------------------------------------
curl command output [stderr.txt]:
---------------------------------------------------------------------------------------
* About to connect() to example.com port 443 (#0)
* Trying 210.205.40.45... connected
* Connected to example.com (210.205.40.45) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
* Server certificate:
...
> POST /search HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.44 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: example.com
> Accept: */*
> Cookie: ...
> Content-Type: application/json
> X-TOKEN: XYZ
> Content-Length: 8434
> Expect: 100-continue
>
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 8434 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0< HTTP/1.1 100 Continue
} [data not shown]
100 8434 0 0 100 8434 0 5143 0:00:01 0:00:01 --:--:-- 8417
100 8434 0 0 100 8434 0 3193 0:00:02 0:00:02 --:--:-- 4210* The requested URL returned error: 504 Gateway Timeout
100 8434 0 0 100 8434 0 2856 0:00:02 0:00:02 --:--:-- 3641* Closing connection #0
curl: (22) The requested URL returned error: 504 Gateway Timeout
---------------------------------------------------------------------------------------
curl command output [response_headers.txt]:
---------------------------------------------------------------------------------------
HTTP/1.1 100 Continue