Инструмент командной строки cURL не сбрасывает заголовки ответов при сбое после продолжения - PullRequest
0 голосов
/ 08 мая 2020

У меня есть сценарий круглосуточного мониторинга на 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

1 Ответ

5 голосов
/ 08 мая 2020

Вы запросили такое поведение, используя --fail. Как говорится на странице руководства:

Fail silently (no output at all) on server errors. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...