2013-06-27 62 views
5

我使用Ruby 1.9.3和正在運行以下命令:紅寶石OpenURI FTP不工作時,用戶名中有空格

open("ftp://user name:[email protected]/1234/1234.txt.gz") 

返回:

URI::InvalidURIError: bad URI(is not URI?)

編碼的用戶名(替換空間與%20)不起作用:

Net::FTPPermError: 530 Invalid userid/password

URI在所有瀏覽器和FTP客戶端測試 - - 只是不工作當使用OpenURI時。此外,使用網:: 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方法不起作用,而網:: FTP方法呢?謝謝。

回答

2

通過the specification定義URL的用戶名只允許這些字符:

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

瀏覽器是臭名昭著的無視規範,以便說他們支持這不是一個很好的證明。他們不應該每規格。

如果cURL支持它們,請使用Curb寶石,看看它是否會讓你使用它們。

+0

謝謝。不確定你是否看到過,但是我大約5分鐘前編輯了這篇文章,以包括Net :: FTP正常工作的事實。我們現在正在使用它,但最好只使用OpenURI(因爲Het :: HTTP也將在應用程序中使用)。 – modulaaron

+0

上面的錯字:Het :: HTTP = >> Net :: HTTP – modulaaron

1

根據this StackOverflow answer,您應該能夠避開用戶名和密碼中的特殊字符。你可以做這樣的事情:

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

這就是我的想法,但在這種情況下,將空格轉換爲「%20」會導致FTP身份驗證錯誤。 – modulaaron

+0

如果您嘗試'CGI.escape'風格轉義,例如'open(「ftp:// user + name:[email protected]/1234/1234.txt.gz」)'',會發生什麼? –

+0

使用「用戶名+」代替「用戶名」時出現同樣的問題。 – modulaaron

1

open-uri似乎在這方面被打破。我有與包含#字符的密碼類似的問題。

我最終繞過了set_password,通過直接設置URI的@password實例變量,它不允許#字符在密碼中。

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

這是hacky,但沒有工作。