| Module | CGI::QueryExtension |
| In: |
lib/cgi.rb
|
Mixin module. It provides the follow functionality groups:
| path | -> | local_path |
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.
# File lib/cgi.rb, line 1169
1169: def [](key)
1170: params = @params[key]
1171: return '' unless params
1172: value = params[0]
1173: if @multipart
1174: if value
1175: return value
1176: elsif defined? StringIO
1177: StringIO.new("")
1178: else
1179: Tempfile.new("CGI")
1180: end
1181: else
1182: str = if value then value.dup else "" end
1183: str.extend(Value)
1184: str.set_params(params)
1185: str
1186: end
1187: end
Returns true if a given parameter key exists in the query.
# File lib/cgi.rb, line 1195
1195: def has_key?(*args)
1196: @params.has_key?(*args)
1197: end
Get the raw cookies as a string.
# File lib/cgi.rb, line 951
951: def raw_cookie
952: env_table["HTTP_COOKIE"]
953: end
Get the raw RFC2965 cookies as a string.
# File lib/cgi.rb, line 956
956: def raw_cookie2
957: env_table["HTTP_COOKIE2"]
958: end
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.
# File lib/cgi.rb, line 1109
1109: def initialize_query()
1110: if ("POST" == env_table['REQUEST_METHOD']) and
1111: %r|\Amultipart/form-data.*boundary=\"?([^\";,]+)\"?|n.match(env_table['CONTENT_TYPE'])
1112: boundary = $1.dup
1113: @multipart = true
1114: @params = read_multipart(boundary, Integer(env_table['CONTENT_LENGTH']))
1115: else
1116: @multipart = false
1117: @params = CGI::parse(
1118: case env_table['REQUEST_METHOD']
1119: when "GET", "HEAD"
1120: if defined?(MOD_RUBY)
1121: Apache::request.args or ""
1122: else
1123: env_table['QUERY_STRING'] or ""
1124: end
1125: when "POST"
1126: stdinput.binmode if defined? stdinput.binmode
1127: stdinput.read(Integer(env_table['CONTENT_LENGTH'])) or ''
1128: else
1129: read_from_cmdline
1130: end
1131: )
1132: end
1133:
1134: @cookies = CGI::Cookie::parse((env_table['HTTP_COOKIE'] or env_table['COOKIE']))
1135: end
offline mode. read name=value pairs on standard input.
# File lib/cgi.rb, line 1081
1081: def read_from_cmdline
1082: require "shellwords"
1083:
1084: string = unless ARGV.empty?
1085: ARGV.join(' ')
1086: else
1087: if STDIN.tty?
1088: STDERR.print(
1089: %|(offline mode: enter name=value pairs on standard input)\n|
1090: )
1091: end
1092: readlines.join(' ').gsub(/\n/n, '')
1093: end.gsub(/\\=/n, '%3D').gsub(/\\&/n, '%26')
1094:
1095: words = Shellwords.shellwords(string)
1096:
1097: if words.find{|x| /=/n.match(x) }
1098: words.join('&')
1099: else
1100: words.join('+')
1101: end
1102: end
# File lib/cgi.rb, line 973
973: def read_multipart(boundary, content_length)
974: params = Hash.new([])
975: boundary = "--" + boundary
976: quoted_boundary = Regexp.quote(boundary, "n")
977: buf = ""
978: bufsize = 10 * 1024
979: boundary_end=""
980:
981: # start multipart/form-data
982: stdinput.binmode if defined? stdinput.binmode
983: boundary_size = boundary.size + EOL.size
984: content_length -= boundary_size
985: status = stdinput.read(boundary_size)
986: if nil == status
987: raise EOFError, "no content body"
988: elsif boundary + EOL != status
989: raise EOFError, "bad content body"
990: end
991:
992: loop do
993: head = nil
994: if 10240 < content_length
995: require "tempfile"
996: body = Tempfile.new("CGI")
997: else
998: begin
999: require "stringio"
1000: body = StringIO.new
1001: rescue LoadError
1002: require "tempfile"
1003: body = Tempfile.new("CGI")
1004: end
1005: end
1006: body.binmode if defined? body.binmode
1007:
1008: until head and /#{quoted_boundary}(?:#{EOL}|--)/n.match(buf)
1009:
1010: if (not head) and /#{EOL}#{EOL}/n.match(buf)
1011: buf = buf.sub(/\A((?:.|\n)*?#{EOL})#{EOL}/n) do
1012: head = $1.dup
1013: ""
1014: end
1015: next
1016: end
1017:
1018: if head and ( (EOL + boundary + EOL).size < buf.size )
1019: body.print buf[0 ... (buf.size - (EOL + boundary + EOL).size)]
1020: buf[0 ... (buf.size - (EOL + boundary + EOL).size)] = ""
1021: end
1022:
1023: c = if bufsize < content_length
1024: stdinput.read(bufsize)
1025: else
1026: stdinput.read(content_length)
1027: end
1028: if c.nil? || c.empty?
1029: raise EOFError, "bad content body"
1030: end
1031: buf.concat(c)
1032: content_length -= c.size
1033: end
1034:
1035: buf = buf.sub(/\A((?:.|\n)*?)(?:[\r\n]{1,2})?#{quoted_boundary}([\r\n]{1,2}|--)/n) do
1036: body.print $1
1037: if "--" == $2
1038: content_length = -1
1039: end
1040: boundary_end = $2.dup
1041: ""
1042: end
1043:
1044: body.rewind
1045:
1046: /Content-Disposition:.* filename=(?:"((?:\\.|[^\"])*)"|([^;\s]*))/ni.match(head)
1047: filename = ($1 or $2 or "")
1048: if /Mac/ni.match(env_table['HTTP_USER_AGENT']) and
1049: /Mozilla/ni.match(env_table['HTTP_USER_AGENT']) and
1050: (not /MSIE/ni.match(env_table['HTTP_USER_AGENT']))
1051: filename = CGI::unescape(filename)
1052: end
1053:
1054: /Content-Type: ([^\s]*)/ni.match(head)
1055: content_type = ($1 or "")
1056:
1057: (class << body; self; end).class_eval do
1058: alias local_path path
1059: define_method(:original_filename) {filename.dup.taint}
1060: define_method(:content_type) {content_type.dup.taint}
1061: end
1062:
1063: /Content-Disposition:.* name="?([^\";\s]*)"?/ni.match(head)
1064: name = $1.dup
1065:
1066: if params.has_key?(name)
1067: params[name].push(body)
1068: else
1069: params[name] = [body]
1070: end
1071: break if buf.size == 0
1072: break if content_length == -1
1073: end
1074: raise EOFError, "bad boundary end of body part" unless boundary_end=~/--/
1075:
1076: params
1077: end