2013-06-27 7 views
5

Ich bin mit Ruby 1.9.3 und bin mit dem folgenden Befehl ein:Rubin openURI FTP funktioniert nicht, wenn Benutzername Räume haben

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

, die zurückgibt:

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

die Benutzername Encoding (als Ersatz für Räume mit% 20) funktioniert auch nicht:

Der URI funktioniert in allen getesteten Browsern und FTP-Clients einwandfrei - einfach nicht bei Verwendung von OpenURI. Auch mit Net :: FTP (die durch openURI gewickelt wird) funktioniert auch:

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

Jede Idee, warum die openURI Methode nicht funktioniert, während der Net :: FTP-Methode funktioniert? Vielen Dank.

Antwort

2

Per Definition in the specification, URL-Benutzernamen erlauben nur diese Zeichen:

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

Browser sind berüchtigt für die Spezifikationen zu ignorieren, so sagen sie unterstützen es kein guter Beweis. Sie sollten nicht pro Spezifikation sein.

Wenn cURL sie unterstützt, dann verwenden Sie den Edelstein Curb und sehen Sie, ob Sie damit arbeiten können.

+0

Danke. Nicht sicher, ob du es gesehen hast, aber ich habe den Beitrag vor etwa 5 Minuten bearbeitet, um die Tatsache zu berücksichtigen, dass Net :: FTP gut funktioniert. Wir verwenden das vorerst, würden aber idealerweise nur OpenURI verwenden (da Het :: HTTP auch in der App verwendet wird). – modulaaron

+0

Tippfehler oben: Het :: HTTP = >> Net :: HTTP – modulaaron

1

Nach this StackOverflow answer sollten Sie nur die Sonderzeichen in Ihrem Benutzernamen und Passwort entkommen können. in dieser Angelegenheit

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

Das dachte ich auch, aber in diesem Fall führt die Umwandlung von Leerzeichen in "% 20" zu einem FTP-Authentifizierungsfehler. – modulaaron

+0

Was passiert, wenn Sie versuchen, den CGI.escape-Stil zu umgehen, z. B. "open" ("ftp: // user + name: [email protected]/1234/1234.txt.gz")? –

+0

Gleiches Problem bei der Verwendung von "Benutzer + Name" anstelle von "Benutzername". – modulaaron

1

open-uri scheint gebrochen: Sie könnte so etwas wie zu tun. Ich hatte das gleiche Problem mit dem Passwort, das # Zeichen enthielt.

Ich endete umgangen set_password, die Zeichen in Passwort nicht erlaubt, indem URI @password Instanzvariable direkt eingestellt.

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

Es ist hacky, aber macht den Job.

Verwandte Themen