URI.parse returns sftp 和 ftps 的端口为零

URI.parse returns nil port for sftp and ftps

当我尝试解析以下 URL 时,URI.parse returns 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

因为 sftp 和 ftps 没有指定,所以它们使用的端口也没有。

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

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

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

无法识别的 URI 类型为 -> URI::Generic

通过查看他们的文档,您会发现他们的默认端口为 nil。:

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

您可以通过 运行 自己尝试:

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

Ruby -

默认不支持它们
p URI.scheme_list

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

sftpftps 不代表任何 Ruby class。因此,不会自动选择它们的默认端口。