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
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.
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.