URI.parse возвращает nil-порт для sftp и ftps
Когда я пытаюсь разобрать следующие URL, 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
Может кто-нибудь объяснить, почему это работает для ftp
, http
а также https
но не для sftp
а также ftps
?
2 ответа
Поскольку 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}
sftp
а также ftps
не представлены ни одним классом Ruby. Следовательно, порт по умолчанию для них не будет выбран автоматически.