summaryrefslogtreecommitdiff
path: root/lib/cgi-lib.rb
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1999-02-25 06:39:12 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1999-02-25 06:39:12 +0000
commit1727010a3abf84fd06f0e44d44b1b8ef6cde588e (patch)
tree098dc615cb65069b1d3f714cd959d3d3927c2aeb /lib/cgi-lib.rb
parent3976feed73bf4ec27183824870ee077c2b5b00b1 (diff)
990225
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_3@407 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/cgi-lib.rb')
-rw-r--r--lib/cgi-lib.rb270
1 files changed, 177 insertions, 93 deletions
diff --git a/lib/cgi-lib.rb b/lib/cgi-lib.rb
index 83ea6118b9..12c850240b 100644
--- a/lib/cgi-lib.rb
+++ b/lib/cgi-lib.rb
@@ -1,54 +1,113 @@
-#
-# Get CGI String
-#
-# EXAMPLE:
-# require "cgi-lib.rb"
-# foo = CGI.new
-# foo['field'] <== value of 'field'
-# foo.keys <== array of fields
-# and foo has Hash class methods
-#
-# foo.cookie['name'] <== cookie value of 'name'
-# foo.cookie.keys <== all cookie names
-# and foo.cookie has Hash class methods
-#
-# make raw cookie string
-# cookie1 = CGI.cookie({'name' => 'name',
-# 'value' => 'value',
-# 'path' => 'path', # optional
-# 'domain' => 'domain', # optional
-# 'expires' => Time.now, # optional
-# 'secure' => true # optional
-# })
-#
-# print CGI.header("Content-Type: text/html", cookie1, cookie2)
-#
-# print CGI.header("HTTP/1.0 200 OK", "Content-Type: text/html")
-# print CGI.header # == print CGI.header("Content-Type: text/html")
-#
-# make HTML tag string
-# CGI.tag("element", {"attribute_name"=>"attribute_value"}){"content"}
-#
-# 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")
-# }
-# }
-#
-# print HTTP header and strings to STDOUT
-# CGI.print{ "string" } # add HTTP header "Content-Type: text/html"
-# CGI.print("Content-Type: text/plain"){ "string" }
-# CGI.print("HTTP/1.0 200 OK", "Content-Type: text/html"){ "string" }
-
-
-# if running on Windows(IIS or PWS) then change cwd.
-if ENV['SERVER_SOFTWARE'] =~ /^Microsoft-/ then
- Dir.chdir ENV['PATH_TRANSLATED'].sub(/[^\\]+$/, '')
-end
+=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"
@@ -58,33 +117,19 @@ class CGI < SimpleDelegator
LF = "\012"
EOL = CR + LF
- attr("inputs")
- attr("cookie")
-
- # original is CGI.pm
- def read_from_cmdline
- require "shellwords.rb"
- words = Shellwords.shellwords(if not ARGV.empty? then
- ARGV.join(' ')
- else
- STDERR.print "(offline mode: enter name=value pairs on standard input)\n" if STDIN.tty?
- readlines.join(' ').gsub(/\n/, '')
- end.gsub(/\\=/, '%3D').gsub(/\\&/, '%26'))
-
- if words.find{|x| x =~ /=/} then words.join('&') else words.join('+') end
+ # if running on Windows(IIS or PWS) then change cwd.
+ if ENV['SERVER_SOFTWARE'] =~ /^Microsoft-/
+ Dir.chdir(ENV['PATH_TRANSLATED'].sub(/[^\\]+$/, ''))
end
-
+
# escape url encode
def escape(str)
- str.gsub!(/[^a-zA-Z0-9_\-.]/n){ sprintf("%%%02X", $&.unpack("C")[0]) }
- str
+ str.gsub(/[^a-zA-Z0-9_\-.]/n){ sprintf("%%%02X", $&.unpack("C")[0]) }
end
# unescape url encoded
def unescape(str)
- str.gsub!(/\+/, ' ')
- str.gsub!(/%([0-9a-fA-F]{2})/){ [$1.hex].pack("c") }
- str
+ str.gsub(/\+/, ' ').gsub(/%([0-9a-fA-F]{2})/){ [$1.hex].pack("c") }
end
# escape HTML
@@ -94,17 +139,33 @@ class CGI < SimpleDelegator
module_function :escape, :unescape, :escapeHTML
+ # offline mode. read name=value pairs on standard input.
+ def read_from_cmdline
+ require "shellwords.rb"
+ words = Shellwords.shellwords(
+ if not ARGV.empty?
+ ARGV.join(' ')
+ else
+ STDERR.print "(offline mode: enter name=value pairs on standard input)\n" if STDIN.tty?
+ readlines.join(' ').gsub(/\n/, '')
+ end.gsub(/\\=/, '%3D').gsub(/\\&/, '%26'))
+
+ if words.find{|x| x =~ /=/} then words.join('&') else words.join('+') end
+ end
+
def initialize(input = $stdin)
@inputs = {}
+ @cookie = {}
+
case ENV['REQUEST_METHOD']
when "GET"
# exception messages should be printed to stdout.
- STDERR.reopen(STDOUT)
+ STDERR.reopen($>)
ENV['QUERY_STRING'] or ""
when "POST"
# exception messages should be printed to stdout.
- STDERR.reopen(STDOUT)
+ STDERR.reopen($>)
input.read Integer(ENV['CONTENT_LENGTH'])
else
read_from_cmdline
@@ -119,27 +180,32 @@ class CGI < SimpleDelegator
super(@inputs)
- if ENV.has_key?('HTTP_COOKIE')
- @cookie = {}
- ENV['HTTP_COOKIE'].split("; ").each do |x|
- key, val = x.split(/=/,2).collect{|x|unescape(x)}
+ if ENV.has_key?('HTTP_COOKIE') or ENV.has_key?('COOKIE')
+ (ENV['HTTP_COOKIE'] or ENV['COOKIE']).split("; ").each do |x|
+ key, val = x.split(/=/,2)
+ key = unescape(key)
+ val = val.split(/&/).collect{|x|unescape(x)}.join("\0")
if @cookie.include?(key)
- @cookie[key] += "\0" + (val or "")
+ @cookie[key] += "\0" + val
else
- @cookie[key] = (val or "")
+ @cookie[key] = val
end
end
end
end
- def CGI.header(*options)
- options.push("Content-Type: text/html") if options.empty?
- if options.find{|item| /^Expires: |^Set-Cookie: /i === item}
- options.push("Date: " + Time.now.gmtime.strftime("%a, %d %b %Y %X %Z"))
- end
- options.join(EOL) + EOL + EOL
+ attr("inputs")
+ attr("cookie")
+
+ # make HTML tag string
+ def CGI.tag(element, attributes = {})
+ "<" + escapeHTML(element) + attributes.collect{|name, value|
+ " " + escapeHTML(name) + '="' + escapeHTML(value) + '"'
+ }.to_s + ">" +
+ (iterator? ? yield.to_s + "</" + escapeHTML(element) + ">" : "")
end
+ # make raw cookie string
def CGI.cookie(options)
"Set-Cookie: " + options['name'] + '=' + escape(options['value']) +
(options['domain'] ? '; domain=' + options['domain'] : '') +
@@ -148,18 +214,35 @@ class CGI < SimpleDelegator
(options['secure'] ? '; secure' : '')
end
- def CGI.tag(element, attributes = {})
- "<" + escapeHTML(element) + attributes.collect{|name, value|
- " " + escapeHTML(name) + '="' + escapeHTML(value) + '"'
- }.to_s + ">" +
- (iterator? ? yield.to_s + "</" + escapeHTML(element) + ">" : "")
+ # make HTTP header string
+ def CGI.header(*options)
+ if ENV['MOD_RUBY']
+ options.each{|option|
+ option.sub(/(.*?): (.*)/){
+ Apache::request[$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: " + Time.now.gmtime.strftime("%a, %d %b %Y %X %Z"),
+ "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
- def CGI.print(*header)
- header.push("Content-Type: text/html") if header.empty?
- STDOUT.print CGI.header(*header) + yield.to_s
+ # 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']
@@ -175,6 +258,7 @@ class CGI < SimpleDelegator
TRUE
end
+ # print error message to $> and exit
def CGI.error
CGI.message({'title'=>'ERROR', 'body'=>
CGI.tag("PRE"){