Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Introduce URI::File to handle file URI scheme
* the default value of URI::File's authority is "" (localhost). Both nil and "localhost" is normalized to "" by default. * URI::File ignores setting userinfo and port [Feature #14035] fix ruby/ruby#1719 fic ruby/ruby#1832 git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62767 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
- Loading branch information
Showing
3 changed files
with
165 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'uri/generic' | ||
|
||
module URI | ||
|
||
# | ||
# The "file" URI is defined by RFC8089 | ||
# | ||
class File < Generic | ||
# A Default port of nil for URI::File | ||
DEFAULT_PORT = nil | ||
|
||
# | ||
# An Array of the available components for URI::File | ||
# | ||
COMPONENT = [ | ||
:scheme, | ||
:host, | ||
:path | ||
].freeze | ||
|
||
# | ||
# == Description | ||
# | ||
# Creates a new URI::File object from components, with syntax checking. | ||
# | ||
# The components accepted are +host+ and +path+. | ||
# | ||
# The components should be provided either as an Array, or as a Hash | ||
# with keys formed by preceding the component names with a colon. | ||
# | ||
# If an Array is used, the components must be passed in the order | ||
# [host, path] | ||
# | ||
# If the path supplied is absolute, it will be escaped in order to | ||
# make it absolute in the URI. Examples: | ||
# | ||
# require 'uri' | ||
# | ||
# uri = URI::File.build(['host.example.com', '/path/file.zip']) | ||
# puts uri.to_s -> file://host.example.com/path/file.zip | ||
# | ||
# uri2 = URI::File.build({:host => 'host.example.com', | ||
# :path => 'ruby/src'}) | ||
# puts uri2.to_s -> file://host.example.com/ruby/src | ||
# | ||
def self.build(args) | ||
tmp = Util::make_components_hash(self, args) | ||
super(tmp) | ||
end | ||
|
||
# protected setter for the host component +v+ | ||
# | ||
# see also URI::Generic.host= | ||
# | ||
def set_host(v) | ||
v = "" if v.nil? || v == "localhost" | ||
@host = v | ||
end | ||
|
||
# do nothing | ||
def set_port(v) | ||
end | ||
|
||
# raise InvalidURIError | ||
def check_userinfo(user) | ||
raise URI::InvalidURIError, "can not set userinfo for file URI" | ||
end | ||
|
||
# raise InvalidURIError | ||
def check_user(user) | ||
raise URI::InvalidURIError, "can not set user for file URI" | ||
end | ||
|
||
# raise InvalidURIError | ||
def check_password(user) | ||
raise URI::InvalidURIError, "can not set password for file URI" | ||
end | ||
|
||
# do nothing | ||
def set_userinfo(v) | ||
end | ||
|
||
# do nothing | ||
def set_user(v) | ||
end | ||
|
||
# do nothing | ||
def set_password(v) | ||
end | ||
end | ||
|
||
@@schemes['FILE'] = File | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
# frozen_string_literal: false | ||
require 'test/unit' | ||
require 'uri/file' | ||
|
||
class URI::TestFile < Test::Unit::TestCase | ||
def test_parse | ||
u = URI("file://example.com/file") | ||
assert_equal "/file", u.path | ||
|
||
u = URI("file://localhost/file") | ||
assert_equal "/file", u.path | ||
assert_equal "file:///file", u.to_s | ||
|
||
u = URI("file://localhost:30/file") | ||
assert_equal "", u.host | ||
assert_equal nil, u.port | ||
assert_equal "/file", u.path | ||
assert_equal "file:///file", u.to_s | ||
|
||
u = URI("file:///file") | ||
assert_equal "/file", u.path | ||
assert_equal "file:///file", u.to_s | ||
|
||
u = URI("file:/file") | ||
assert_equal "/file", u.path | ||
assert_equal "file:///file", u.to_s | ||
|
||
u = URI("file://foo:pass@example.com/file") | ||
assert_equal "/file", u.path | ||
assert_equal nil, u.user | ||
assert_equal nil, u.password | ||
|
||
u = URI("file:///c:/path/to/file") | ||
assert_equal "/c:/path/to/file", u.path | ||
|
||
# this form is not supported | ||
u = URI("file:c:/path/to/file") | ||
assert_equal "c:/path/to/file", u.opaque | ||
|
||
end | ||
|
||
def test_build | ||
u = URI::File.build(scheme: "file", host: "example.com", path:"/file") | ||
assert_equal "/file", u.path | ||
assert_equal "file://example.com/file", u.to_s | ||
assert_raise(URI::InvalidURIError){ u.user = "foo" } | ||
assert_raise(URI::InvalidURIError){ u.password = "foo" } | ||
assert_raise(URI::InvalidURIError){ u.userinfo = "foo" } | ||
assert_raise(URI::InvalidURIError){ URI::File.build(scheme: "file", userinfo: "foo", host: "example.com", path:"/file") } | ||
|
||
u = URI::File.build(scheme: "file", path:"/file") | ||
assert_equal "", u.host | ||
assert_equal "/file", u.path | ||
assert_equal "file:///file", u.to_s | ||
|
||
u = URI::File.build(scheme: "file", host: "localhost", path:"/file") | ||
assert_equal "", u.host | ||
assert_equal "/file", u.path | ||
assert_equal "file:///file", u.to_s | ||
|
||
u = URI::File.build(scheme: "file", path:"/file", port: 30) | ||
assert_equal "", u.host | ||
assert_equal nil, u.port | ||
assert_equal "/file", u.path | ||
assert_equal "file:///file", u.to_s | ||
end | ||
end |