Appel EventSource à ActionController :: En attente

Je travaille actuellement sur un site qui présente les caractéristiques suivantes:

  • chat en direct
  • quelques statistiques
  • certaines formes

J’utilise: Rails 4 + Puma + Nginx

J’utilise ActionController :: Live et j’ai créé une action d’événement, appelée sur le chargement de la page et à laquelle les auditeurs sont liés en écoutant les messages de discussion ou les modifications apscopes aux statistiques.

def events response.headers["Content-Type"] = "text/event-stream" sse = ServerEvent.new(response.stream) redis = Redis.new # the safe_write method is the implementation of a workaround for the problem stated on # http://evaleverything.com/2013/09/07/response-streams-with-rails-4-and-redis sse.safe_write do redis.psubscribe("redis-foobar-key*") do |on| on.pmessage do |pattern, event, data| sse.write(data, { event: event}) end end end rescue IOError puts "Stream Closed" ensure puts "closing all threads and connections\n" redis.quit sse.close end 

Le problème auquel je suis confronté est le suivant: lors du chargement de la page, parfois tout se passe bien, je peux démarrer la source d’événements et les événements sont correctement gérés, mais parfois la demande eventource rest en attente et ne renvoie aucune erreur.

J’ai fait des essais réussis via:

  • chrome + windows
  • chrome + macosx (ordinateur A)
  • Firefox + Macosx (ordinateur A)

Et fait des essais infructueux via:

  • chrome + ubuntu (derrière un proxy)
  • Firefox + Ubuntu (derrière un proxy)
  • chrome-macosx (ordinateur B)
  • Firefox + Macosx (ordinateur B)

J’utilise nginx, mais ne pense pas que c’est le problème, néanmoins, voici ma configuration

 upstream bar { server foo.com:9292; } server { listen 80; server_name foo.com megafoo.com; root /(...)/public; location / { proxy_pass http://bar; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Connection ''; proxy_http_version 1.1; chunked_transfer_encoding off; proxy_buffering off; proxy_cache off; if (-f $request_filename) { break; } } location ~* ^/assets/ { # Per RFC2616 - 1 year maximum expiry expires 1y; add_header Cache-Control public; # Some browsers still send conditional-GET requests if there's a # Last-Modified header or an ETag header even if they haven't # reached the expiry date sent in the Expires header. add_header Last-Modified ""; add_header ETag ""; break; } } 

il semblerait que l’antivirus bloque la connexion, ne lui permettant pas de se terminer avec succès