How do I safely join relative url segments?

前端 未结 11 1957
南方客
南方客 2020-12-30 19:27

I\'m trying to find a robust method of joining partial url path segments together. Is there a quick way to do this?

I tried the following:

puts URI::         


        
11条回答
  •  清歌不尽
    2020-12-30 20:29

    I improved @Maximo Mussini's script to make it works gracefully:

    SmartURI.join('http://example.com/subpath', 'hello', query: { token: secret })
    => "http://example.com/subpath/hello?token=secret"
    

    https://gist.github.com/zernel/0f10c71f5a9e044653c1a65c6c5ad697

    require 'uri'
    
    module SmartURI
      SEPARATOR = '/'
    
      def self.join(*paths, query: nil)
        paths = paths.compact.reject(&:empty?)
        last = paths.length - 1
        url = paths.each_with_index.map { |path, index|
          _expand(path, index, last)
        }.join
        if query.nil?
          return url
        elsif query.is_a? Hash
          return url + "?#{URI.encode_www_form(query.to_a)}"
        else
          raise "Unexpected input type for query: #{query}, it should be a hash."
        end
      end
    
      def self._expand(path, current, last)
        if path.starts_with?(SEPARATOR) && current != 0
          path = path[1..-1]
        end
    
        unless path.ends_with?(SEPARATOR) || current == last
          path = [path, SEPARATOR]
        end
    
        path
      end
    end
    

提交回复
热议问题