Всем привет. Есть хороший модуль:
nginx http push module. Он позволяет реализовать long-poll.
Суть работы проста: есть адрес для отправки событий на какой-то канал, есть адрес для чтения события из указанного канала.
Чтобы опубликовать канал я делаю POST-запрос вида:
> POST /pub?channel=1 HTTP/1.1
> User-Agent: test
> Host: localhost
> Accept: */*
> Content-Length: 4
> Content-Type: application/x-www-form-urlencoded
>
TEST * upload completely sent off: 4 out of 4 bytes
Ответ:
< HTTP/1.1 202 Accepted
< Server: nginx
< Date: Fri, 20 Apr 2012 10:29:44 GMT
< Content-Type: text/plain
< Content-Length: 81
< Connection: keep-alive
Тут текст о том, что сообщение добавлено
Все нормально, а теперь я хочу, чтобы клиент читал этот канал. Проблема в том, что сервер обрывает GET запрос. То есть я делаю:
> GET /sub?channel=1 HTTP/1.1
> User-Agent: test
> Host: localhost
> Accept: */*
Получаю ответ:
< HTTP/1.1 200 OK
< Server: nginx
< Date: Fri, 20 Apr 2012 10:29:34 GMT
< Content-Type: application/x-www-form-urlencoded
< Content-Length: 4
< Last-Modified: Fri, 20 Apr 2012 10:29:34 GMT
< Connection: keep-alive
< Etag: 0
< Vary: If-None-Match, If-Modified-Since
<
* Connection #0 to host localhost left intact
TEST* Closing connection #0
Так вот, мне не нравится «Closing connection». Неужели это правильно, что клиент/подписчик посылает GET-запрос, получает последнее сообщение и отключается? Я до этого использовал модуль nginx push stream, там подключение висело и клиент раз посылал GET-запрос а потом только читал из сокета поступающие соединения из канала. Может я чего-то не так делаю?
В документации написано, типа можно этим управлять через заголовки Etag, If-None-Match, If-Modifief-Since, но смысл в них, если для их использования каждый раз нужно составлять GET-запрос. Запросы шлются
очень часто, поэтому я не могу постоянно пересоздавать подключение между клиентом и сервером.