Соединение закрыто, потому что сервер так говорит. Смотрите на скриншот, на одну строку выше, где "В чем проблема здесь?"Очки.
HTTP/1.1 401 Unauthorized
[...]
Connection: close
Content-Type: application/x-asmx
И, вероятно, сервер впоследствии закрывает соединение.
Так что это не действие, а результат. Сообщение отправляется в Curl_http_readwrite_headers
:
#if defined(USE_NTLM)
if(conn->bits.close &&
(((data->req.httpcode == 401) &&
(conn->http_ntlm_state == NTLMSTATE_TYPE2)) ||
((data->req.httpcode == 407) &&
(conn->proxy_ntlm_state == NTLMSTATE_TYPE2)))) {
infof(data, "Connection closure while negotiating auth (HTTP 1.0?)\n");
data->state.authproblem = TRUE;
}
#endif
#if defined(USE_SPNEGO)
if(conn->bits.close &&
(((data->req.httpcode == 401) &&
(conn->http_negotiate_state == GSS_AUTHRECV)) ||
((data->req.httpcode == 407) &&
(conn->proxy_negotiate_state == GSS_AUTHRECV)))) {
infof(data, "Connection closure while negotiating auth (HTTP 1.0?)\n");
data->state.authproblem = TRUE;
}
Предположительно из первого блока (NTLM), но это два вхождения, и они все равно находятся рядом друг с другом.
Интересный факт: та же самая функция только много позже проверяет наличие заголовка Connection: close
, поэтому установка мистического флага conn->bits.close
, вероятно, означает, что сервер уже разорвал соединениеи это было обнаружено на уровне сокетов.
Примечание: две стороны сравнения показывают очень разнородные взаимодействия. Слева находится практически пустой запрос GET
(предоставляются заголовки Host
, Authorization
, User-Agent
и Accept
), а справа - более сложный запрос POST
(такой жезаголовки плюс Method
, SOAPAction
, пустой контент с Expect
для продолжения).