Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails Streaming not Streaming

I am working to add a streaming component to my rails app as I'd like to start using SSEs. I have tried getting this to work in a smaller example but am still having trouble. I have been having trouble actually getting rails to properly stream a response to a curl request. I am following the tutorial at http://tenderlovemaking.com/2012/07/30/is-it-live.html. I'm not sure if there is something I have to configure for OSX or if there is something I'm missing in my configuration. Any help would be greatly appreciated.

I am running this locally on OSX. When I run curl -i localhost:3000 I get the following response:

HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
Content-Type: text/event-stream
Last-Modified: Wed Apr 23 23:10:15 2014
Cache-Control: no-cache
Set-Cookie: request_method=GET; path=/
X-Request-Id: 89f2af3e-76e9-4873-85b0-3b6fe45f6343
X-Runtime: 0.001724
Transfer-Encoding: chunked

hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world

The problem is I get it all at once instead of getting bits of the response as is expected. Please let me know if I need to provide more information

My code is as follows:

stream_test_controller.rb

class StreamTestController < ActionController::Base
  include ActionController::Live

  def index
    response.headers['Content-Type'] = 'text/event-stream'
    10.times {
      logger.info "hello world sent"
      response.stream.write "hello world\n"
      sleep 1
    }
    response.stream.close
  end
end

Gemfile

source 'https://rubygems.org'  
ruby '2.1.0'

gem 'rails', '4.0.3'
gem 'sqlite3'
gem 'sass-rails', '~> 4.0.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 1.2'
gem 'puma'

group :doc do
  gem 'sdoc', require: false
end

development.rb

StreamTest::Application.configure do

  config.preload_frameworks = true
  config.allow_concurrency = true
  # Settings specified here will take precedence over those in config/application.rb.

  # In the development environment your application's code is reloaded on
  # every request. This slows down response time but is perfect for development    
  # since you don't have to restart the web server when you make code changes.
  config.cache_classes = true

  # Do not eager load code on boot.
  config.eager_load = true

  # Show full error reports and disable caching.
  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = false

  # Don't care if the mailer can't send.
  config.action_mailer.raise_delivery_errors = false

  # Print deprecation notices to the Rails logger.
  config.active_support.deprecation = :log

  # Raise an error on page load if there are pending migrations
  config.active_record.migration_error = :page_load

  # Debug mode disables concatenation and preprocessing of assets.
  # This option may cause significant delays in view rendering with a large
  # number of complex assets.
  config.assets.debug = true
end
like image 381
rsaris Avatar asked Apr 24 '14 03:04

rsaris


2 Answers

From the documentation here, are you using WEBrick to test?

WEBrick servers buffer all responses, and so including ActionController::Live will not work. You must use a web server which does not automatically buffer responses.

like image 119
Mike H-R Avatar answered Sep 21 '22 04:09

Mike H-R


Try disabling buffering in your curl command. From the manpage:

-N, --no-buffer

Disables the buffering of the output stream. In normal work situations, curl will use a standard buffered output stream that will have the effect that it will output the data in chunks, not necessarily exactly when the data arrives. Using this option will disable that buffering.

like image 22
Matt Gibson Avatar answered Sep 22 '22 04:09

Matt Gibson