Class: WEBrick::HTTPServlet::CGIHandler
- Inherits:
-
AbstractServlet
- Object
- AbstractServlet
- WEBrick::HTTPServlet::CGIHandler
- Defined in:
- lib/webrick/httpservlet/cgihandler.rb
Overview
Servlet for handling CGI scripts
Example:
server.mount('/cgi/my_script', WEBrick::HTTPServlet::CGIHandler,
'/path/to/my_script')
Constant Summary collapse
- Ruby =
:nodoc:
RbConfig.ruby
- CGIRunner =
:nodoc:
"\"#{Ruby}\" \"#{WEBrick::Config::LIBDIR}/httpservlet/cgi_runner.rb\""
- CGIRunnerArray =
:nodoc:
[Ruby, "#{WEBrick::Config::LIBDIR}/httpservlet/cgi_runner.rb".freeze].freeze
Instance Method Summary collapse
-
#do_GET(req, res) ⇒ Object
(also: #do_POST)
:stopdoc:.
-
#initialize(server, name) ⇒ CGIHandler
constructor
Creates a new CGI script servlet for the script at
name
.
Methods inherited from AbstractServlet
#do_HEAD, #do_OPTIONS, get_instance, #service
Constructor Details
#initialize(server, name) ⇒ CGIHandler
Creates a new CGI script servlet for the script at name
36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/webrick/httpservlet/cgihandler.rb', line 36 def initialize(server, name) super(server, name) @script_filename = name @tempdir = server[:TempDir] interpreter = server[:CGIInterpreter] if interpreter.is_a?(Array) @cgicmd = CGIRunnerArray + interpreter else @cgicmd = "#{CGIRunner} #{interpreter}" end end |
Instance Method Details
#do_GET(req, res) ⇒ Object Also known as: do_POST
:stopdoc:
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/webrick/httpservlet/cgihandler.rb', line 50 def do_GET(req, res) cgi_in = IO::popen(@cgicmd, "wb") cgi_out = Tempfile.new("webrick.cgiout.", @tempdir, mode: IO::BINARY) cgi_out.set_encoding("ASCII-8BIT") cgi_err = Tempfile.new("webrick.cgierr.", @tempdir, mode: IO::BINARY) cgi_err.set_encoding("ASCII-8BIT") begin cgi_in.sync = true = req. ["SCRIPT_FILENAME"] = @script_filename ["PATH"] = @config[:CGIPathEnv] .delete("HTTP_PROXY") if /mswin|bccwin|mingw/ =~ RUBY_PLATFORM ["SystemRoot"] = ENV["SystemRoot"] end dump = Marshal.dump() cgi_in.write("%8d" % cgi_out.path.bytesize) cgi_in.write(cgi_out.path) cgi_in.write("%8d" % cgi_err.path.bytesize) cgi_in.write(cgi_err.path) cgi_in.write("%8d" % dump.bytesize) cgi_in.write(dump) req.body { |chunk| cgi_in.write(chunk) } ensure cgi_in.close status = $?.exitstatus sleep 0.1 if /mswin|bccwin|mingw/ =~ RUBY_PLATFORM data = cgi_out.read cgi_out.close(true) if errmsg = cgi_err.read if errmsg.bytesize > 0 @logger.error("CGIHandler: #{@script_filename}:\n" + errmsg) end end cgi_err.close(true) end if status != 0 @logger.error("CGIHandler: #{@script_filename} exit with #{status}") end data = "" unless data raw_header, body = data.split(/^[\xd\xa]+/, 2) raise HTTPStatus::InternalServerError, "Premature end of script headers: #{@script_filename}" if body.nil? begin header = HTTPUtils::parse_header(raw_header) if /^(\d+)/ =~ header['status'][0] res.status = $1.to_i header.delete('status') end if header.has_key?('location') # RFC 3875 6.2.3, 6.2.4 res.status = 302 unless (300...400) === res.status end if header.has_key?('set-cookie') header['set-cookie'].each{|k| res. << Cookie.(k) } header.delete('set-cookie') end header.each{|key, val| res[key] = val.join(", ") } rescue => ex raise HTTPStatus::InternalServerError, ex. end res.body = body end |