URI.parse返回sftp和ftps

时间:2016-01-21 09:33:24

标签: ruby url-parsing

当我尝试解析以下网址时,URI.parse会为端口返回nil

require 'uri'

url = "ftp://example.com"
puts URI.parse(url).port
# => 21

url = "sftp://example.com"
puts URI.parse(url).port
# => nil

url = "ftps://example.com"
puts URI.parse(url).port
# => nil

有人可以解释为什么这适用于ftphttphttps,但不适用于sftpftps

2 个答案:

答案 0 :(得分:2)

因为sftp和ftps没有分离,所以它们使用的端口都没有。

您可以在URI文档中查看。查看命名空间:

http://ruby-doc.org/stdlib-2.1.0/libdoc/uri/rdoc/URI.html

您会找到 ftp,http,https ,但没有sftp或ftps

无法识别的URI就像这些类型一样 - >的 URI ::通用

通过查看他们的文档,您将看到他们的默认端口为nil。:

http://ruby-doc.org/stdlib-2.1.0/libdoc/uri/rdoc/URI/Generic.html

您可以通过以下方式自行尝试:

puts URI.parse("sftp://example.com").class

答案 1 :(得分:1)

Ruby中默认不支持它们 -

p URI.scheme_list

#=> {"FTP"=>URI::FTP,
     "HTTP"=>URI::HTTP,
     "HTTPS"=>URI::HTTPS,
     "LDAP"=>URI::LDAP,
     "LDAPS"=>URI::LDAPS,
     "MAILTO"=>URI::MailTo}

任何Ruby类都没有表示sftpftps。因此,不会自动选择它们的默认端口。