# # ## Overview # # The Common Gateway Interface (CGI) is a simple protocol for passing an HTTP # request from a web server to a standalone program, and returning the output to # the web browser. Basically, a CGI program is called with the parameters of # the request passed in either in the environment (GET) or via $stdin (POST), # and everything it prints to $stdout is returned to the client. # # This file holds the CGI class. This class provides functionality for # retrieving HTTP request parameters, managing cookies, and generating HTML # output. # # The file CGI::Session provides session management functionality; see that # class for more details. # # See http://www.w3.org/CGI/ for more information on the CGI protocol. # # ## Introduction # # CGI is a large class, providing several categories of methods, many of which # are mixed in from other modules. Some of the documentation is in this class, # some in the modules CGI::QueryExtension and CGI::HtmlExtension. See # CGI::Cookie for specific information on handling cookies, and cgi/session.rb # (CGI::Session) for information on sessions. # # For queries, CGI provides methods to get at environmental variables, # parameters, cookies, and multipart request data. For responses, CGI provides # methods for writing output and generating HTML. # # Read on for more details. Examples are provided at the bottom. # # ## Queries # # The CGI class dynamically mixes in parameter and cookie-parsing functionality, # environmental variable access, and support for parsing multipart requests # (including uploaded files) from the CGI::QueryExtension module. # # ### Environmental Variables # # The standard CGI environmental variables are available as read-only attributes # of a CGI object. The following is a list of these variables: # # AUTH_TYPE HTTP_HOST REMOTE_IDENT # CONTENT_LENGTH HTTP_NEGOTIATE REMOTE_USER # CONTENT_TYPE HTTP_PRAGMA REQUEST_METHOD # GATEWAY_INTERFACE HTTP_REFERER SCRIPT_NAME # HTTP_ACCEPT HTTP_USER_AGENT SERVER_NAME # HTTP_ACCEPT_CHARSET PATH_INFO SERVER_PORT # HTTP_ACCEPT_ENCODING PATH_TRANSLATED SERVER_PROTOCOL # HTTP_ACCEPT_LANGUAGE QUERY_STRING SERVER_SOFTWARE # HTTP_CACHE_CONTROL REMOTE_ADDR # HTTP_FROM REMOTE_HOST # # For each of these variables, there is a corresponding attribute with the same # name, except all lower case and without a preceding HTTP_. `content_length` # and `server_port` are integers; the rest are strings. # # ### Parameters # # The method #params() returns a hash of all parameters in the request as # name/value-list pairs, where the value-list is an Array of one or more values. # The CGI object itself also behaves as a hash of parameter names to values, # but only returns a single value (as a String) for each parameter name. # # For instance, suppose the request contains the parameter "favourite_colours" # with the multiple values "blue" and "green". The following behavior would # occur: # # cgi.params["favourite_colours"] # => ["blue", "green"] # cgi["favourite_colours"] # => "blue" # # If a parameter does not exist, the former method will return an empty array, # the latter an empty string. The simplest way to test for existence of a # parameter is by the #has_key? method. # # ### Cookies # # HTTP Cookies are automatically parsed from the request. They are available # from the #cookies() accessor, which returns a hash from cookie name to # CGI::Cookie object. # # ### Multipart requests # # If a request's method is POST and its content type is multipart/form-data, # then it may contain uploaded files. These are stored by the QueryExtension # module in the parameters of the request. The parameter name is the name # attribute of the file input field, as usual. However, the value is not a # string, but an IO object, either an IOString for small files, or a Tempfile # for larger ones. This object also has the additional singleton methods: # # #local_path() # : the path of the uploaded file on the local filesystem # #original_filename() # : the name of the file on the client computer # #content_type() # : the content type of the file # # # ## Responses # # The CGI class provides methods for sending header and content output to the # HTTP client, and mixes in methods for programmatic HTML generation from # CGI::HtmlExtension and CGI::TagMaker modules. The precise version of HTML to # use for HTML generation is specified at object creation time. # # ### Writing output # # The simplest way to send output to the HTTP client is using the #out() method. # This takes the HTTP headers as a hash parameter, and the body content via a # block. The headers can be generated as a string using the #http_header() # method. The output stream can be written directly to using the #print() # method. # # ### Generating HTML # # Each HTML element has a corresponding method for generating that element as a # String. The name of this method is the same as that of the element, all # lowercase. The attributes of the element are passed in as a hash, and the # body as a no-argument block that evaluates to a String. The HTML generation # module knows which elements are always empty, and silently drops any passed-in # body. It also knows which elements require matching closing tags and which # don't. However, it does not know what attributes are legal for which # elements. # # There are also some additional HTML generation methods mixed in from the # CGI::HtmlExtension module. These include individual methods for the different # types of form inputs, and methods for elements that commonly take particular # attributes where the attributes can be directly specified as arguments, rather # than via a hash. # # ### Utility HTML escape and other methods like a function. # # There are some utility tool defined in cgi/util.rb . And when include, you can # use utility methods like a function. # # ## Examples of use # # ### Get form values # # require "cgi" # cgi = CGI.new # value = cgi['field_name'] # <== value string for 'field_name' # # if not 'field_name' included, then return "". # fields = cgi.keys # <== array of field names # # # returns true if form has 'field_name' # cgi.has_key?('field_name') # cgi.has_key?('field_name') # cgi.include?('field_name') # # CAUTION! `cgi['field_name']` returned an Array with the old cgi.rb(included in # Ruby 1.6) # # ### Get form values as hash # # require "cgi" # cgi = CGI.new # params = cgi.params # # cgi.params is a hash. # # cgi.params['new_field_name'] = ["value"] # add new param # cgi.params['field_name'] = ["new_value"] # change value # cgi.params.delete('field_name') # delete param # cgi.params.clear # delete all params # # ### Save form values to file # # require "pstore" # db = PStore.new("query.db") # db.transaction do # db["params"] = cgi.params # end # # ### Restore form values from file # # require "pstore" # db = PStore.new("query.db") # db.transaction do # cgi.params = db["params"] # end # # ### Get multipart form values # # require "cgi" # cgi = CGI.new # value = cgi['field_name'] # <== value string for 'field_name' # value.read # <== body of value # value.local_path # <== path to local file of value # value.original_filename # <== original filename of value # value.content_type # <== content_type of value # # and value has StringIO or Tempfile class methods. # # ### Get cookie values # # require "cgi" # cgi = CGI.new # values = cgi.cookies['name'] # <== array of 'name' # # if not 'name' included, then return []. # names = cgi.cookies.keys # <== array of cookie names # # and cgi.cookies is a hash. # # ### Get cookie objects # # require "cgi" # cgi = CGI.new # for name, cookie in cgi.cookies # cookie.expires = Time.now + 30 # end # cgi.out("cookie" => cgi.cookies) {"string"} # # cgi.cookies # { "name1" => cookie1, "name2" => cookie2, ... } # # require "cgi" # cgi = CGI.new # cgi.cookies['name'].expires = Time.now + 30 # cgi.out("cookie" => cgi.cookies['name']) {"string"} # # ### Print http header and html string to $DEFAULT_OUTPUT ($>) # # require "cgi" # cgi = CGI.new("html4") # add HTML generation methods # cgi.out do # cgi.html do # cgi.head do # cgi.title { "TITLE" } # end + # cgi.body do # cgi.form("ACTION" => "uri") do # cgi.p do # cgi.textarea("get_text") + # cgi.br + # cgi.submit # end # end + # cgi.pre do # CGI.escapeHTML( # "params: #{cgi.params.inspect}\n" + # "cookies: #{cgi.cookies.inspect}\n" + # ENV.collect do |key, value| # "#{key} --> #{value}\n" # end.join("") # ) # end # end # end # end # # # add HTML generation methods # CGI.new("html3") # html3.2 # CGI.new("html4") # html4.01 (Strict) # CGI.new("html4Tr") # html4.01 Transitional # CGI.new("html4Fr") # html4.01 Frameset # CGI.new("html5") # html5 # # ### Some utility methods # # require 'cgi/util' # CGI.escapeHTML('Usage: foo "bar" ') # # ### Some utility methods like a function # # require 'cgi/util' # include CGI::Util # escapeHTML('Usage: foo "bar" ') # h('Usage: foo "bar" ') # alias # class CGI include CGI::Util extend CGI::Util # # Create a new CGI instance. # # `tag_maker` # : This is the same as using the `options_hash` form with the value `{ # :tag_maker => tag_maker }` Note that it is recommended to use the # `options_hash` form, since it also allows you specify the charset you will # accept. # `options_hash` # : A Hash that recognizes three options: # # `:accept_charset` # : specifies encoding of received query string. If omitted, # `@@accept_charset` is used. If the encoding is not valid, a # CGI::InvalidEncoding will be raised. # # Example. Suppose `@@accept_charset` is "UTF-8" # # when not specified: # # cgi=CGI.new # @accept_charset # => "UTF-8" # # when specified as "EUC-JP": # # cgi=CGI.new(:accept_charset => "EUC-JP") # => "EUC-JP" # # `:tag_maker` # : String that specifies which version of the HTML generation methods to # use. If not specified, no HTML generation methods will be loaded. # # The following values are supported: # # "html3" # : HTML 3.x # "html4" # : HTML 4.0 # "html4Tr" # : HTML 4.0 Transitional # "html4Fr" # : HTML 4.0 with Framesets # "html5" # : HTML 5 # # # `:max_multipart_length` # : Specifies maximum length of multipart data. Can be an Integer scalar # or a lambda, that will be evaluated when the request is parsed. This # allows more complex logic to be set when determining whether to accept # multipart data (e.g. consult a registered users upload allowance) # # Default is 128 * 1024 * 1024 bytes # # cgi=CGI.new(:max_multipart_length => 268435456) # simple scalar # # cgi=CGI.new(:max_multipart_length => -> {check_filesystem}) # lambda # # # `block` # : If provided, the block is called when an invalid encoding is encountered. # For example: # # encoding_errors={} # cgi=CGI.new(:accept_charset=>"EUC-JP") do |name,value| # encoding_errors[name] = value # end # # # Finally, if the CGI object is not created in a standard CGI call environment # (that is, it can't locate REQUEST_METHOD in its environment), then it will run # in "offline" mode. In this mode, it reads its parameters from the command # line or (failing that) from standard input. Otherwise, cookies and other # parameters are parsed automatically from the standard CGI locations, which # varies according to the REQUEST_METHOD. # def initialize: (?String tag_maker) ?{ (String name, String value) -> void } -> void | (Hash[Symbol, untyped] options_hash) ?{ (String name, String value) -> void } -> void # # Return the accept character set for all new CGI instances. # def self.accept_charset: () -> String # # Set the accept character set for all new CGI instances. # def self.accept_charset=: (String accept_charset) -> String # # Parse an HTTP query string into a hash of key=>value pairs. # # params = CGI.parse("query_string") # # {"name1" => ["value1", "value2", ...], # # "name2" => ["value1", "value2", ...], ... } # def self.parse: (String query) -> Hash[String, Array[String]] public # # Return the accept character set for this CGI instance. # attr_reader accept_charset: String # # This method is an alias for #http_header, when HTML5 tag maker is inactive. # # NOTE: use #http_header to create HTTP header blocks, this alias is only # provided for backwards compatibility. # # Using #header with the HTML5 tag maker will create a
element. # alias header http_header # # Create an HTTP header block as a string. # # Includes the empty line that ends the header block. # # `content_type_string` # : If this form is used, this string is the `Content-Type` # `headers_hash` # : A Hash of header values. The following header keys are recognized: # # type # : The Content-Type header. Defaults to "text/html" # charset # : The charset of the body, appended to the Content-Type header. # nph # : A boolean value. If true, prepend protocol string and status code, # and date; and sets default values for "server" and "connection" if not # explicitly set. # status # : The HTTP status code as a String, returned as the Status header. The # values are: # # OK # : 200 OK # PARTIAL_CONTENT # : 206 Partial Content # MULTIPLE_CHOICES # : 300 Multiple Choices # MOVED # : 301 Moved Permanently # REDIRECT # : 302 Found # NOT_MODIFIED # : 304 Not Modified # BAD_REQUEST # : 400 Bad Request # AUTH_REQUIRED # : 401 Authorization Required # FORBIDDEN # : 403 Forbidden # NOT_FOUND # : 404 Not Found # METHOD_NOT_ALLOWED # : 405 Method Not Allowed # NOT_ACCEPTABLE # : 406 Not Acceptable # LENGTH_REQUIRED # : 411 Length Required # PRECONDITION_FAILED # : 412 Precondition Failed # SERVER_ERROR # : 500 Internal Server Error # NOT_IMPLEMENTED # : 501 Method Not Implemented # BAD_GATEWAY # : 502 Bad Gateway # VARIANT_ALSO_VARIES # : 506 Variant Also Negotiates # # # server # : The server software, returned as the Server header. # connection # : The connection type, returned as the Connection header (for instance, # "close". # length # : The length of the content that will be sent, returned as the # Content-Length header. # language # : The language of the content, returned as the Content-Language header. # expires # : The time on which the current content expires, as a `Time` object, # returned as the Expires header. # cookie # : A cookie or cookies, returned as one or more Set-Cookie headers. The # value can be the literal string of the cookie; a CGI::Cookie object; # an Array of literal cookie strings or Cookie objects; or a hash all of # whose values are literal cookie strings or Cookie objects. # # These cookies are in addition to the cookies held in the # @output_cookies field. # # # Other headers can also be set; they are appended as key: value. # # # Examples: # # http_header # # Content-Type: text/html # # http_header("text/plain") # # Content-Type: text/plain # # http_header("nph" => true, # "status" => "OK", # == "200 OK" # # "status" => "200 GOOD", # "server" => ENV['SERVER_SOFTWARE'], # "connection" => "close", # "type" => "text/html", # "charset" => "iso-2022-jp", # # Content-Type: text/html; charset=iso-2022-jp # "length" => 103, # "language" => "ja", # "expires" => Time.now + 30, # "cookie" => [cookie1, cookie2], # "my_header1" => "my_value", # "my_header2" => "my_value") # # This method does not perform charset conversion. # def http_header: (?String options) -> String | (?Hash[String | Symbol, untyped] header_hash) -> String def nph?: () -> untyped # # Print an HTTP header and body to $DEFAULT_OUTPUT ($>) # # `content_type_string` # : If a string is passed, it is assumed to be the content type. # `headers_hash` # : This is a Hash of headers, similar to that used by #http_header. # `block` # : A block is required and should evaluate to the body of the response. # # # `Content-Length` is automatically calculated from the size of the String # returned by the content block. # # If `ENV['REQUEST_METHOD'] == "HEAD"`, then only the header is output (the # content block is still required, but it is ignored). # # If the charset is "iso-2022-jp" or "euc-jp" or "shift_jis" then the content is # converted to this charset, and the language is set to "ja". # # Example: # # cgi = CGI.new # cgi.out{ "string" } # # Content-Type: text/html # # Content-Length: 6 # # # # string # # cgi.out("text/plain") { "string" } # # Content-Type: text/plain # # Content-Length: 6 # # # # string # # cgi.out("nph" => true, # "status" => "OK", # == "200 OK" # "server" => ENV['SERVER_SOFTWARE'], # "connection" => "close", # "type" => "text/html", # "charset" => "iso-2022-jp", # # Content-Type: text/html; charset=iso-2022-jp # "language" => "ja", # "expires" => Time.now + (3600 * 24 * 30), # "cookie" => [cookie1, cookie2], # "my_header1" => "my_value", # "my_header2" => "my_value") { "string" } # # HTTP/1.1 200 OK # # Date: Sun, 15 May 2011 17:35:54 GMT # # Server: Apache 2.2.0 # # Connection: close # # Content-Type: text/html; charset=iso-2022-jp # # Content-Length: 6 # # Content-Language: ja # # Expires: Tue, 14 Jun 2011 17:35:54 GMT # # Set-Cookie: foo # # Set-Cookie: bar # # my_header1: my_value # # my_header2: my_value # # # # string # def out: (?String content_type_string) { () -> String } -> void | (Hash[String | Symbol, untyped] headers_hash) { () -> String } -> void # # Print an argument or list of arguments to the default output stream # # cgi = CGI.new # cgi.print # default: cgi.print == $DEFAULT_OUTPUT.print # def print: (*String options) -> void private # # Synonym for $stdin. # def stdinput: () -> ::IO # # Synonym for $stdout. # def stdoutput: () -> ::IO # # String for carriage return # CR: String # # Standard internet newline sequence # EOL: String # # HTTP status codes. # HTTP_STATUS: Hash[String, String] # # String for linefeed # LF: String # # Maximum number of request parameters when multipart # MAX_MULTIPART_COUNT: Integer # # Whether processing will be required in binary vs text # NEEDS_BINMODE: bool # # Path separators in different environments. # PATH_SEPARATOR: Hash[String, String] REVISION: String VERSION: String # # Class representing an HTTP cookie. # # In addition to its specific fields and methods, a Cookie instance is a # delegator to the array of its values. # # See RFC 2965. # # ## Examples of use # cookie1 = CGI::Cookie.new("name", "value1", "value2", ...) # cookie1 = CGI::Cookie.new("name" => "name", "value" => "value") # cookie1 = CGI::Cookie.new('name' => 'name', # 'value' => ['value1', 'value2', ...], # 'path' => 'path', # optional # 'domain' => 'domain', # optional # 'expires' => Time.now, # optional # 'secure' => true, # optional # 'httponly' => true # optional # ) # # cgi.out("cookie" => [cookie1, cookie2]) { "string" } # # name = cookie1.name # values = cookie1.value # path = cookie1.path # domain = cookie1.domain # expires = cookie1.expires # secure = cookie1.secure # httponly = cookie1.httponly # # cookie1.name = 'name' # cookie1.value = ['value1', 'value2', ...] # cookie1.path = 'path' # cookie1.domain = 'domain' # cookie1.expires = Time.now + 30 # cookie1.secure = true # cookie1.httponly = true # class Cookie < Array[String] # # Parse a raw cookie string into a hash of cookie-name=>Cookie pairs. # # cookies = CGI::Cookie.parse("raw_cookie_string") # # { "name1" => cookie1, "name2" => cookie2, ... } # def self.parse: (String raw_cookie) -> Hash[String, instance] public # # Domain for which this cookie applies, as a `String` # def domain: () -> String? # # Set domain for which this cookie applies # def domain=: (String domain) -> String # # Time at which this cookie expires, as a `Time` # def expires: () -> Time? # # Time at which this cookie expires, as a `Time` # def expires=: (Time time) -> Time # # True if this cookie is httponly; false otherwise # def httponly: () -> bool # # Set whether the Cookie is a httponly cookie or not. # # `val` must be a boolean. # def httponly=: (boolish val) -> bool # # A summary of cookie string. # def inspect: () -> String # # Name of this cookie, as a `String` # def name: () -> String # # Set name of this cookie # def name=: (String name) -> String # # Path for which this cookie applies, as a `String` # def path: () -> String? # # Set path for which this cookie applies # def path=: (String path) -> String # # True if this cookie is secure; false otherwise # def secure: () -> bool # # Set whether the Cookie is a secure cookie or not. # # `val` must be a boolean. # def secure=: [A] (boolish val) -> A # # Convert the Cookie to its string representation. # def to_s: () -> String # # Returns the value or list of values for this cookie. # def value: () -> Array[String] # # Replaces the value of this cookie with a new value or list of values. # def value=: (String val) -> String | (Array[String] val) -> Array[String] private # # Create a new CGI::Cookie object. # # `name_string` # : The name of the cookie; in this form, there is no #domain or #expiration. # The #path is gleaned from the `SCRIPT_NAME` environment variable, and # #secure is false. # `*value` # : value or list of values of the cookie # `options_hash` # : A Hash of options to initialize this Cookie. Possible options are: # # name # : the name of the cookie. Required. # value # : the cookie's value or list of values. # path # : the path for which this cookie applies. Defaults to the value of the # `SCRIPT_NAME` environment variable. # domain # : the domain for which this cookie applies. # expires # : the time at which this cookie expires, as a `Time` object. # secure # : whether this cookie is a secure cookie or not (default to false). # Secure cookies are only transmitted to HTTPS servers. # httponly # : whether this cookie is a HttpOnly cookie or not (default to # # false). HttpOnly cookies are not available to javascript. # # These keywords correspond to attributes of the cookie object. # def initialize: (String name_string, *String value) -> void | (Hash[String, untyped] options_hash) -> void end module Escape public # # Returns URL-escaped string (`application/x-www-form-urlencoded`). # def escape: (string str) -> String # # Returns HTML-escaped string. # def escapeHTML: (string str) -> String # # Returns URL-escaped string following RFC 3986. # def escapeURIComponent: (string) -> String # # Returns URL-unescaped string (`application/x-www-form-urlencoded`). # def unescape: (string str, ?encoding encoding) -> String # # Returns HTML-unescaped string. # def unescapeHTML: (string str) -> String # # Returns URL-unescaped string following RFC 3986. # def unescapeURIComponent: (string) -> String end # # Exception raised when there is an invalid encoding detected # class InvalidEncoding < Exception end # # Mixin module that provides the following: # # 1. Access to the CGI environment variables as methods. See documentation to # the CGI class for a list of these variables. The methods are exposed by # removing the leading `HTTP_` (if it exists) and downcasing the name. For # example, `auth_type` will return the environment variable `AUTH_TYPE`, and # `accept` will return the value for `HTTP_ACCEPT`. # # 2. Access to cookies, including the cookies attribute. # # 3. Access to parameters, including the params attribute, and overloading #[] # to perform parameter value lookup by key. # # 4. The initialize_query method, for initializing the above mechanisms, # handling multipart forms, and allowing the class to be used in "offline" # mode. # module QueryExtension public # # Get the value for the parameter with a given key. # # If the parameter has multiple values, only the first will be retrieved; use # #params to get the array of values. # def []: (String key) -> String? def accept: () -> String? def accept_charset: () -> String? def accept_encoding: () -> String? def accept_language: () -> String? def auth_type: () -> String? def cache_control: () -> String? def content_length: () -> String? def content_type: () -> String? # # Get the cookies as a hash of cookie-name=>Cookie pairs. # def cookies: () -> Hash[String, Cookie] # # Get the cookies as a hash of cookie-name=>Cookie pairs. # def cookies=: (Hash[String, Cookie] cookies) -> Hash[String, Cookie] def create_body: (boolish is_large) -> (Tempfile | StringIO) # # Get the uploaded files as a hash of name=>values pairs # def files: () -> Hash[String, Tempfile | StringIO] def from: () -> String? def gateway_interface: () -> String? # # Returns true if a given query string parameter exists. # def has_key?: (String key) -> bool def host: () -> String? # # alias include? has_key? # # alias key? has_key? # # Return all query parameter names as an array of String. # def keys: () -> Array[String] # # Returns whether the form contained multipart/form-data # def multipart?: () -> bool def negotiate: () -> String? # # Get the parameters as a hash of name=>values pairs, where values is an Array. # def params: () -> Hash[String, Array[String] | Tempfile | StringIO] # # Set all the parameters. # def params=: (Hash[String, Array[String] | Tempfile | StringIO] hash) -> Hash[String, Array[String] | Tempfile | StringIO] def path_info: () -> String? def path_translated: () -> String? def pragma: () -> String? def query_string: () -> String? # # Get the raw cookies as a string. # def raw_cookie: () -> String? # # Get the raw RFC2965 cookies as a string. # def raw_cookie2: () -> String? def referer: () -> String? def remote_addr: () -> String? def remote_host: () -> String? def remote_ident: () -> String? def remote_user: () -> String? def request_method: () -> String? def script_name: () -> String? def server_name: () -> String? def server_port: () -> String? def server_protocol: () -> String? def server_software: () -> String? def unescape_filename?: () -> bool def user_agent: () -> String? private # # A wrapper class to use a StringIO object as the body and switch to a TempFile # when the passed threshold is passed. Initialize the data from the query. # # Handles multipart forms (in particular, forms that involve file uploads). # Reads query parameters in the @params field, and cookies into @cookies. # def initialize_query: () -> void # # offline mode. read name=value pairs on standard input. # def read_from_cmdline: () -> String # # Parses multipart form elements according to # http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 # # Returns a hash of multipart form parameters with bodies of type StringIO or # Tempfile depending on whether the multipart form element exceeds 10 KB # # params[name => body] # def read_multipart: (String boundary, Integer content_length) -> (Tempfile | StringIO) end module Util include CGI::Escape public # # Escape only the tags of certain HTML elements in `string`. # # Takes an element or elements or array of elements. Each element is specified # by the name of the element, without angle brackets. This matches both the # start and the end tag of that element. The attribute list of the open tag will # also be escaped (for instance, the double-quotes surrounding attribute # values). # # print CGI.escapeElement('
', "A", "IMG") # # "
<A HREF="url"></A>" # # print CGI.escapeElement('
', ["A", "IMG"]) # # "
<A HREF="url"></A>" # def escapeElement: (string string, *String | Array[String] elements) -> String # # Synonym for CGI.escapeElement(str) # alias escape_element escapeElement # # Synonym for CGI.escapeHTML(str) # alias escape_html escapeHTML # # alias h escapeHTML # # Prettify (indent) an HTML string. # # `string` is the HTML string to indent. `shift` is the indentation unit to # use; it defaults to two spaces. # # print CGI.pretty("") # # # # # # # # # # print CGI.pretty("", "\t") # # # # # # # # # def pretty: (string string, ?String shift) -> String # # Format a `Time` object as a String using the format specified by RFC 1123. # # CGI.rfc1123_date(Time.now) # # Sat, 01 Jan 2000 00:00:00 GMT # def rfc1123_date: (Time time) -> String # # Undo escaping such as that done by CGI.escapeElement() # # print CGI.unescapeElement( # CGI.escapeHTML('
'), "A", "IMG") # # "<BR>" # # print CGI.unescapeElement( # CGI.escapeHTML('
'), ["A", "IMG"]) # # "<BR>" # def unescapeElement: (string string, *String | Array[String] elements) -> String # # Synonym for CGI.unescapeElement(str) # alias unescape_element unescapeElement # # Synonym for CGI.unescapeHTML(str) # alias unescape_html unescapeHTML # Abbreviated day-of-week names specified by RFC 822 RFC822_DAYS: Array[String] # Abbreviated month names specified by RFC 822 RFC822_MONTHS: Array[String] # # The set of special characters and their escaped values # TABLE_FOR_ESCAPE_HTML__: Hash[String, String] end end