class Protocol::HTTP::Reference

A relative reference, excluding any authority. The path part of an HTTP request.

Attributes

fragment[RW]

A fragment, the part after the '#'

parameters[RW]

User supplied parameters that will be appended to the query part.

path[RW]

The path component, e.g. /foo/bar/index.html

query_string[RW]

The un-parsed query string, e.g. 'x=10&y=20'

Public Class Methods

[](reference) click to toggle source
# File lib/protocol/http/reference.rb, line 77
def self.[] reference
        if reference.is_a? self
                return reference
        else
                return self.parse(reference)
        end
end
new(path = '/', query_string = nil, fragment = nil, parameters = nil) click to toggle source
# File lib/protocol/http/reference.rb, line 39
def initialize(path = '/', query_string = nil, fragment = nil, parameters = nil)
        @path = path
        @query_string = query_string
        @fragment = fragment
        @parameters = parameters
end
parse(path = '/', parameters = nil) click to toggle source

Generate a reference from a path and user parameters. The path may contain a `#fragment` or `?query=parameters`.

# File lib/protocol/http/reference.rb, line 32
def self.parse(path = '/', parameters = nil)
        base, fragment = path.split('#', 2)
        path, query_string = base.split('?', 2)
        
        self.new(path, query_string, fragment, parameters)
end

Public Instance Methods

+(other) click to toggle source

Merges two references as specified by RFC2396, similar to `URI.join`.

# File lib/protocol/http/reference.rb, line 118
def + other
        other = self.class[other]
        
        self.class.new(
                expand_path(self.path, other.path, true),
                other.query_string,
                other.fragment,
                other.parameters,
        )
end
<=>(other) click to toggle source
# File lib/protocol/http/reference.rb, line 73
def <=> other
        to_ary <=> other.to_ary
end
append(buffer) click to toggle source
# File lib/protocol/http/reference.rb, line 97
def append(buffer)
        if query_string?
                buffer << URL.escape_path(@path) << '?' << @query_string
                buffer << '&' << URL.encode(@parameters) if parameters?
        else
                buffer << URL.escape_path(@path)
                buffer << '?' << URL.encode(@parameters) if parameters?
        end
        
        if fragment?
                buffer << '#' << URL.escape(@fragment)
        end
        
        return buffer
end
base() click to toggle source

Just the base path, without any query string, parameters or fragment.

# File lib/protocol/http/reference.rb, line 130
def base
        self.class.new(@path, nil, nil, nil)
end
dup(path = nil, parameters = nil, merge_parameters = true) click to toggle source

The arguments to this function are legacy, prefer to use `with`.

# File lib/protocol/http/reference.rb, line 156
def dup(path = nil, parameters = nil, merge_parameters = true)
        if merge_parameters
                with(path: path, parameters: parameters)
        else
                self.base.with(path: path, parameters: parameters)
        end
end
fragment?() click to toggle source
# File lib/protocol/http/reference.rb, line 93
def fragment?
        @fragment and !@fragment.empty?
end
freeze() click to toggle source
Calls superclass method
# File lib/protocol/http/reference.rb, line 58
def freeze
        return self if frozen?
        
        @path.freeze
        @query_string.freeze
        @fragment.freeze
        @parameters.freeze
        
        super
end
parameters?() click to toggle source
# File lib/protocol/http/reference.rb, line 85
def parameters?
        @parameters and !@parameters.empty?
end
query_string?() click to toggle source
# File lib/protocol/http/reference.rb, line 89
def query_string?
        @query_string and !@query_string.empty?
end
to_ary() click to toggle source
# File lib/protocol/http/reference.rb, line 69
def to_ary
        [@path, @query_string, @fragment, @parameters]
end
to_s() click to toggle source
# File lib/protocol/http/reference.rb, line 113
def to_s
        append(String.new)
end
with(path: nil, parameters: nil, fragment: @fragment) click to toggle source

@option path [String] Append the string to this reference similar to `File.join`. @option parameters [Hash] Append the parameters to this reference. @option fragment [String] Set the fragment to this value.

# File lib/protocol/http/reference.rb, line 137
def with(path: nil, parameters: nil, fragment: @fragment)
        if @parameters
                if parameters
                        parameters = @parameters.merge(parameters)
                else
                        parameters = @parameters
                end
        end
        
        if path
                path = expand_path(@path, path, false)
        else
                path = @path
        end
        
        self.class.new(path, @query_string, fragment, parameters)
end

Private Instance Methods

expand_path(base, relative, pop = true) click to toggle source

@param pop [Boolean] whether to remove the last path component of the base path, to conform to URI merging behaviour, as defined by RFC2396.

# File lib/protocol/http/reference.rb, line 175
def expand_path(base, relative, pop = true)
        if relative.start_with? '/'
                return relative
        else
                path = split(base)
                
                # RFC2396 Section 5.2:
                # 6) a) All but the last segment of the base URI's path component is
                # copied to the buffer.  In other words, any characters after the
                # last (right-most) slash character, if any, are excluded.
                path.pop if pop or path.last == ''
                
                parts = split(relative)
                
                parts.each do |part|
                        if part == '..'
                                path.pop
                        elsif part == '.'
                                # Do nothing.
                        else
                                path << part
                        end
                end
                
                return path.join('/')
        end
end
split(path) click to toggle source
# File lib/protocol/http/reference.rb, line 166
def split(path)
        if path.empty?
                [path]
        else
                path.split('/', -1)
        end
end