Назад | Перейти на главную страницу

HTTP-клиент утекает соединения, когда включен keep-alive

Я настроил HTTP-сервер для встроенной системы для связи с известным незащищенным удаленным клиентским приложением.

Мне пришлось отключить поддержку активности на моем сервере, поскольку удаленное клиентское приложение всегда запрашивает поддержку активности, но никогда не использует соединение повторно. Вместо этого клиент открывает новое соединение для каждого запроса и оставляет старое открытым на неопределенный срок.

Например:

Клиент отправляет:

POST /my_server_path HTTP/1.1
accept: text/plain, */*; q=0.01
accept-encoding: gzip
connection: keep-alive
content-length: 4
content-type: application/x-www-form-urlencoded;charset=UTF-8
host: some_host:1234
origin: https://the_origin.com

test

Мой сервер отвечает:

HTTP/1.1 200 OK
access-control-allow-headers: post-body
access-control-allow-origin: https://the_origin.com
allow: POST, OPTIONS
connection: keep-alive
content-length: 4
content-type: text/html
date: Mon, 01 Feb 2018 15:00:00 GMT
server: MyServer/1.0

test

Хотя мой HTTP-сервер поддерживает закрытие устаревших подключений, я начал отправлять Connection: closed для каждого запроса по снижению нагрузки на систему.

Это нормально, я что-то упускаю или правильно предполагаю, что это ошибка удаленного клиентского приложения?

Хотя это и нехорошо, клиент может закрыть соединение и использовать другое. Конечно, глупо запрашивать keep-alive, а затем не использовать его, поэтому вы можете нацелить его как на ошибку, но это все же то, что может случиться. Это также может быть связано с прокси в пути.

См. RFC 7230 и обратите внимание на «МОЖЕТ»:

Клиент МОЖЕТ отправлять дополнительные запросы по постоянному соединению до тех пор, пока он не отправит или не получит параметр соединения «закрыть» или не получит ответ HTTP / 1.0 без параметра соединения «keep-alive».

Вот почему серверу не следует поддерживать слишком много открытых поддерживающих соединений в течение слишком долгого времени. Он может сигнализировать о своей политике клиенту с помощью Keep-Alive заголовок.

Увидеть max и timeout параметр объяснен в https://tools.ietf.org/id/draft-thomson-hybi-http-timeout-01.html