Howto write a mongrel handler for a CGI app using CGIWrapper

Hello,

Just for further reference in case of someone else want to do the same :

I wanted to write a mongrel for a CGI app :
[[[
require ‘cgi’
require ‘foo’

cgi = CGI.new

if !cgi[‘uri’] || (cgi[‘uri’] == ‘’)
Foo.error “URI argument is required”
end

uri = cgi[‘uri’]
user = cgi[‘username’]
pass = cgi[‘password’]

foo = Foo.new(:output => ‘html’)

if user == ‘’
foo.check(uri)
else
foo.check(uri, user, pass)
end
foo.report
]]]

Here is the mongrel version, using Mongrel::CGIWrapper :
[[[
require ‘mongrel’
require ‘cgi’
require ‘foo’

class AppHandler < Mongrel::HttpHandler
def process(request, response)
cgi = Mongrel::CGIWrapper.new(request, response)

if !cgi['uri'] || (cgi['uri'] == '')
  response.start(200, true) do |header, body|

    Foo.error("URI argument is required", output=body)
  end
end

format = request.params['HTTP_ACCEPT'] == 'text/plain' ? 'text' : 

‘html’
ape = Ape.new({ :crumbs => true, :output => format })

if cgi['user'] && cgi['pass']
  ape.check(cgi['uri'], cgi['user'], cgi['pass'])
else
  ape.check(cgi['uri'])
end

response.start(200, true) do |head, body|
  ape.report(output=body)
end

end
end

h = Mongrel::HttpServer.new(‘0.0.0.0’, 4000)
h.register(’/’, Mongrel::RedirectHandler.new(’/ape/index.html’))
h.register(’/ape’, Mongrel::DirHandler.new(File.dirname(FILE) +
‘/layout’, true))
h.register(’/atompub/go’, ApeHandler.new)
h.run.join
]]]

On 1/4/08, Simon R. [email protected] wrote:

Hello,

Just for further reference in case of someone else want to do the same :

Err, sorry. I unwittingly hit … so here is the
correct message :

end
foo.report
]]]

Here is the mongrel version, using Mongrel::CGIWrapper :
[[[
require ‘mongrel’
require ‘cgi’
require ‘foo’

class FooHandler < Mongrel::HttpHandler
def process(request, response)
cgi = Mongrel::CGIWrapper.new(request, response)

if !cgi[‘uri’] || (cgi[‘uri’] == ‘’)
response.start(200, true) do |header, body|
# Foo.error accept an IO object to write to
Foo.error(“URI argument is required”, output=body)
end
end

format = request.params[‘HTTP_ACCEPT’] == ‘text/plain’ ? ‘text’ :
‘html’
ape = Foo.new(:output => format)

if cgi[‘user’] && cgi[‘pass’]
Foo.check(cgi[‘uri’], cgi[‘user’], cgi[‘pass’])
else
Foo.check(cgi[‘uri’])
end

response.start(200, true) do |head, body|
Foo.report(output=body)
end
end
end

h = Mongrel::HttpServer.new(‘0.0.0.0’, 5000)
h.register(’/foo’, FooHandler.new)
h.run.join
]]]

That’s it. Now I can launch the app from the command line without the
pain of any server configuration. Thanks to Evan for pointing me to
the right direction btw

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs