2013-06-27 11 views
5

Sto usando rubino 1.9.3 e sto facendo funzionare il seguente comando:Rubino OpenURI FTP non funziona quando il nome utente ha spazi

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

che ritorna:

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

Codifica il nome utente (spazi sostituzione con% 20) non funziona neanche:

Net::FTPPermError: 530 Invalid userid/password

L'URI funziona correttamente su tutti i browser e client FTP testati - solo no quando si utilizza OpenURI. Inoltre, utilizzando Net :: FTP (che è avvolto da OpenURI) funziona bene così:

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

Qualsiasi idea del perché il metodo OpenURI non funziona, mentre il metodo Net :: FTP fa? Grazie.

risposta

2

Per definizione in the specification, URL nomi utente permettono solo questi caratteri:

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

I browser sono noti per ignorare le specifiche in modo da dicendo che sostengono che non è una buona prova. Loro non dovrebbero per la spec.

Se cURL li supporta, quindi utilizzare la gemma Curb e vedere se questo ti consente di usarli.

+0

Grazie. Non sono sicuro se l'hai visto, ma ho modificato il post circa 5 minuti fa per includere il fatto che Net :: FTP funziona correttamente. Per il momento lo stiamo usando, ma idealmente vorremmo usare solo OpenURI (dato che anche Het :: HTTP verrà usato nell'app). – modulaaron

+0

Typo sopra: Het :: HTTP = >> Net :: HTTP – modulaaron

1

Secondo this StackOverflow answer, dovresti riuscire a sfuggire ai caratteri speciali nel nome utente e nella password. Si potrebbe fare qualcosa di simile:

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

Questo è quello che ho pensato anch'io, ma in questo caso la conversione degli spazi in "% 20" risulta in un errore di autenticazione FTP. – modulaaron

+0

Cosa succede se provi l'escape in stile 'CGI.escape', ad esempio,' open ("ftp: // user + name: [email protected]/1234/1234.txt.gz") '? –

+0

Stesso problema quando si utilizza "nome utente +" al posto di "nome utente". – modulaaron

1

open-uri sembra rotto in quella materia. Ho avuto il problema simile con la password che conteneva il carattere #.

Ho finito per bypassare set_password, che non consente il carattere # in password, impostando direttamente la variabile di istanza @password dell'URI.

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

È hacky, ma fa il lavoro.

Problemi correlati