Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rails 5.2: ActionController::Live does not stream responses, instead returns entire response at once #38780

Closed
anaulin opened this issue Mar 20, 2020 · 2 comments

Comments

@anaulin
Copy link

anaulin commented Mar 20, 2020

Steps to reproduce

In a clean Rails app (generated with rails new), with Rails 5.2.4.1 or Rails 5.4.2.2, add the following controller:

# in file app/controllers/streaming_controllers.rb

class StreamingController < ApplicationController
  include ActionController::Live

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

Routes:

# in file config/routes.rb
Rails.application.routes.draw do
  get 'streaming' => 'streaming#index'
end

Run the server locally, then go to http://localhost:3000/streaming

Observed behavior: The server waits for about 5 seconds, then spits out 5 lines of hello world.
Expected behavior: The server streams one line of hello world every second.

On Rails 5.0.7.2, the behavior of this controller is as expected -- streams a line every second.


Detailed Gemfile.lock contents for clean Rails app that exhibits this issue:

GEM
  remote: https://rubygems.org/
  specs:
    actioncable (5.2.4.2)
      actionpack (= 5.2.4.2)
      nio4r (~> 2.0)
      websocket-driver (>= 0.6.1)
    actionmailer (5.2.4.2)
      actionpack (= 5.2.4.2)
      actionview (= 5.2.4.2)
      activejob (= 5.2.4.2)
      mail (~> 2.5, >= 2.5.4)
      rails-dom-testing (~> 2.0)
    actionpack (5.2.4.2)
      actionview (= 5.2.4.2)
      activesupport (= 5.2.4.2)
      rack (~> 2.0, >= 2.0.8)
      rack-test (>= 0.6.3)
      rails-dom-testing (~> 2.0)
      rails-html-sanitizer (~> 1.0, >= 1.0.2)
    actionview (5.2.4.2)
      activesupport (= 5.2.4.2)
      builder (~> 3.1)
      erubi (~> 1.4)
      rails-dom-testing (~> 2.0)
      rails-html-sanitizer (~> 1.0, >= 1.0.3)
    activejob (5.2.4.2)
      activesupport (= 5.2.4.2)
      globalid (>= 0.3.6)
    activemodel (5.2.4.2)
      activesupport (= 5.2.4.2)
    activerecord (5.2.4.2)
      activemodel (= 5.2.4.2)
      activesupport (= 5.2.4.2)
      arel (>= 9.0)
    activestorage (5.2.4.2)
      actionpack (= 5.2.4.2)
      activerecord (= 5.2.4.2)
      marcel (~> 0.3.1)
    activesupport (5.2.4.2)
      concurrent-ruby (~> 1.0, >= 1.0.2)
      i18n (>= 0.7, < 2)
      minitest (~> 5.1)
      tzinfo (~> 1.1)
    addressable (2.7.0)
      public_suffix (>= 2.0.2, < 5.0)
    archive-zip (0.12.0)
      io-like (~> 0.3.0)
    arel (9.0.0)
    bindex (0.8.1)
    bootsnap (1.4.6)
      msgpack (~> 1.0)
    builder (3.2.4)
    byebug (11.1.1)
    capybara (3.31.0)
      addressable
      mini_mime (>= 0.1.3)
      nokogiri (~> 1.8)
      rack (>= 1.6.0)
      rack-test (>= 0.6.3)
      regexp_parser (~> 1.5)
      xpath (~> 3.2)
    childprocess (3.0.0)
    chromedriver-helper (2.1.1)
      archive-zip (~> 0.10)
      nokogiri (~> 1.8)
    coffee-rails (4.2.2)
      coffee-script (>= 2.2.0)
      railties (>= 4.0.0)
    coffee-script (2.4.1)
      coffee-script-source
      execjs
    coffee-script-source (1.12.2)
    concurrent-ruby (1.1.6)
    crass (1.0.6)
    erubi (1.9.0)
    execjs (2.7.0)
    ffi (1.12.2)
    globalid (0.4.2)
      activesupport (>= 4.2.0)
    i18n (1.8.2)
      concurrent-ruby (~> 1.0)
    io-like (0.3.1)
    jbuilder (2.10.0)
      activesupport (>= 5.0.0)
    listen (3.1.5)
      rb-fsevent (~> 0.9, >= 0.9.4)
      rb-inotify (~> 0.9, >= 0.9.7)
      ruby_dep (~> 1.2)
    loofah (2.4.0)
      crass (~> 1.0.2)
      nokogiri (>= 1.5.9)
    mail (2.7.1)
      mini_mime (>= 0.1.1)
    marcel (0.3.3)
      mimemagic (~> 0.3.2)
    method_source (1.0.0)
    mimemagic (0.3.4)
    mini_mime (1.0.2)
    mini_portile2 (2.4.0)
    minitest (5.14.0)
    msgpack (1.3.3)
    nio4r (2.5.2)
    nokogiri (1.10.9)
      mini_portile2 (~> 2.4.0)
    public_suffix (4.0.3)
    puma (3.12.4)
    rack (2.2.2)
    rack-test (1.1.0)
      rack (>= 1.0, < 3)
    rails (5.2.4.2)
      actioncable (= 5.2.4.2)
      actionmailer (= 5.2.4.2)
      actionpack (= 5.2.4.2)
      actionview (= 5.2.4.2)
      activejob (= 5.2.4.2)
      activemodel (= 5.2.4.2)
      activerecord (= 5.2.4.2)
      activestorage (= 5.2.4.2)
      activesupport (= 5.2.4.2)
      bundler (>= 1.3.0)
      railties (= 5.2.4.2)
      sprockets-rails (>= 2.0.0)
    rails-dom-testing (2.0.3)
      activesupport (>= 4.2.0)
      nokogiri (>= 1.6)
    rails-html-sanitizer (1.3.0)
      loofah (~> 2.3)
    railties (5.2.4.2)
      actionpack (= 5.2.4.2)
      activesupport (= 5.2.4.2)
      method_source
      rake (>= 0.8.7)
      thor (>= 0.19.0, < 2.0)
    rake (13.0.1)
    rb-fsevent (0.10.3)
    rb-inotify (0.10.1)
      ffi (~> 1.0)
    regexp_parser (1.7.0)
    ruby_dep (1.5.0)
    rubyzip (2.3.0)
    sass (3.7.4)
      sass-listen (~> 4.0.0)
    sass-listen (4.0.0)
      rb-fsevent (~> 0.9, >= 0.9.4)
      rb-inotify (~> 0.9, >= 0.9.7)
    sass-rails (5.1.0)
      railties (>= 5.2.0)
      sass (~> 3.1)
      sprockets (>= 2.8, < 4.0)
      sprockets-rails (>= 2.0, < 4.0)
      tilt (>= 1.1, < 3)
    selenium-webdriver (3.142.7)
      childprocess (>= 0.5, < 4.0)
      rubyzip (>= 1.2.2)
    spring (2.1.0)
    spring-watcher-listen (2.0.1)
      listen (>= 2.7, < 4.0)
      spring (>= 1.2, < 3.0)
    sprockets (3.7.2)
      concurrent-ruby (~> 1.0)
      rack (> 1, < 3)
    sprockets-rails (3.2.1)
      actionpack (>= 4.0)
      activesupport (>= 4.0)
      sprockets (>= 3.0.0)
    sqlite3 (1.4.2)
    thor (1.0.1)
    thread_safe (0.3.6)
    tilt (2.0.10)
    turbolinks (5.2.1)
      turbolinks-source (~> 5.2)
    turbolinks-source (5.2.0)
    tzinfo (1.2.6)
      thread_safe (~> 0.1)
    uglifier (4.2.0)
      execjs (>= 0.3.0, < 3)
    web-console (3.7.0)
      actionview (>= 5.0)
      activemodel (>= 5.0)
      bindex (>= 0.4.0)
      railties (>= 5.0)
    websocket-driver (0.7.1)
      websocket-extensions (>= 0.1.0)
    websocket-extensions (0.1.4)
    xpath (3.2.0)
      nokogiri (~> 1.8)

PLATFORMS
  ruby

DEPENDENCIES
  bootsnap (>= 1.1.0)
  byebug
  capybara (>= 2.15)
  chromedriver-helper
  coffee-rails (~> 4.2)
  jbuilder (~> 2.5)
  listen (>= 3.0.5, < 3.2)
  puma (~> 3.11)
  rails (~> 5.2.4, >= 5.2.4.1)
  sass-rails (~> 5.0)
  selenium-webdriver
  spring
  spring-watcher-listen (~> 2.0.0)
  sqlite3
  turbolinks (~> 5)
  tzinfo-data
  uglifier (>= 1.3.0)
  web-console (>= 3.3.0)

RUBY VERSION
   ruby 2.6.4p104

BUNDLED WITH
   2.1.4
@anaulin
Copy link
Author

anaulin commented Mar 20, 2020

This appears to be due to rack/rack#1619 , and is not a Rails issue, marking this as closed.

This change in my Gemfile fixed the issue for me:

gem 'rack', '<2.2'

@anaulin anaulin closed this as completed Mar 20, 2020
@omerbn
Copy link

omerbn commented Aug 24, 2021

Thanks !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants