Асинхронные ответы с Aleph не принимаются по IPv4, но с IPv6

Я пытаюсь настроить отправленные сервером события в Clojure с Aleph, но он не работает по IPv4. Все хорошо, если я подключаюсь по IPv6. Это происходит как в Linux, так и в MacOS. У меня есть полный пример того, о чем я говорю на GitHub.

Я не думаю, что я делаю что-то особенно необычное. Весь код на GitHub, но по сути моя программа:

(def my-channel (permanent-channel))

(defroutes app-routes
  (GET "/events" []
    {:headers {"Content-Type" "text/event-stream"}
     :body my-channel}))

(def app
  (handler/site app-routes))

(start-server (wrap-ring-handler app) {:port 3000}))

Тем не менее, когда я подключаюсь к 127.0.0.1:3000Я вижу, что curl отправляет заголовки запроса, но он просто зависает, никогда не печатая заголовки ответа:

$ curl -vvv http://127.0.0.1:3000/events

* About to connect() to 127.0.0.1 port 3000 (#0)
*   Trying 127.0.0.1...
* Adding handle: conn: 0x7f920a004400
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7f920a004400) send_pipe: 1, recv_pipe: 0
* Connected to 127.0.0.1 (127.0.0.1) port 3000 (#0)
> GET /events HTTP/1.1
> User-Agent: curl/7.30.0
> Host: 127.0.0.1:3000
> Accept: */*

Если я подключаюсь через IPv6, ответ приходит сразу же, и события, которые я enqueue в канале отправляются правильно:

$ curl -vvv http://localhost:3000/events

* Adding handle: conn: 0x7f943c001a00
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7f943c001a00) send_pipe: 1, recv_pipe: 0
* About to connect() to localhost port 3000 (#0)
*   Trying ::1...
* Connected to localhost (::1) port 3000 (#0)
> GET /events HTTP/1.1
> User-Agent: curl/7.30.0
> Host: localhost:3000
> Accept: */*
>
< HTTP/1.1 200 OK
* Server aleph/0.3.0 is not blacklisted
< Server: aleph/0.3.0
< Date: Tue, 15 Apr 2014 12:27:05 GMT
< Connection: keep-alive
< Content-Type: text/event-stream
< Transfer-Encoding: chunked

Я также воспроизвел это поведение в Chrome. И в случаях IPv4, и в IPv6 tcpdump показывает, что заголовки ответа идут по проводам.

Такое поведение происходит как с lein run и уберджар. Это также происходит, если я выполню Uberjar с -Djava.net.preferIPv4Stack=true,

Как заставить мое приложение вести себя так же по IPv4 и по IPv6?

0 ответов

Другие вопросы по тегам