Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is Sinatra's "show_exceptions.rb" file crashing when I raise a RuntimeError?

Tags:

ruby

sinatra

rack

I have an application as simple as this:

require "sinatra"

get "/" do
  raise "Oops!"
end

Since this is a debug environment, I'd expect to see a "RuntimeError: Oops!" show up in the browser. Instead, it seems Sinatra is crashing:

NoMethodError at /
undefined method `join' for #<String:0x00000002b74bf0>

Ruby    /home/tomas/.rvm/.../gems/sinatra-1.4.5/lib/sinatra/show_exceptions.rb: in rescue in call, line 37
Web     GET 127.0.0.1/

Backtrace in console:

RuntimeError - Oops!:
    test.rb:5:in `block in '
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1603:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1603:in `block in compile!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `[]'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `block (3 levels) in route!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:985:in `route_eval'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:966:in `block (2 levels) in route!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1006:in `block in process_route'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1004:in `catch'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1004:in `process_route'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:964:in `block in route!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:963:in `each'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:963:in `route!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1076:in `block in dispatch!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `block in invoke'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `catch'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `invoke'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1073:in `dispatch!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:898:in `block in call!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `block in invoke'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `catch'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1058:in `invoke'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:898:in `call!'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:886:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-protection-1.5.3/lib/rack/protection/xss_header.rb:18:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-protection-1.5.3/lib/rack/protection/path_traversal.rb:16:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-protection-1.5.3/lib/rack/protection/json_csrf.rb:18:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-protection-1.5.3/lib/rack/protection/base.rb:49:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-protection-1.5.3/lib/rack/protection/frame_options.rb:31:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-1.6.0.beta/lib/rack/logger.rb:15:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-1.6.0.beta/lib/rack/commonlogger.rb:33:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:217:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:210:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-1.6.0.beta/lib/rack/head.rb:13:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-1.6.0.beta/lib/rack/methodoverride.rb:22:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/show_exceptions.rb:21:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:180:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:2014:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1478:in `block in call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1788:in `synchronize'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1478:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-1.6.0.beta/lib/rack/handler/webrick.rb:89:in `service'
    /home/tomas/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/webrick/httpserver.rb:138:in `service'
    /home/tomas/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/webrick/httpserver.rb:94:in `run'
    /home/tomas/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/webrick/server.rb:295:in `block in start_thread'
[2014-10-08 12:42:42] ERROR NoMethodError: undefined method `join' for #<String:0x007f52e055ce38>
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/show_exceptions.rb:37:in `rescue in call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/show_exceptions.rb:21:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:180:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:2014:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1478:in `block in call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1788:in `synchronize'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/sinatra-1.4.5/lib/sinatra/base.rb:1478:in `call'
    /home/tomas/.rvm/gems/ruby-2.0.0-p481@test/gems/rack-1.6.0.beta/lib/rack/handler/webrick.rb:89:in `service'
    /home/tomas/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/webrick/httpserver.rb:138:in `service'
    /home/tomas/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/webrick/httpserver.rb:94:in `run'
    /home/tomas/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/webrick/server.rb:295:in `block in start_thread'
localhost - - [08/Oct/2014:12:42:42 CEST] "GET / HTTP/1.1" 500 340

That's completely unhelpful to me. What's going on here?

like image 786
Hubro Avatar asked Oct 08 '14 10:10

Hubro


1 Answers

It looks like a recent change in Rack introduced this bug in Sinatra, which has been fixed but the fix hasn’t (at the time of writing) been included in a release.

The easiest fix (until an updated Sinatra gem is released) would be to use an earlier version of Rack (the change is only currently in 1.6.0.beta). Add this line to your Gemfile if you’re using Bundler, or somewhere near the start of your script (before you require anything) if you’re not:

gem 'rack', '1.5.2'
like image 130
matt Avatar answered Nov 05 '22 10:11

matt