class Bundler::URI::FTP
FTP
Bundler::URI
语法由 RFC1738 第 3.2 节定义。
此类将由于实现上的差异(其路径的结构)而重新设计。draft-hoffman-ftp-uri-04 是一个草案,但它很好地总结了事实上的规范。datatracker.ietf.org/doc/html/draft-hoffman-ftp-uri-04
常量
- COMPONENT
Bundler::URI::FTP
的可用组件的数组。- DEFAULT_PORT
Bundler::URI::FTP
的默认端口 21。- TYPECODE
Typecode 是 “a”、“i” 或 “d”。
- TYPECODE_PREFIX
Typecode 前缀 “;type=”。
属性
typecode 访问器。
公共类方法
描述¶ ↑
从组件创建一个新的 Bundler::URI::FTP
对象,并进行语法检查。
接受的组件是 userinfo
、host
、port
、path
和 typecode
。
组件应作为数组提供,或者作为键由组件名称前加冒号组成的哈希提供。
如果使用数组,则组件必须按照 [userinfo, host, port, path, typecode]
的顺序传递。
如果提供的路径是绝对路径,则将对其进行转义,使其在 Bundler::URI
中为绝对路径。
示例
require 'bundler/vendor/uri/lib/uri' uri1 = Bundler::URI::FTP.build(['user:password', 'ftp.example.com', nil, '/path/file.zip', 'i']) uri1.to_s # => "ftp://user:[email protected]/%2Fpath/file.zip;type=i" uri2 = Bundler::URI::FTP.build({:host => 'ftp.example.com', :path => 'ruby/src'}) uri2.to_s # => "ftp://ftp.example.com/ruby/src"
# File bundler/vendor/uri/lib/uri/ftp.rb, line 96 def self.build(args) # Fix the incoming path to be generic URL syntax # FTP path -> URL path # foo/bar /foo/bar # /foo/bar /%2Ffoo/bar # if args.kind_of?(Array) args[3] = '/' + args[3].sub(/^\//, '%2F') else args[:path] = '/' + args[:path].sub(/^\//, '%2F') end tmp = Util::make_components_hash(self, args) if tmp[:typecode] if tmp[:typecode].size == 1 tmp[:typecode] = TYPECODE_PREFIX + tmp[:typecode] end tmp[:path] << tmp[:typecode] end return super(tmp) end
描述¶ ↑
从通用 URL 组件创建一个新的 Bundler::URI::FTP
对象,不进行语法检查。
与 build() 不同,此方法不按照 RFC1738 的要求转义路径组件;而是按照 RFC2396 进行处理。
参数按顺序为 scheme
、userinfo
、host
、port
、registry
、path
、opaque
、query
和 fragment
。
# File bundler/vendor/uri/lib/uri/ftp.rb, line 133 def initialize(scheme, userinfo, host, port, registry, path, opaque, query, fragment, parser = nil, arg_check = false) raise InvalidURIError unless path path = path.sub(/^\//,'') path.sub!(/^%2F/,'/') super(scheme, userinfo, host, port, registry, path, opaque, query, fragment, parser, arg_check) @typecode = nil if tmp = @path.index(TYPECODE_PREFIX) typecode = @path[tmp + TYPECODE_PREFIX.size..-1] @path = @path[0..tmp - 1] if arg_check self.typecode = typecode else self.set_typecode(typecode) end end end
公共实例方法
从 FTP
Bundler::URI
返回路径。
RFC 1738 特别声明 FTP
Bundler::URI
的路径不包括分隔 Bundler::URI
路径和 Bundler::URI
主机的 /。例如
ftp://ftp.example.com/pub/ruby
上面的 Bundler::URI
指示客户端应连接到 ftp.example.com,然后从初始登录目录 cd 到 pub/ruby。
如果要 cd 到绝对目录,则必须在路径中包含转义的 / (%2F)。例如
ftp://ftp.example.com/%2Fpub/ruby
此方法将返回 “/pub/ruby”。
# File bundler/vendor/uri/lib/uri/ftp.rb, line 240 def path return @path.sub(/^\//,'').sub(/^%2F/,'/') end
返回 Bundler::URI::FTP
的字符串表示形式。
# File bundler/vendor/uri/lib/uri/ftp.rb, line 251 def to_s save_path = nil if @typecode save_path = @path @path = @path + TYPECODE_PREFIX + @typecode end str = super if @typecode @path = save_path end return str end
参数¶ ↑
v
-
字符串
描述¶ ↑
typecode v
的公共设置器(带有验证)。
另请参阅 Bundler::URI::FTP.check_typecode
。
用法¶ ↑
require 'bundler/vendor/uri/lib/uri' uri = Bundler::URI.parse("ftp://[email protected]/my_file.img") #=> #<Bundler::URI::FTP ftp://[email protected]/my_file.img> uri.typecode = "i" uri #=> #<Bundler::URI::FTP ftp://[email protected]/my_file.img;type=i>
# File bundler/vendor/uri/lib/uri/ftp.rb, line 208 def typecode=(typecode) check_typecode(typecode) set_typecode(typecode) typecode end
受保护的实例方法
Bundler::URI::FTP
路径的私有设置器。
# File bundler/vendor/uri/lib/uri/ftp.rb, line 245 def set_path(v) super("/" + v.sub(/^\//, "%2F")) end
typecode v
的私有设置器。
另请参阅 Bundler::URI::FTP.typecode=
。
# File bundler/vendor/uri/lib/uri/ftp.rb, line 180 def set_typecode(v) @typecode = v end
私有实例方法
验证 typecode v
,返回 true
或 false
。
# File bundler/vendor/uri/lib/uri/ftp.rb, line 166 def check_typecode(v) if TYPECODE.include?(v) return true else raise InvalidComponentError, "bad typecode(expected #{TYPECODE.join(', ')}): #{v}" end end