Alexandr Gomoliako Wrote:
> Нет, это же вы писали вроде, что nginx закрывает соединение while
> reading response header. А это значит, что запрос уже давным давно
> отправлен и nginx уже ждет ответа.
Именно так, nginx отправил запрос, это я проверял снифером, и ждет ответа.
> Скорее всего этот запрос уже даже прочитан в буфер вашим сервером, но
> где-то у вас ошибка, что ему кажется, что нужно больше данных и он
> опять ждет.
> Но раз вы используете http функции libevent, то ошибка наверное в них.
Нет, запрос принят ОС на транспортном уровне, снифер это подтверждает, но данные не поступили на прикладной уровень, где libevent будет парсить http запрос. Я логирую вызовы libevent, конкретно вызов kq_dispatch, в котором libevent получает от Kqueue сокеты с которых можно считать данные. И Kqueue не возращает в libevent эти проблемные сокеты пока nginx не закроет соединение, а возвращает как только соединение закрывается, далее libevent считывает данные и начинает парсить http.
Собственно мой вопрос был: почему Kqueue может не возвращать сокет приложению для чтения данных, хотя известно что данные ОС для данного соединения уже получила.