Revision: 4391 http://trac.macosforge.org/projects/ruby/changeset/4391 Author: joshua.ballanco@apple.com Date: 2010-07-29 01:26:05 -0700 (Thu, 29 Jul 2010) Log Message: ----------- Fix for handling malformed requests Modified Paths: -------------- ControlTower/trunk/bin/control_tower ControlTower/trunk/lib/control_tower/rack_socket.rb ControlTower/trunk/lib/rack/handler/control_tower.rb Modified: ControlTower/trunk/bin/control_tower =================================================================== --- ControlTower/trunk/bin/control_tower 2010-07-28 23:17:04 UTC (rev 4390) +++ ControlTower/trunk/bin/control_tower 2010-07-29 08:26:05 UTC (rev 4391) @@ -8,21 +8,21 @@ # Some default values @options = { :rackup => './config.ru', - :port => '8080', + :port => '3000', :host => '0.0.0.0', :concurrent => false } OptionParser.new do |opts| - opts.on("-R", "--rackup [FILE]", "Rack-up Configuration File") do |rackup| + opts.on("-R", "--rackup FILE", "Rack-up Configuration File") do |rackup| @options[:rackup] = rackup end - opts.on("-p", "--port [SERVER_PORT]", Integer, "Port on which to run the server") do |port| + opts.on("-p", "--port PORT", Integer, "Port on which to run the server (default: 3000)") do |port| @options[:port] = port end - opts.on("-h", "--host [HOSTNAME]", "Hostname for the server") do |host| + opts.on("-a", "--address HOST", "Address to bind server to (default: 0.0.0.0)") do |host| @options[:host] = host end Modified: ControlTower/trunk/lib/control_tower/rack_socket.rb =================================================================== --- ControlTower/trunk/lib/control_tower/rack_socket.rb 2010-07-28 23:17:04 UTC (rev 4390) +++ ControlTower/trunk/lib/control_tower/rack_socket.rb 2010-07-29 08:26:05 UTC (rev 4391) @@ -39,6 +39,9 @@ 'rack.multithread' => @multithread, 'rack.run_once' => false, 'rack.version' => VERSION } + resp = nil + x_sendfile_header = "X-Sendfile" + x_sendfile = nil begin request_data = parse!(connection, env) if request_data @@ -65,6 +68,9 @@ resp = "HTTP/1.1 #{status}\r\n" headers.each do |header, value| + if header == x_sendfile_header + x_sendfile = value + else resp << "#{header}: #{value}\r\n" end resp << "\r\n" @@ -87,8 +93,13 @@ rescue EOFError, Errno::ECONNRESET, Errno::EPIPE, Errno::EINVAL $stderr.puts "Error: Connection terminated!" rescue Object => e - $stderr.puts "Error: Problem transmitting data -- #{e.inspect}" - $stderr.puts e.backtrace.join("\n") + if resp.nil? && !connection.closed? + connection.write "HTTP/1.1 400\r\n\r\n" + else + # We have a response, but there was trouble sending it: + $stderr.puts "Error: Problem transmitting data -- #{e.inspect}" + $stderr.puts e.backtrace.join("\n") + end ensure # We should clean up after our tempfile, if we used one. input = env['rack.input'] Modified: ControlTower/trunk/lib/rack/handler/control_tower.rb =================================================================== --- ControlTower/trunk/lib/rack/handler/control_tower.rb 2010-07-28 23:17:04 UTC (rev 4390) +++ ControlTower/trunk/lib/rack/handler/control_tower.rb 2010-07-29 08:26:05 UTC (rev 4391) @@ -7,6 +7,7 @@ module Handler class ControlTower def self.run(app, options={}) + app = Rack::Chunked.new(Rack::ContentLength.new(app)) server = ::ControlTower::Server.new(app, options) yield server if block_given? server.start