Ruby OpenURI FTP не работает, когда в имени пользователя есть пробелы

Я использую Ruby 1.9.3 и запускаю следующую команду:

open("ftp://user name:password@datafeeds.domain.com/1234/1234.txt.gz")

который возвращает:

URI:: InvalidURIError: плохой URI(не является ли URI?)

Кодировка имени пользователя (замена пробелов на%20) также не работает:

Net::FTPPermError: 530 Неверный идентификатор пользователя / пароль

URI отлично работает во всех протестированных браузерах и FTP-клиентах - только не при использовании OpenURI. Кроме того, использование Net::FTP (которое упаковано в OpenURI) также работает нормально:

require 'net/ftp'
ftp = Net::FTP.new
ftp.connect("datafeeds.domain.com", 21)
ftp.login("user name", "password")
ftp.getbinaryfile("/1234/1234.txt.gz")

Есть идеи, почему метод OpenURI не работает, а метод Net::FTP работает? Благодарю.

3 ответа

По определению в спецификации имена пользователей URL допускают только следующие символы:

user                   alphanum2 [ user ]
[...]
alphanum2              alpha | digit | - | _ | . | +  

Браузеры печально известны тем, что игнорируют спецификации, и говорят, что они поддерживают, что не является хорошим доказательством. Они не должны соответствовать спецификации.

Если cURL их поддерживает, то используйте драгоценный камень Curb и посмотрите, позволит ли это вам их использовать.

Согласно этому ответу Stackr u, вы должны иметь возможность просто экранировать специальные символы в вашем имени пользователя и пароле. Вы могли бы сделать что-то вроде:

login = URI.escape('user name') + ':' + URI.escape('password')
open("ftp://#{login}@datafeeds.domain.com/1234/1234.txt.gz")

open-uri кажется сломанным в этом вопросе. У меня была похожая проблема с паролем, который содержал # персонаж.

Я обошел стороной set_password, что не позволяет # char в пароле, установив URI @password переменная экземпляра напрямую.

uri = URI.parse(...)
if uri.password
  uri.instance_variable_set "@password", "password_with_#_char"
end
open(uri) # now this works fine

Это хакерство, но делает работу.

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