4

I have a page with a big graph on it with lots of params in the url when you work with it a bunch.

So my controller looks something like this:

def report
   # gather data for report

   respond_to do |format|
      format.html
      format.xls { send_xls_file(@campaigns.uniq) }
      format.csv { send_csv_file(@campaigns.uniq)}
   end

  def send_xls_file(campaigns)
    @campaigns = campaigns
    report_name = "CampaignReport.xls"
    response.headers["Content-Disposition"] = "attachment; filename=#{report_name}"
  end

  # send csv does is similar but creates a csv using fastercsv.

In the view for xls I create the excel doc

Now when I have a very long url on the page and call either xls or csv, I get this error:

Completed in 3189ms (View: 894, DB: 108) | 200 OK [https://myapp.com/campaign_metrics/report?mycampia%5B%5D=White+Paper+1&mycampia%5B%5D=Talk+Turkey+-+T&mycampia%5B%5D=Nicole+Book+-+T&mycampia%5B%5D=Make+the+Case+-+T&mycampia%5B%5D=Make+the+Case+-+L&mycampia%5B%5D=Make+the+Case+-+F&mycampia%5B%5D=Learn+Sewings+-+T&mycampia%5B%5D=Learn+Sewings+-+L&mycampia%5B%5D=Learn+Sewings+-+F&mycampia%5B%5D=Keys+-+T&mycampia%5B%5D=Keys+-+L&mycampia%5B%5D=Keys+-+F&mycampia%5B%5D=How+to+Tie+-+F&mycampia%5B%5D=Cartoon&mycampia%5B%5D=Best+Practice+SM+-+FB&mycampia%5B%5D=5+Reasons+Flat+-+T&mycampia%5B%5D=5+Reasons+Flat+-+L&top_mycampia%5B%5D=678&top_mycampia%5B%5D=681&top_mycampia%5B%5D=682&top_mycampia%5B%5D=683&top_mycampia%5B%5D=685&top_mycampia%5B%5D=686&top_mycampia%5B%5D=687&top_mycampia%5B%5D=688&top_mycampia%5B%5D=689&top_mycampia%5B%5D=690&top_mycampia%5B%5D=691&top_mycampia%5B%5D=692&top_mycampia%5B%5D=693&top_mycampia%5B%5D=694&top_mycampia%5B%5D=695&top_mycampia%5B%5D=696&top_mycampia%5B%5D=697&top_mycampia%5B%5D=698&top_mycampia%5B%5D=699&top_mycampia%5B%5D=700&top_mycampia%5B%5D=701&top_mycampia%5B%5D=702&top_mycampia%5B%5D=703&top_mycampia%5B%5D=704&top_mycampia%5B%5D=705&top_mycampia%5B%5D=706&top_mycampia%5B%5D=707&top_mycampia%5B%5D=709&top_mycampia%5B%5D=710&top_mycampia%5B%5D=722&top_mycampia%5B%5D=723&top_mycampia%5B%5D=724&top_mycampia%5B%5D=725&top_mycampia%5B%5D=726&top_mycampia%5B%5D=728&top_mycampia%5B%5D=729&top_mycampia%5B%5D=730&top_mycampia%5B%5D=731&top_mycampia%5B%5D=732&top_mycampia%5B%5D=733&top_mycampia%5B%5D=734&top_mycampia%5B%5D=735&top_mycampia%5B%5D=736&top_mycampia%5B%5D=737&top_mycampia%5B%5D=738&top_mycampia%5B%5D=739&top_mycampia%5B%5D=740&date_select_range=7%2F1%2F2012+-+12%2F31%2F2012&submit_action=Submit&graph_option=monthly&mycampia%5B%5D=White+Paper+1&mycampia%5B%5D=Talk+Turkey+-+T&mycampia%5B%5D=Nicole+Book+-+T&mycampia%5B%5D=Make+the+Case+-+T&mycampia%5B%5D=Make+the+Case+-+L&mycampia%5B%5D=Make+the+Case+-+F&mycampia%5B%5D=Learn+Sewings+-+T&mycampia%5B%5D=Learn+Sewings+-+L&mycampia%5B%5D=Learn+Sewings+-+F&mycampia%5B%5D=Keys+-+T&mycampia%5B%5D=Keys+-+L&mycampia%5B%5D=Keys+-+F&mycampia%5B%5D=How+to+Tie+-+F&mycampia%5B%5D=Cartoon&mycampia%5B%5D=Best+Practice+SM+-+FB&mycampia%5B%5D=5+Reasons+Flat+-+T&mycampia%5B%5D=5+Reasons+Flat+-+L&date_select_range=7%2F1%2F2012+-+12%2F31%2F2012&format=xls&graph_option=monthly&graphtype=Actual&report_type=export&sort=campaign&submit_action=Submit&top_mycampia%5B%5D=678&top_mycampia%5B%5D=681&top_mycampia%5B%5D=682&top_mycampia%5B%5D=683&top_mycampia%5B%5D=685&top_mycampia%5B%5D=686&top_mycampia%5B%5D=687&top_mycampia%5B%5D=688&top_mycampia%5B%5D=689&top_mycampia%5B%5D=690&top_mycampia%5B%5D=691&top_mycampia%5B%5D=692&top_mycampia%5B%5D=693&top_mycampia%5B%5D=694&top_mycampia%5B%5D=695&top_mycampia%5B%5D=696&top_mycampia%5B%5D=697&top_mycampia%5B%5D=698&top_mycampia%5B%5D=699&top_mycampia%5B%5D=700&top_mycampia%5B%5D=701&top_mycampia%5B%5D=702&top_mycampia%5B%5D=703&top_mycampia%5B%5D=704&top_mycampia%5B%5D=705&top_mycampia%5B%5D=706&top_mycampia%5B%5D=707&top_mycampia%5B%5D=709&top_mycampia%5B%5D=710&top_mycampia%5B%5D=722&top_mycampia%5B%5D=723&top_mycampia%5B%5D=724&top_mycampia%5B%5D=725&top_mycampia%5B%5D=726&top_mycampia%5B%5D=728&top_mycampia%5B%5D=729&top_mycampia%5B%5D=730&top_mycampia%5B%5D=731&top_mycampia%5B%5D=732&top_mycampia%5B%5D=733&top_mycampia%5B%5D=734&top_mycampia%5B%5D=735&top_mycampia%5B%5D=736&top_mycampia%5B%5D=737&top_mycampia%5B%5D=738&top_mycampia%5B%5D=739&top_mycampia%5B%5D=740&visits=on]
/!\ FAILSAFE /!\  Thu Jan 03 12:33:51 +0000 2013
Status: 500 Internal Server Error
ActionController::Session::CookieStore::CookieOverflow
/usr/lib64/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/session/cookie_store.rb:102:in `call'
/usr/lib64/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/failsafe.rb:26:in `call'
/usr/lib64/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/lock.rb:11:in `call'
/usr/lib64/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/lock.rb:11:in `synchronize'
/usr/lib64/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/lock.rb:11:in `call'
/usr/lib64/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_controller/dispatcher.rb:106:in `call'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/rack/request_handler.rb:96:in `process_request'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/abstract_request_handler.rb:516:in `accept_and_process_next_request'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/abstract_request_handler.rb:274:in `main_loop'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/classic_rails/application_spawner.rb:321:in `start_request_handler'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/classic_rails/application_spawner.rb:275:in `send'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/classic_rails/application_spawner.rb:275:in `handle_spawn_application'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/utils.rb:470:in `safe_fork'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/classic_rails/application_spawner.rb:270:in `handle_spawn_application'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/abstract_server.rb:357:in `__send__'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/abstract_server.rb:357:in `server_main_loop'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/abstract_server.rb:206:in `start_synchronously'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/abstract_server.rb:180:in `start'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/classic_rails/application_spawner.rb:149:in `start'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/spawn_manager.rb:219:in `spawn_rails_application'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/abstract_server_collection.rb:132:in `lookup_or_add'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/spawn_manager.rb:214:in `spawn_rails_application'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/abstract_server_collection.rb:82:in `synchronize'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/abstract_server_collection.rb:79:in `synchronize'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/spawn_manager.rb:213:in `spawn_rails_application'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/spawn_manager.rb:132:in `spawn_application'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/spawn_manager.rb:275:in `handle_spawn_application'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/abstract_server.rb:357:in `__send__'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/abstract_server.rb:357:in `server_main_loop'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/lib/phusion_passenger/abstract_server.rb:206:in `start_synchronously'
/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.17/helper-scripts/passenger-spawn-server:99

I am not intentionally storing anything in my sessions, it seems like rails is maybe putting the url into the session and its too big? Any ideas?

Joelio
  • 4,621
  • 6
  • 44
  • 80
  • 1
    are you using something like devise? in the case that you try to access a url, but it is not-authorized, it stores the url in a session. After you sign in, it redirects you. – Matthew Rudy Jan 08 '13 at 23:43
  • Also, you should keep urls to less than 2000 characters. [What is the maximum length of a url](http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url) – Matthew Rudy Jan 08 '13 at 23:45
  • Using Clearance, maybe thats it, good idea, I will dig into it. Agree on the URL. – Joelio Jan 09 '13 at 14:52

4 Answers4

2

You may consider to move your session store to ActiveRecord instead of cookies . If you are OK with the current implementation of .xls handling , it would be an easy fix. The problem is in the limited space for cookies store : 4 kb .

In case you decide to move to ActiveRecord session store , here are the steps :

  • in your app/config/initializers/session_store.rb file change the store to :active_record_store

  • then you should rails generate session_migration and rake db:migrate

There is another kind of session store you may think about : Memcache . It is faster and in some cases more comfortable to use .

R Milushev
  • 4,295
  • 3
  • 27
  • 35
  • Hi, I am not storing anything in the session on purpose, so my question is not focused on moving the session store, but in solving my problem (figuring out what is storing something in the session and why) – Joelio Jan 09 '13 at 14:53
  • In your current implementation you are using long URL , which causes storing it in session store . I wish you good luck in solving the problem . – R Milushev Jan 09 '13 at 15:48
1

the error message clearly indicates the problem with cookie store size that's overflow.

Your sessions (by default in cookie) needs to be moved to Active record store or memcache store to fix this issue.

For Databased sessions:

config.action_controller.session_store = :active_record_store

You need to create the session table as below

rake db:sessions:create
rake db:migrate

OR

For Memcache sessions:

config.action_controller.session_store = :mem_cache_store

Also you need to setup a mem cache server and configure it as below

config.cache_store = :mem_cache_store, 'localhost', '127.0.0.1:11211',
{:namespace => 'myapp123'}
sjain
  • 23,126
  • 28
  • 107
  • 185
1

Looks like something is storing the long url in the session - possible Clearance? - and that is causing your problem.

Bart
  • 530
  • 5
  • 11
0

You are getting this error because your session has exceeded limit of 4kb.

Try this

Create table session in your Database.

rake db:sessions:create
rake db:migrate

In config/initializers/session_store.rb Comment line

Application.config.session_store :cookie_store

And add

Application.config.session_store :active_record_store
Deepika
  • 826
  • 6
  • 14