Issue #5022 has been updated by Felix Jodoin.


Nobuyoshi Nakada wrote:
> assert(hash) does not seem nice.
> assert_equal({}, hash) would be better.

Has to be assert_nothing_raised { } at least, since meta_vars won't be empty with no headers.

Improved test case:

  def test_simple_request
    msg = <<-_end_of_message_
      GET /
    _end_of_message_

    req = WEBrick::HTTPRequest.new(WEBrick::Config::HTTP)
    req.parse(StringIO.new(msg.gsub(/^ {6}/, '')))

    # assertion fails if @header was not initialized and iteration is attempted on the nil reference
    assert_nothing_raised('req.meta_vars should be available with HTTP/0.9 simple request') { req.meta_vars }
  end
----------------------------------------
Bug #5022: WEBrick returns improper response for malformed HTTP Request
http://redmine.ruby-lang.org/issues/5022

Author: Felix Jodoin
Status: Open
Priority: Normal
Assignee: Aaron Patterson
Category: lib
Target version: 1.9.3
ruby -v: ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-darwin10.7.0]


=begin

When sending an improper HTTP request in the form of:

 GET /\n

(with any valid or invalid HTTP verb), WEBrick returns:

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
 <HTML>
  <HEAD><TITLE>Internal Server Error</TITLE></HEAD>
  <BODY>
    <H1>Internal Server Error</H1>
    undefined method `each' for nil:NilClass
    <HR>
    <ADDRESS>
     WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18) at
     localhost:3000
    </ADDRESS>
  </BODY>
 </HTML>


and then closes the connection, without sending any HTTP status headers or printing a correct '400 Bad Request' error page. This is because the @header variable wasn't set up properly, so @header is nil when a message is passed to it when handling the request. WEBrick's log on the server console will read similar to:

 [2011-07-13 00:49:40] ERROR NoMethodError: undefined method `each' for nil:NilClass
 /Users/x/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/webrick/httprequest.rb:154:in `each'
 /Users/x/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/webrick/httprequest.rb:231:in `meta_vars'
 /Users/x/.rvm/gems/ruby-1.9.2-p180/gems/rack-1.3.0/lib/rack/handler/webrick.rb:34:in `service'
 /Users/x/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/webrick/httpserver.rb:111:in `service'
 /Users/x/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/webrick/httpserver.rb:70:in `run'
 /Users/x/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/webrick/server.rb:183:in `block in start_thread'

(Where line 34 of rack/handler/webrick.rb is a simple `env = req.meta_vars`)

This is reproducible in both 1.8.7 and 1.9.2. 

A simple patch is attached to WEBrick's httprequest.rb that will allow the request to continue processing, fixing the 500 internal server error (and let the app decide how to handle the malformed request). In my testing with rack 1.3.0 & sinatra 1.2.6, this patch allowed the request complete normally.



=end


-- 
http://redmine.ruby-lang.org