lib/standard/facets/uri.rb in facets-2.9.3 vs lib/standard/facets/uri.rb in facets-3.0.0

- old
+ new

@@ -1,185 +1,14 @@ require 'uri' -#require 'cgi' -require 'facets/kernel/blank' -module URI +require 'facets/uri/cgi_escape.rb' +require 'facets/uri/cgi_unescape.rb' +require 'facets/uri/cgi_parse.rb' +require 'facets/uri/decode.rb' +require 'facets/uri/parameters.rb' +require 'facets/uri/query.rb' - module_function - - # Decode the uri components. - # - def decode(uri) - ## gmosx: hmm is this needed? - ## guard against invalid filenames for example pictures with - ## spaces uploaded by users - escaped_uri = uri.gsub(/ /, "+") - - if md = URI::REGEXP::REL_URI.match(escaped_uri) - path = "#{md[5]}#{md[6]}" - type = File.extname(path) - query_string = md[7] - - ## real_path = "#{$root_dir}/#{path}" - - parameters = URI.query_to_hash(query_string) - path.gsub!(/\+/, " ") - - return [path, type, parameters, query_string] - end - - ## this is usefull for uncovering bugs! - raise ArgumentError.new("the parameter '#{uri}' is not a valid uri") - end - - # Extend the basic query string parser provided by the cgi module. - # converts single valued params (the most common case) to - # objects instead of arrays - # - # Returns hash of parameters, contains arrays for multivalued parameters - # (multiselect, checkboxes , etc). - # - # If no query string is provided (nil or "") returns an empty hash. - def query_to_hash(query_string) - return {} unless query_string - - query_parameters = cgi_parse(query_string) - - query_parameters.each { |key, val| - ## replace the array with an object - query_parameters[key] = val[0] if 1 == val.length - } - - ## set default value to nil! cgi sets this to [] - query_parameters.default = nil - - return query_parameters - end - - alias_method :query_string_to_hash, :query_to_hash - - # - KEY_VALUE_SEPARATOR = ";" # "&" - - # Given a hash with parameter/value pairs construct a - # standard query string. - # - # URI.hash_to_query(:a => 1, :b => 2) - # #=> "a=1;b=2" - # - def hash_to_query(parameters) - return '' unless parameters - pairs = [] - parameters.each do |param, value| - pairs << "#{param}=#{cgi_escape(value.to_s)}" - end - return pairs.join(KEY_VALUE_SEPARATOR) - end - - alias_method :hash_to_query_string, :hash_to_query - - # CGI escape - # - # TODO: How does this compare to URI.escape? - def cgi_escape(string) - string.gsub(/([^ a-zA-Z0-9_.-]+)/n) do - '%' + $1.unpack('H2' * $1.size).join('%').upcase - end.tr(' ', '+') - end - - # - def cgi_unescape(string) - string.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) do - [$1.delete('%')].pack('H*') - end - end - - # - def cgi_parse(query) - params = Hash.new([].freeze) - - query.split(/[&;]/n).each do |pairs| - key, value = pairs.split('=',2).collect{|v| cgi_unescape(v) } - if params.has_key?(key) - params[key].push(value) - else - params[key] = [value] - end - end - - params - end - - # This method returns the query string of a uri - # - # Input: - # the uri - # - # Output: - # the query string. - # returns nil if no query string - def get_query_string(uri) - return nil unless uri - # gmosx: INVESTIGATE ruby's URI seems to differently handle - # abs and rel uris. - if md = URI::REGEXP::ABS_URI.match(uri) - return md[8] - elsif md = URI::REGEXP::REL_URI.match(uri) - return md[7] - end - return nil - end - - # Removes the query string from a +uri+. - # - # Returns the chomped uri. - def chomp_query_string(uri) - return nil unless uri - query_string = self.get_query_string(uri) - return uri.dup.chomp("?#{query_string}") - end - - # Get a uri and a hash of parameters. Inject the hash values - # as parameters in the query sting path. Returns the full uri. - # - # uri - the uri to filter (String) - # parameter - hash of parameters to update - # - # Returns the full updated query string. - # - # TODO: optimize - def update_query_string(uri, parameters) - query_string = self.get_query_string(uri) - rest = uri.dup.gsub(/\?#{query_string}/, "") - - hash = self.query_string_to_hash(query_string) - hash.update(parameters) - query_string = self.hash_to_query_string(hash) - - unless query_string.blank? - return "#{rest}?#{query_string}" - else - return rest - end - end - - # Gets the request uri, injects extra parameters in the query string - # and returns a new uri. The request object is not modified. - # There is always a qs string so an extra test is skipped. - # - # TODO: find a better name? - def update_request_uri(request, parameters) - hash = request.parameters.dup() - hash.update(parameters) - - ## use this in hash_to_querystring. - query_string = hash.collect { |k, v| - "#{k}=#{v}" - }.join(";") - - ## return "#{request.translated_uri}?#{query_string}" - return "#{request.path}?#{query_string}" - end +module URI module Kernel # def uri(s, w=%r{[^a-zA-Z_0-9./-]}) URI.escape(s, w)