# WEBrick::HTTPServlet::CGIHandler (Class)

In: | webrick/httpservlet/cgihandler.rb
Parent: | AbstractServlet

## Methods

do_GET do_POST new

## Constants

Ruby | = | File::join(::Config::CONFIG['bindir'], ::Config::CONFIG['ruby_install_name'])
CGIRunner | = | "\"#{Ruby}\" \"#{Config::LIBDIR}/httpservlet/cgi_runner.rb\""

## Public Class methods

new(server, name)

[Source]

    # File webrick/httpservlet/cgihandler.rb, line 25
          def initialize(server, name)
            super
            @script_filename = name
            @tempdir = server[:TempDir]
            @cgicmd = "#{CGIRunner} #{server[:CGIInterpreter]}"
          end

## Public Instance methods

do_GET(req, res)

[Source]

    # File webrick/httpservlet/cgihandler.rb, line 32
          def do_GET(req, res)
            data = nil
            status = -1

            cgi_in = IO::popen(@cgicmd, "wb")
            cgi_out = Tempfile.new("webrick.cgiout.", @tempdir)
            cgi_err = Tempfile.new("webrick.cgierr.", @tempdir)
            begin
              cgi_in.sync = true
              meta = req.meta_vars
              meta["SCRIPT_FILENAME"] = @script_filename
              meta["PATH"] = @config[:CGIPathEnv]
              dump = Marshal.dump(meta)

              cgi_in.write("%8d" % cgi_out.path.size)
              cgi_in.write(cgi_out.path)
              cgi_in.write("%8d" % cgi_err.path.size)
              cgi_in.write(cgi_err.path)
              cgi_in.write("%8d" % dump.size)
              cgi_in.write(dump)

              if req.body and req.body.size > 0
                cgi_in.write(req.body)
              end
            ensure
              cgi_in.close
              status = $? >> 8
              sleep 0.1 if /mswin/ =~ RUBY_PLATFORM
              data = cgi_out.read
              cgi_out.close(true)
              if errmsg = cgi_err.read
                if errmsg.size > 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]+/on, 2)
            raise HTTPStatus::InternalServerError,
              "The server encontered a script error." if body.nil?

            begin
              header = HTTPUtils::parse_header(raw_header)
              if /^(\d+)/ =~ header['status'][0]
                res.status = $1.to_i
                header.delete('status')
              end
              header.each{|key, val| res[key] = val.join(", ") }
            rescue => ex
              raise HTTPStatus::InternalServerError, ex.message
            end
            res.body = body
          end

do_POST(req, res)

Alias for do_GET

[Validate]