1
0
Fork 0
mirror of https://github.com/puma/puma.git synced 2022-11-09 13:48:40 -05:00

Fix for that same content-length bug, but now fixed by gutting CGI to use HttpResponse right.

git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@38 19e92222-5c0b-0410-8929-a290d50e31e9
This commit is contained in:
zedshaw 2006-02-15 07:38:15 +00:00
parent a18fa951bb
commit fd11f72b2f
2 changed files with 43 additions and 29 deletions

View file

@ -8,44 +8,58 @@ require 'mongrel/command'
class CGIFixed < ::CGI
public :env_table
attr_reader :options
def initialize(params, data, out, *args)
@env_table = params
def initialize(request, response, *args)
@request = request
@response = response
@args = *args
@input = StringIO.new(data)
@out = out
@input = StringIO.new(request.body)
@options = {}
super(*args)
end
def header(options = "text/html")
if options.class == Hash
# passing in a header so need to keep the status around and other options
@options = options
@options = @options.merge(options)
else
@options["Content-Type"] = options
end
super(options)
# doing this fakes out the cgi library to think the headers are empty
# we then do the real headers in the out function call later
""
end
def status
s = @options["Status"] || @options["status"]
s[0 .. s.index(' ')] || "200"
def out(options = "text/html")
header(options)
@response.start status do |head, out|
@options.each {|k,v| head[k.capitalize] = v}
out.write(yield || "")
end
end
# computes the status once, but lazily so that people who call header twice
# don't get penalized
def status
if not @status
@status = @options["Status"] || @options["status"]
if @status
@status[0 ... @status.index(' ')] || "200"
else
@status = "200"
end
end
end
def args
@args
end
def env_table
@env_table
end
def stdinput
@input
end
def stdoutput
@out
@request.params
end
end
@ -63,26 +77,26 @@ class RailsHandler < Mongrel::HttpHandler
def process(request, response)
# not static, need to talk to rails
return if response.socket.closed?
if @files.can_serve(request.params["PATH_INFO"])
@files.process(request,response)
else
cgi = CGIFixed.new(request.params, request.body, response.socket)
cgi = CGIFixed.new(request, response)
begin
@guard.synchronize do
# Rails is not thread safe so must be run entirely within synchronize
Dispatcher.dispatch(cgi, ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS, response.body)
end
response.status = cgi.status
response.send_status
response.send_body
# This finalizes the output using the proper HttpResponse way
cgi.out {""}
rescue Object => rails_error
STDERR.puts "calling Dispatcher.dispatch #{rails_error}"
STDERR.puts rails_error.backtrace.join("\n")
end
end
end
end

View file

@ -110,7 +110,7 @@ module Mongrel
SERVER_SOFTWARE='SERVER_SOFTWARE'
# Current Mongrel version (used for SERVER_SOFTWARE and other response headers).
MONGREL_VERSION='Mongrel 0.2.2'
MONGREL_VERSION='Mongrel 0.3.4'
# The standard empty 404 response for bad requests. Use Error4040Handler for custom stuff.
ERROR_404_RESPONSE="HTTP/1.1 404 Not Found\r\nConnection: close\r\nServer: #{MONGREL_VERSION}\r\n\r\nNOT FOUND"
@ -243,7 +243,7 @@ module Mongrel
end
def send_status
@socket.write("HTTP/1.1 #{@status.to_i} #{HTTP_STATUS_CODES[@status.to_i]}\r\nContent-Length:#{body.length}\r\nConnection: close\r\n")
@socket.write("HTTP/1.1 #{@status} #{HTTP_STATUS_CODES[@status]}\r\nContent-Length: #{@body.length}\r\nConnection: close\r\n")
end
def send_header