Skip to content

Instantly share code, notes, and snippets.

@autch
Created August 23, 2011 04:41
Show Gist options
  • Save autch/1164357 to your computer and use it in GitHub Desktop.
Save autch/1164357 to your computer and use it in GitHub Desktop.
ERB/CGI/PHP-capable WEBrick server
#!/usr/bin/ruby
ORG_ARGV = ARGV.dup
require 'optparse'
require 'socket'
BasicSocket.do_not_reverse_lookup = true
require 'webrick'
require 'webrick/cgi'
WEBrick::HTTPUtils::DefaultMimeTypes['erb'] = "text/html"
CONFIG = {
:DocumentRoot => Dir.pwd,
:BindAddress => nil,
:Port => 8080,
:CGIInterpreter => "env",
:log_open_mode => "a+",
:DirectoryIndex => %w(index.html index.htm index.php index.erb index.rhtml index.cgi),
:PHP_CGI => "php5-cgi -d cgi.force_redirect=0"
}
module WEBrick
module HTTPServlet
class PHPHandler < CGIHandler
def initialize(server, name)
super(server, name)
@php_docroot = server[:DocumentRoot]
@cgicmd = "#{CGIRunner} #{server[:PHP_CGI]}"
end
end
end
end
def open_logfile(filename)
f = File.open(filename, CONFIG[:log_open_mode])
f.sync = true
f
end
opt = OptionParser.new
opt.banner = "\nUsage: vcgi.rb [options]"
opt.on("-p" ,"--port PORT", Integer){|v| CONFIG[:Port] = v }
opt.on("-b" ,"--bind ADDR"){|v| CONFIG[:BindAddress] = v }
opt.on("-d", "--docroot DOCROOT"){|v| CONFIG[:DocumentRoot] = File.expand_path(v) }
opt.on("-c", "--cgi-bin CGI-BIN"){|v| CONFIG[:CGIBin] = File.expand_path(v) }
opt.on("-a", "--access-log FILENAME") {|v|
CONFIG[:AccessLog] = [ [ open_logfile(v),
WEBrick::AccessLog::COMMON_LOG_FORMAT ] ]
}
opt.on("-l", "--log FILENAME"){|v|
CONFIG[:Logger] = WEBrick::Log.new(open_logfile(v))
}
opt.on("-m", "--daemon") {|v| CONFIG[:daemonize] = v }
opt.on("-o", "--overwrite") {|v| CONFIG[:log_open_mode] = "w+" }
opt.parse!(ARGV)
if CONFIG[:daemonize] && (!CONFIG[:AccessLog] && !CONFIG[:Logger]) then
$stderr.print "Both -l and -a are required to daemonize\n"
puts opt
exit(-1)
end
if CONFIG[:daemonize] then
$stdin.reopen("/dev/null")
$stdout.reopen("/dev/null")
$stderr.reopen("/dev/null")
exit if fork
Process.setsid()
end
docroot = CONFIG[:DocumentRoot]
Dir.chdir(docroot) do
cgi_bin = File.join(docroot, "cgi-bin/")
(cgi_bin = CONFIG[:CGIBin] || docroot) unless File.exist?(cgi_bin)
WEBrick::HTTPServlet::FileHandler.instance_eval do
add_handler("erb", WEBrick::HTTPServlet::ERBHandler)
add_handler("cgi", WEBrick::HTTPServlet::CGIHandler)
add_handler("php", WEBrick::HTTPServlet::PHPHandler)
end
srv = WEBrick::HTTPServer.new(CONFIG)
srv.logger.info("DOCROOT: " + docroot)
srv.logger.info("CGI-BIN: " + cgi_bin)
srv.mount("/cgi-bin/", WEBrick::HTTPServlet::FileHandler, cgi_bin)
Signal.trap(:INT) { srv.shutdown }
Signal.trap(:TERM) { srv.shutdown }
Signal.trap(:HUP) do
srv.logger.info("Reloading server...")
srv.shutdown
exit! if fork { exec [$0, $0], *ORG_ARGV }
end
srv.start
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment