Skip to content

Instantly share code, notes, and snippets.

@aschoerk
Created May 23, 2012 15:24
Show Gist options
  • Save aschoerk/2775878 to your computer and use it in GitHub Desktop.
Save aschoerk/2775878 to your computer and use it in GitHub Desktop.
Allows to debug a cgi script in ruby with minimal effort inside an IDE.
#!/usr/bin/env ruby
$:.unshift File.join(File.dirname(__FILE__),'.','')
require 'webrick'
require 'cgi'
require 'stringio'
$cgi_input = nil
class CGI
def stdoutput
@str_output = StringIO.new if not defined? @str_output
@str_output
end
def stdinput
$cgi_input
end
def to_s
return @str_output.string if defined? @str_output
"EMPTY"
end
end
class CgiTester < WEBrick::HTTPServlet::AbstractServlet
def initialize(server)
super
@script_filename = "inprocess_script"
@tempdir = server[:TempDir]
end
def do_GET(req, res)
if RUBY_VERSION >= "1.9"
load "#{ARGF.argv[0]}"
else
load "#{$ARGV[0]}"
end
cgi_in = Tempfile.new("webrick.cgi_in.", @tempdir)
meta = req.meta_vars
ENV.keys.each{|name| ENV.delete(name) }
meta.each{|k, v| ENV[k] = v if v }
if req.body and req.body.size > 0
cgi_in.write(req.body)
end
cgi_in.close
$cgi_input = File.open(cgi_in.path)
cgi = initCGI(CGI.new("html3"))
$cgi_input.close
content = cgi.to_s
res.status = 200
ix = content.index("\r\n\r\n")
res.content_type = 'text/html'
res.content_length = content.length - ix
res.body = content[ix..-1]
end
alias do_POST do_GET
end
include WEBrick
s = HTTPServer.new(
:Port => 8081
)
s.mount "/cgitester", CgiTester
trap("INT") { s.shutdown }
s.start
require 'cgi'
def initCGI(cgi)
cgi.out {
cgi.head {
cgi.title {"test title"}
} +
cgi.body {
cgi.h1 {"Test Header"}
}
}
return cgi
end
if __FILE__ == $0
cgi = CGI.new("html3")
initCGI(cgi)
end
@aschoerk
Copy link
Author

I searched for a method to be able to easily debug cgi-scripts

  • Without having to add any additional gems.
  • The script can be debugged as it is intended to be deployed

Start with: ruby cgitester.rb examplecgi.rb

Open in Browser: http://localhost:8081/cgitester

Tested with ruby 1.8.7, don't use it as server, it's not thread safe

@JunjiUmeno
Copy link

Hi, aschoerk. Tell me why this block needs? Thanks!

if FILE == $0
  cgi = CGI.new("html3")
  initCGI(cgi)
end

@Stratus3D
Copy link

@JunjiUmeno, that __FILE__ == $0 check returns true when the file is being executed on it's own, and not loaded into the cgitester script. When deploying to the real webserver, Apache, or whatever webserver you are using, will invoke the script directly, instead of invoking the initCGI method like the cgitester script. Since the function as a whole is executed by the webserver the script needs to invoke initCGI on its own.

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