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
Это хакерство, но делает работу.