Module | WEBrick::HTTPUtils |
In: |
lib/webrick/httputils.rb
|
DefaultMimeTypes | = | { "ai" => "application/postscript", "asc" => "text/plain", "avi" => "video/x-msvideo", "bin" => "application/octet-stream", "bmp" => "image/bmp", "class" => "application/octet-stream", "cer" => "application/pkix-cert", "crl" => "application/pkix-crl", "crt" => "application/x-x509-ca-cert", #"crl" => "application/x-pkcs7-crl", "css" => "text/css", "dms" => "application/octet-stream", "doc" => "application/msword", "dvi" => "application/x-dvi", "eps" => "application/postscript", "etx" => "text/x-setext", "exe" => "application/octet-stream", "gif" => "image/gif", "htm" => "text/html", "html" => "text/html", "jpe" => "image/jpeg", "jpeg" => "image/jpeg", "jpg" => "image/jpeg", "lha" => "application/octet-stream", "lzh" => "application/octet-stream", "mov" => "video/quicktime", "mpe" => "video/mpeg", "mpeg" => "video/mpeg", "mpg" => "video/mpeg", "pbm" => "image/x-portable-bitmap", "pdf" => "application/pdf", "pgm" => "image/x-portable-graymap", "png" => "image/png", "pnm" => "image/x-portable-anymap", "ppm" => "image/x-portable-pixmap", "ppt" => "application/vnd.ms-powerpoint", "ps" => "application/postscript", "qt" => "video/quicktime", "ras" => "image/x-cmu-raster", "rb" => "text/plain", "rd" => "text/plain", "rtf" => "application/rtf", "sgm" => "text/sgml", "sgml" => "text/sgml", "tif" => "image/tiff", "tiff" => "image/tiff", "txt" => "text/plain", "xbm" => "image/x-xbitmap", "xls" => "application/vnd.ms-excel", "xml" => "text/xml", "xpm" => "image/x-xpixmap", "xwd" => "image/x-xwindowdump", "zip" => "application/zip", } | ||
UNESCAPED | = | _make_regex(control+space+delims+unwise+nonascii) | ||
UNESCAPED_FORM | = | _make_regex(reserved+control+delims+unwise+nonascii) | ||
NONASCII | = | _make_regex(nonascii) | ||
ESCAPED | = | /%([0-9a-fA-F]{2})/ | ||
UNESCAPED_PCHAR | = | _make_regex!(unreserved+":@&=+$,") |
# File lib/webrick/httputils.rb, line 352 352: def _escape(str, regex) str.gsub(regex){ "%%%02X" % $1[0] } end
# File lib/webrick/httputils.rb, line 350 350: def _make_regex(str) /([#{Regexp.escape(str)}])/n end 351: def _make_regex!(str) /([^#{Regexp.escape(str)}])/n end 352: def _escape(str, regex) str.gsub(regex){ "%%%02X" % $1[0] } end 353: def _unescape(str, regex) str.gsub(regex){ $1.hex.chr } end 354: 355: UNESCAPED = _make_regex(control+space+delims+unwise+nonascii) 356: UNESCAPED_FORM = _make_regex(reserved+control+delims+unwise+nonascii) 357: NONASCII = _make_regex(nonascii) 358: ESCAPED = /%([0-9a-fA-F]{2})/ 359: UNESCAPED_PCHAR = _make_regex!(unreserved+":@&=+$,") 360: 361: def escape(str) 362: _escape(str, UNESCAPED) 363: end 364: 365: def unescape(str) 366: _unescape(str, ESCAPED) 367: end 368: 369: def escape_form(str) 370: ret = _escape(str, UNESCAPED_FORM) 371: ret.gsub!(/ /, "+") 372: ret 373: end 374: 375: def unescape_form(str) 376: _unescape(str.gsub(/\+/, " "), ESCAPED) 377: end 378: 379: def escape_path(str) 380: result = "" 381: str.scan(%r{/([^/]*)}).each{|i| 382: result << "/" << _escape(i[0], UNESCAPED_PCHAR) 383: } 384: return result 385: end 386: 387: def escape8bit(str) 388: _escape(str, NONASCII) 389: end 390: end 391: end
# File lib/webrick/httputils.rb, line 351 351: def _make_regex!(str) /([^#{Regexp.escape(str)}])/n end 352: def _escape(str, regex) str.gsub(regex){ "%%%02X" % $1[0] } end 353: def _unescape(str, regex) str.gsub(regex){ $1.hex.chr } end 354: 355: UNESCAPED = _make_regex(control+space+delims+unwise+nonascii) 356: UNESCAPED_FORM = _make_regex(reserved+control+delims+unwise+nonascii) 357: NONASCII = _make_regex(nonascii) 358: ESCAPED = /%([0-9a-fA-F]{2})/ 359: UNESCAPED_PCHAR = _make_regex!(unreserved+":@&=+$,") 360: 361: def escape(str) 362: _escape(str, UNESCAPED) 363: end 364: 365: def unescape(str) 366: _unescape(str, ESCAPED) 367: end 368: 369: def escape_form(str) 370: ret = _escape(str, UNESCAPED_FORM) 371: ret.gsub!(/ /, "+") 372: ret 373: end 374: 375: def unescape_form(str) 376: _unescape(str.gsub(/\+/, " "), ESCAPED) 377: end 378: 379: def escape_path(str) 380: result = "" 381: str.scan(%r{/([^/]*)}).each{|i| 382: result << "/" << _escape(i[0], UNESCAPED_PCHAR) 383: } 384: return result 385: end 386: 387: def escape8bit(str) 388: _escape(str, NONASCII) 389: end 390: end
# File lib/webrick/httputils.rb, line 353 353: def _unescape(str, regex) str.gsub(regex){ $1.hex.chr } end
# File lib/webrick/httputils.rb, line 189 189: def dequote(str) 190: ret = (/\A"(.*)"\Z/ =~ str) ? $1 : str.dup 191: ret.gsub!(/\\(.)/, "\\1") 192: ret 193: end
# File lib/webrick/httputils.rb, line 361 361: def escape(str) 362: _escape(str, UNESCAPED) 363: end
# File lib/webrick/httputils.rb, line 387 387: def escape8bit(str) 388: _escape(str, NONASCII) 389: end
# File lib/webrick/httputils.rb, line 369 369: def escape_form(str) 370: ret = _escape(str, UNESCAPED_FORM) 371: ret.gsub!(/ /, "+") 372: ret 373: end
# File lib/webrick/httputils.rb, line 379 379: def escape_path(str) 380: result = "" 381: str.scan(%r{/([^/]*)}).each{|i| 382: result << "/" << _escape(i[0], UNESCAPED_PCHAR) 383: } 384: return result 385: end
Load Apache compatible mime.types file.
# File lib/webrick/httputils.rb, line 93 93: def load_mime_types(file) 94: open(file){ |io| 95: hash = Hash.new 96: io.each{ |line| 97: next if /^#/ =~ line 98: line.chomp! 99: mimetype, ext0 = line.split(/\s+/, 2) 100: next unless ext0 101: next if ext0.empty? 102: ext0.split(/\s+/).each{ |ext| hash[ext] = mimetype } 103: } 104: hash 105: } 106: end
# File lib/webrick/httputils.rb, line 109 109: def mime_type(filename, mime_tab) 110: suffix1 = (/\.(\w+)$/ =~ filename && $1.downcase) 111: suffix2 = (/\.(\w+)\.[\w\-]+$/ =~ filename && $1.downcase) 112: mime_tab[suffix1] || mime_tab[suffix2] || "application/octet-stream" 113: end
# File lib/webrick/httputils.rb, line 21 21: def normalize_path(path) 22: raise "abnormal path `#{path}'" if path[0] != ?/ 23: ret = path.dup 24: 25: ret.gsub!(%r{/+}o, '/') # // => / 26: while ret.sub!(%r'/\.(?:/|\Z)', '/'); end # /. => / 27: while ret.sub!(%r'/(?!\.\./)[^/]+/\.\.(?:/|\Z)', '/'); end # /foo/.. => /foo 28: 29: raise "abnormal path `#{path}'" if %r{/\.\.(/|\Z)} =~ ret 30: ret 31: end
# File lib/webrick/httputils.rb, line 306 306: def parse_form_data(io, boundary) 307: boundary_regexp = /\A--#{boundary}(--)?#{CRLF}\z/ 308: form_data = Hash.new 309: return form_data unless io 310: data = nil 311: io.each{|line| 312: if boundary_regexp =~ line 313: if data 314: data.chop! 315: key = data.name 316: if form_data.has_key?(key) 317: form_data[key].append_data(data) 318: else 319: form_data[key] = data 320: end 321: end 322: data = FormData.new 323: next 324: else 325: if data 326: data << line 327: end 328: end 329: } 330: return form_data 331: end
# File lib/webrick/httputils.rb, line 118 118: def parse_header(raw) 119: header = Hash.new([].freeze) 120: field = nil 121: raw.each{|line| 122: case line 123: when /^([A-Za-z0-9!\#$%&'*+\-.^_`|~]+):\s*(.*?)\s*\z/om 124: field, value = $1, $2 125: field.downcase! 126: header[field] = [] unless header.has_key?(field) 127: header[field] << value 128: when /^\s+(.*?)\s*\z/om 129: value = $1 130: unless field 131: raise "bad header '#{line.inspect}'." 132: end 133: header[field][-1] << " " << value 134: else 135: raise "bad header '#{line.inspect}'." 136: end 137: } 138: header.each{|key, values| 139: values.each{|value| 140: value.strip! 141: value.gsub!(/\s+/, " ") 142: } 143: } 144: header 145: end
# File lib/webrick/httputils.rb, line 285 285: def parse_query(str) 286: query = Hash.new 287: if str 288: str.split(/[&;]/).each{|x| 289: next if x.empty? 290: key, val = x.split(/=/,2) 291: key = unescape_form(key) 292: val = unescape_form(val.to_s) 293: val = FormData.new(val) 294: val.name = key 295: if query.has_key?(key) 296: query[key].append_data(val) 297: next 298: end 299: query[key] = val 300: } 301: end 302: query 303: end
# File lib/webrick/httputils.rb, line 169 169: def parse_qvalues(value) 170: tmp = [] 171: if value 172: parts = value.split(/,\s*/) 173: parts.each {|part| 174: if m = %r{^([^\s,]+?)(?:;\s*q=(\d+(?:\.\d+)?))?$}.match(part) 175: val = m[1] 176: q = (m[2] or 1).to_f 177: tmp.push([val, q]) 178: end 179: } 180: tmp = tmp.sort_by{|val, q| -q} 181: tmp.collect!{|val, q| val} 182: end 183: return tmp 184: end
# File lib/webrick/httputils.rb, line 154 154: def parse_range_header(ranges_specifier) 155: if /^bytes=(.*)/ =~ ranges_specifier 156: byte_range_set = split_header_value($1) 157: byte_range_set.collect{|range_spec| 158: case range_spec 159: when /^(\d+)-(\d+)/ then $1.to_i .. $2.to_i 160: when /^(\d+)-/ then $1.to_i .. -1 161: when /^-(\d+)/ then -($1.to_i) .. -1 162: else return nil 163: end 164: } 165: end 166: end
# File lib/webrick/httputils.rb, line 196 196: def quote(str) 197: '"' << str.gsub(/[\\\"]/o, "\\\1") << '"' 198: end
# File lib/webrick/httputils.rb, line 148 148: def split_header_value(str) 149: str.scan(%r'\G((?:"(?:\\.|[^"])+?"|[^",]+)+) 150: (?:,\s*|\Z)'xn).flatten 151: end
# File lib/webrick/httputils.rb, line 365 365: def unescape(str) 366: _unescape(str, ESCAPED) 367: end