当用户名有空格时,Ruby OpenURI FTP无效

时间:2013-06-27 19:58:29

标签: ruby ftp open-uri

我正在使用Ruby 1.9.3并运行以下命令:

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

返回:

  

URI :: InvalidURIError:错误的URI(不是URI?)

编码用户名(用%20替换空格)也不起作用:

  

Net :: FTPPermError:530无效的用户ID /密码

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 个答案:

答案 0 :(得分:2)

根据the specification中的定义,URL用户名仅允许使用以下字符:

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

浏览器因忽略规范而臭名昭着,所以说它们支持它并不是一个好的证据。他们不应该符合规范。

如果cURL支持它们,那么请使用Curb gem并查看是否允许您使用它们。

答案 1 :(得分:1)

根据this StackOverflow answer,您应该能够转义用户名和密码中的特殊字符。你可以这样做:

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

答案 2 :(得分:1)

open-uri在这件事上似乎已经破裂了。我的密码与#字符包含类似的问题。

我最终通过直接设置URI的set_password实例变量来绕过#,这不允许@password字符密码。

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

这很糟糕,但能胜任。