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. Следовательно, порт по умолчанию для них не будет выбран автоматически.

Другие вопросы по тегам