Skip to content

Instantly share code, notes, and snippets.

@metaskills
Created July 11, 2010 16:42
  • Star 12 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save metaskills/471663 to your computer and use it in GitHub Desktop.
if Rails.version == '2.3.8' && Gem.available?('mongrel', Gem::Requirement.new('~>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
@buntine
Copy link

buntine commented Jul 20, 2010

Hey, thanks for the patch. Rubygems (1.3.5) was complaining about an "illformed requirement", which I fixed by replacing the first line with:

if Rails.version == '2.3.8' && Gem.available?('mongrel', '~>1.1.5') && self.class.const_defined?(:Mongrel)

EDIT: Thanks for the correct fix, bshand.

@bshand
Copy link

bshand commented Jul 27, 2010

I "fixed" it for Rubygems 1.3.5 with the following first line:

if Rails.version == '2.3.8' && Gem.available?('mongrel', '~>1.1.5') && self.class.const_defined?(:Mongrel)

@stangel
Copy link

stangel commented Oct 28, 2010

This seems to also be a problem in Rails 2.3.9 so I changed the first line to:
if ['2.3.8','2.3.9'].include?( Rails.version ) && Gem.available?('mongrel', Gem::Requirement.new('~>1.1.5')) && self.class.const_defined?(:Mongrel)

@dumbledore
Copy link

the same with Rails 2.3.10

@vivek-dhayalan
Copy link

When I use this above code I am getting undefined method 'alias_method_chain' for #Class:Mongrel::CGIWrapper. I am newbie to rails please help me. Thanks in advance.

@stangel
Copy link

stangel commented Dec 2, 2010

Vivek a couple suggestions:

  1. If you're using Rails 3 then alias_method_chain is deprecated, but you shouldn't need this patch on Rails 3.
  2. If you're on a Mac you might try this: http://john.vipvip.com/blog/?p=71

@vivek-dhayalan
Copy link

I am using rails 2.3.8 only. But still I am facing this problem.

@metaskills
Copy link
Author

@vivek-dhayalan Perhaps you are not loading this file at the right time. I have it in my 2.3.8 app in lib/initializers/mongrel.rb

@vivek-dhayalan
Copy link

I have moved my file to location as said and I have added the following two lines in environment.rb

require File.join(File.dirname(File.expand_path(FILE)), '../lib/initializers/mongrel')
config.gem "mongrel"

but, I am getting the same error again.

@metaskills
Copy link
Author

Crap, a mistake on my part, I meant config/initializers/mongrel.rb.

Also, do not require the file, rails requires init file automatically.

@vivek-dhayalan
Copy link

thanks, it worked.

@rca
Copy link

rca commented Feb 14, 2011

Thanks for the fix. I've put together a patched gist that fixes the issues in the comments below that works for Rails versions ['2.3.8', '2.3.9', '2.3.10', '2.3.11']:

https://gist.github.com/826692

Thanks.

@bauerpl
Copy link

bauerpl commented Mar 12, 2011

Thanks a lot!

@tf
Copy link

tf commented Jun 27, 2011

Solved the problem for me on 2.3.12

Thanks a lot!

@edusilva
Copy link

im using rails 2.3.10 placed file in config/initializers/mongrel.rb and include version 2.3.10, but still having error:
undefined method `[]' for nil:NilClass

Application trace:

E:/webSAS/webSAS/vendor/plugins/recode_legacy_database/lib/recode_legacy_database.rb:36:in after_initialize' C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-2.3.10/lib/active_record/callbacks.rb:347:insend'
C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-2.3.10/lib/active_record/callbacks.rb:347:in callback' C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:1691:insend'
C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:1691:in instantiate' C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:665:infind_by_sql'
C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:665:in collect!' C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:665:infind_by_sql'
C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:1582:in find_every' C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:1539:infind_initial'
C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:617:in find' C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:1914:infind_by_login'
C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:1919:in send' C:/Ruby187/lib/ruby/gems/1.8/gems/activerecord-2.3.10/lib/active_record/base.rb:1919:inmethod_missing_without_paginate'
E:/webSAS/webSAS/vendor/plugins/will_paginate/lib/will_paginate/finder.rb:164:in method_missing' E:/webSAS/webSAS/app/models/user.rb:76:inauthenticate'
E:/webSAS/webSAS/app/controllers/sessions_controller.rb:9:in `create'

Can anyone help?

Thanks in advance
Eduardo

@stangel
Copy link

stangel commented Aug 26, 2011

Eduardo, what does E:/webSAS/webSAS/vendor/plugins/recode_legacy_database/lib/recode_legacy_database.rb line 36 look like?

@edusilva
Copy link

is a plugin that work with encoding utf-8 to iso, its useful for use rails with sqlserver old versions. it converts caracters encoding when saving and loading data from database to ensure that special caracters will be displayed correctly.

@edusilva
Copy link

fixed problem removing recode_legacy_database, but now trying to solve utf-8 x sqlserver encoding problem

thnks for the tip

@Jampire
Copy link

Jampire commented Dec 6, 2011

thanks a lot. Working for rails 2.3.14 too.

@tyleramos
Copy link

Worked for me in 2.3.14 as well. Thanks so much!

@vgaicuks
Copy link

Thanks a lot! Worked for me in 2.3.15.

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