Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions lib/uri/http.rb
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,45 @@ def request_uri
url = @query ? "#@path?#@query" : @path.dup
url.start_with?(?/.freeze) ? url : ?/ + url
end

#
# == Description
#
# Returns the authority for an HTTP uri, as defined in
# https://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.
#
#
# Example:
#
# URI::HTTP.build(host: 'www.example.com', path: '/foo/bar').authority #=> "www.example.com"
# URI::HTTP.build(host: 'www.example.com', port: 8000, path: '/foo/bar').authority #=> "www.example.com:8000"
# URI::HTTP.build(host: 'www.example.com', port: 80, path: '/foo/bar').authority #=> "www.example.com"
#
def authority
if port == default_port
host
else
"#{host}:#{port}"
end
end

#
# == Description
#
# Returns the origin for an HTTP uri, as defined in
# https://datatracker.ietf.org/doc/html/rfc6454.
#
#
# Example:
#
# URI::HTTP.build(host: 'www.example.com', path: '/foo/bar').origin #=> "http://www.example.com"
# URI::HTTP.build(host: 'www.example.com', port: 8000, path: '/foo/bar').origin #=> "http://www.example.com:8000"
# URI::HTTP.build(host: 'www.example.com', port: 80, path: '/foo/bar').origin #=> "http://www.example.com"
# URI::HTTPS.build(host: 'www.example.com', path: '/foo/bar').origin #=> "https://www.example.com"
#
def origin
"#{scheme}://#{authority}"
end
end

register_scheme 'HTTP', HTTP
Expand Down
30 changes: 23 additions & 7 deletions test/uri/test_http.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,16 @@ def test_build
def test_parse
u = URI.parse('http://a')
assert_kind_of(URI::HTTP, u)
assert_equal(['http',
nil, 'a', URI::HTTP.default_port,
'', nil, nil], uri_to_ary(u))
assert_equal([
'http',
nil, 'a', URI::HTTP.default_port,
'', nil, nil
], uri_to_ary(u))
end

def test_normalize
host = 'aBcD'
u1 = URI.parse('http://' + host + '/eFg?HiJ')
u1 = URI.parse('http://' + host + '/eFg?HiJ')
u2 = URI.parse('http://' + host.downcase + '/eFg?HiJ')
assert(u1.normalize.host == 'abcd')
assert(u1.normalize.path == u1.path)
Expand All @@ -49,11 +51,11 @@ def test_equal
end

def test_request_uri
assert_equal('/', URI.parse('http://a.b.c/').request_uri)
assert_equal('/', URI.parse('http://a.b.c/').request_uri)
assert_equal('/?abc=def', URI.parse('http://a.b.c/?abc=def').request_uri)
assert_equal('/', URI.parse('http://a.b.c').request_uri)
assert_equal('/', URI.parse('http://a.b.c').request_uri)
assert_equal('/?abc=def', URI.parse('http://a.b.c?abc=def').request_uri)
assert_equal(nil, URI.parse('http:foo').request_uri)
assert_equal(nil, URI.parse('http:foo').request_uri)
end

def test_select
Expand All @@ -64,6 +66,20 @@ def test_select
u.select(:scheme, :host, :not_exist, :port)
end
end

def test_authority
assert_equal('a.b.c', URI.parse('http://a.b.c/').authority)
assert_equal('a.b.c:8081', URI.parse('http://a.b.c:8081/').authority)
assert_equal('a.b.c', URI.parse('http://a.b.c:80/').authority)
end


def test_origin
assert_equal('http://a.b.c', URI.parse('http://a.b.c/').origin)
assert_equal('http://a.b.c:8081', URI.parse('http://a.b.c:8081/').origin)
assert_equal('http://a.b.c', URI.parse('http://a.b.c:80/').origin)
assert_equal('https://a.b.c', URI.parse('https://a.b.c/').origin)
end
end


Expand Down