All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gallio.DLR.libs.IronRuby.lib.ruby.1.8.cgi-lib.rb Maven / Gradle / Ivy

warn "Warning:#{caller[0].sub(/:in `.*'\z/, '')}: cgi-lib is deprecated after Ruby 1.8.1; use cgi instead"

=begin

= simple CGI support library

= example

== get form values

	require "cgi-lib.rb"
	query = CGI.new
	query['field']   # <== value of 'field'
	query.keys       # <== array of fields

and query has Hash class methods


== get cookie values

	require "cgi-lib.rb"
	query = CGI.new
	query.cookie['name']  # <== cookie value of 'name'
	query.cookie.keys     # <== all cookie names

and query.cookie has Hash class methods


== print HTTP header and HTML string to $>

	require "cgi-lib.rb"
	CGI::print{
	  CGI::tag("HTML"){
	    CGI::tag("HEAD"){ CGI::tag("TITLE"){"TITLE"} } +
	    CGI::tag("BODY"){
	      CGI::tag("FORM", {"ACTION"=>"test.rb", "METHOD"=>"POST"}){
	        CGI::tag("INPUT", {"TYPE"=>"submit", "VALUE"=>"submit"})
	      } +
	      CGI::tag("HR")
	    }
	  }
	}


== make raw cookie string

	require "cgi-lib.rb"
	cookie1 = CGI::cookie({'name'    => 'name',
	                       'value'   => 'value',
	                       'path'    => 'path',   # optional
	                       'domain'  => 'domain', # optional
	                       'expires' => Time.now, # optional
	                       'secure'  => true      # optional
	                      })

	CGI::print("Content-Type: text/html", cookie1, cookie2){ "string" }


== print HTTP header and string to $>

	require "cgi-lib.rb"
	CGI::print{ "string" }
	  # == CGI::print("Content-Type: text/html"){ "string" }
	CGI::print("Content-Type: text/html", cookie1, cookie2){ "string" }


=== NPH (no-parse-header) mode

	require "cgi-lib.rb"
	CGI::print("nph"){ "string" }
	  # == CGI::print("nph", "Content-Type: text/html"){ "string" }
	CGI::print("nph", "Content-Type: text/html", cookie1, cookie2){ "string" }


== make HTML tag string

	require "cgi-lib.rb"
	CGI::tag("element", {"attribute_name"=>"attribute_value"}){"content"}


== make HTTP header string

	require "cgi-lib.rb"
	CGI::header # == CGI::header("Content-Type: text/html")
	CGI::header("Content-Type: text/html", cookie1, cookie2)


=== NPH (no-parse-header) mode

	CGI::header("nph") # == CGI::header("nph", "Content-Type: text/html")
	CGI::header("nph", "Content-Type: text/html", cookie1, cookie2)


== escape url encode

	require "cgi-lib.rb"
	url_encoded_string = CGI::escape("string")


== unescape url encoded

	require "cgi-lib.rb"
	string = CGI::unescape("url encoded string")


== escape HTML &"<>

	require "cgi-lib.rb"
	CGI::escapeHTML("string")


=end

require "delegate"

class CGI < SimpleDelegator

  CR  = "\015"
  LF  = "\012"
  EOL = CR + LF

  RFC822_DAYS = %w[ Sun Mon Tue Wed Thu Fri Sat ]
  RFC822_MONTHS = %w[ Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ]

  # make rfc1123 date string
  def CGI::rfc1123_date(time)
    t = time.clone.gmtime
    return format("%s, %.2d %s %d %.2d:%.2d:%.2d GMT",
                RFC822_DAYS[t.wday], t.day, RFC822_MONTHS[t.month-1], t.year,
                t.hour, t.min, t.sec)
  end

  # escape url encode
  def CGI::escape(str)
    str.gsub(/[^a-zA-Z0-9_\-.]/n){ sprintf("%%%02X", $&.unpack("C")[0]) }
  end

  # unescape url encoded
  def CGI::unescape(str)
    str.gsub(/\+/, ' ').gsub(/%([0-9a-fA-F]{2})/){ [$1.hex].pack("c") }
  end

  # escape HTML
  def CGI::escapeHTML(str)
    str.gsub(/&/, "&").gsub(/\"/, """).gsub(/>/, ">").gsub(/" +
    (iterator? ? yield.to_s + "" : "")
  end

  # make raw cookie string
  def CGI::cookie(options)
    "Set-Cookie: " + options['name'] + '=' + escape(options['value']) +
    (options['domain']  ? '; domain='  + options['domain'] : '') +
    (options['path']    ? '; path='    + options['path']   : '') +
    (options['expires'] ? '; expires=' + rfc1123_date(options['expires']) : '') +
    (options['secure']  ? '; secure' : '')
  end

  # make HTTP header string
  def CGI::header(*options)
    if defined?(MOD_RUBY)
      options.each{|option|
        option.sub(/(.*?): (.*)/){
          Apache::request.headers_out[$1] = $2
        }
      }
      Apache::request.send_http_header
      ''
    else
      if options.delete("nph") or (ENV['SERVER_SOFTWARE'] =~ /IIS/)
        [(ENV['SERVER_PROTOCOL'] or "HTTP/1.0") + " 200 OK",
         "Date: " + rfc1123_date(Time.now),
         "Server: " + (ENV['SERVER_SOFTWARE'] or ""),
         "Connection: close"] +
        (options.empty? ? ["Content-Type: text/html"] : options)
      else
        options.empty? ? ["Content-Type: text/html"] : options
      end.join(EOL) + EOL + EOL
    end
  end

  # print HTTP header and string to $>
  def CGI::print(*options)
    $>.print CGI::header(*options) + yield.to_s
  end

  # print message to $>
  def CGI::message(message, title = "", header = ["Content-Type: text/html"])
    if message.kind_of?(Hash)
      title   = message['title']
      header  = message['header']
      message = message['body']
    end
    CGI::print(*header){
      CGI::tag("HTML"){
        CGI::tag("HEAD"){ CGI.tag("TITLE"){ title } } +
        CGI::tag("BODY"){ message }
      }
    }
    true
  end

  # print error message to $> and exit
  def CGI::error
    CGI::message({'title'=>'ERROR', 'body'=>
      CGI::tag("PRE"){
        "ERROR: " + CGI::tag("STRONG"){ escapeHTML($!.to_s) } + "\n" + escapeHTML([email protected]("\n"))
      }
    })
    exit
  end
end




© 2015 - 2025 Weber Informatics LLC | Privacy Policy