Skip to content

Instantly share code, notes, and snippets.

@rca
Forked from metaskills/mongrel.rb
Created February 14, 2011 22:16
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save rca/826692 to your computer and use it in GitHub Desktop.
Save rca/826692 to your computer and use it in GitHub Desktop.
if ['2.3.8', '2.3.9', '2.3.10', '2.3.11'].include?(Rails.version) && Gem.available?('mongrel', '~>1.1.5') && self.class.const_defined?(:Mongrel)
# Pulled right from latest rack. Old looked like this in 1.1.0 version.
#
# def [](k)
# super(@names[k] ||= @names[k.downcase])
# end
#
module Rack
module Utils
class HeaderHash < Hash
def [](k)
super(@names[k]) if @names[k]
super(@names[k.downcase])
end
end
end
end
# Code pulled from the ticket above.
#
class Mongrel::CGIWrapper
def header_with_rails_fix(options = 'text/html')
@head['cookie'] = options.delete('cookie').flatten.map { |v| v.sub(/^\n/,'') } if options.class != String and options['cookie']
header_without_rails_fix(options)
end
alias_method_chain :header, :rails_fix
end
# Pulled right from 2.3.8 ActionPack. Simple diff was
#
# if headers.include?('Set-Cookie')
# headers['cookie'] = headers.delete('Set-Cookie').split("\n")
# end
#
# to
#
# if headers['Set-Cookie']
# headers['cookie'] = headers.delete('Set-Cookie').split("\n")
# end
#
module ActionController
class CGIHandler
def self.dispatch_cgi(app, cgi, out = $stdout)
env = cgi.__send__(:env_table)
env.delete "HTTP_CONTENT_LENGTH"
cgi.stdinput.extend ProperStream
env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/"
env.update({
"rack.version" => [0,1],
"rack.input" => cgi.stdinput,
"rack.errors" => $stderr,
"rack.multithread" => false,
"rack.multiprocess" => true,
"rack.run_once" => false,
"rack.url_scheme" => ["yes", "on", "1"].include?(env["HTTPS"]) ? "https" : "http"
})
env["QUERY_STRING"] ||= ""
env["HTTP_VERSION"] ||= env["SERVER_PROTOCOL"]
env["REQUEST_PATH"] ||= "/"
env.delete "PATH_INFO" if env["PATH_INFO"] == ""
status, headers, body = app.call(env)
begin
out.binmode if out.respond_to?(:binmode)
out.sync = false if out.respond_to?(:sync=)
headers['Status'] = status.to_s
if headers['Set-Cookie']
headers['cookie'] = headers.delete('Set-Cookie').split("\n")
end
out.write(cgi.header(headers))
body.each { |part|
out.write part
out.flush if out.respond_to?(:flush)
}
ensure
body.close if body.respond_to?(:close)
end
end
end
end
end
@Bill
Copy link

Bill commented Mar 16, 2011

I love you man!

@tibu
Copy link

tibu commented Jun 20, 2011

Lot's ok thanks!

@sousousore1
Copy link

thanks!

@umarsheikh
Copy link

I dont understand how i can use this file? should i create a file in the lib directory of my project, name it 'mongrel.rb' and paste the contents of this file there?

@Bill
Copy link

Bill commented Aug 9, 2011

umarsheikh create a file called mongrel.db and put it in /config/initializers

@acuppy
Copy link

acuppy commented Aug 9, 2011

This is wonderful!

@Intrepidd
Copy link

Fixed my broken mongrel, thanks :)

@derekjwilliams
Copy link

It looks like this is also needed for Rails.version 2.3.14. I updated Redmine to version 1.3 today and updated this to fix the text/plain should be text/html issue.

@we4tech
Copy link

we4tech commented Dec 24, 2011

Thanks rca it works with rails 2.3.12 :) just a savior :D

@andrewhavens
Copy link

This fixed my problem while upgrading to Rails 2.3.15 (just comment out the if statement checking the Rails version because you dont need it). The error message that I had was:

Error calling Dispatcher.dispatch #<NoMethodError: private method `split' called for nil:NilClass>

Just copy the contents of this gist and paste into config/initializers/mongrel.rb

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment