diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-02-25 06:39:12 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-02-25 06:39:12 +0000 |
commit | 1727010a3abf84fd06f0e44d44b1b8ef6cde588e (patch) | |
tree | 098dc615cb65069b1d3f714cd959d3d3927c2aeb /lib | |
parent | 3976feed73bf4ec27183824870ee077c2b5b00b1 (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')
-rw-r--r-- | lib/cgi-lib.rb | 270 |
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"){ |