Coelhone
Coelhone

Reputation: 310

EventSource call to ActionController::Live pending

I'm currently working on a site which as the following features:

I'm using: Rails 4 + Puma + Nginx

I'm using ActionController::Live and have created an event action, which gets called on page load and has listeners binded to it listening to chat messages or changes to statistics.

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

The problem i'm facing is: when loading the page, sometimes everything goes right, i can start the eventsource and the events are correctly handled, but sometimes the eventsource request stays pending and don't return any kind of error.

I've made successfull tries via:

And made unsuccessfull tries via:

I'm using nginx, but don't think that's the problem, nevertheless, here goes my config

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;
  }
}

Upvotes: 3

Views: 507

Answers (1)

Coelhone
Coelhone

Reputation: 310

looks like the antivirus was blocking the connection, not allowing it to complete successfully

Upvotes: 3

Related Questions