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  |