5

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")

Net::FTP メソッドは機能するのに、OpenURI メソッドが機能しない理由は何ですか? ありがとう。

4

3 に答える 3

2

仕様の定義により、URL ユーザー名には次の文字のみを使用できます。

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

ブラウザーは仕様を無視することで悪名高いため、ブラウザーが仕様をサポートしていると言うことは良い証拠ではありません。仕様どおりにすべきではありません。

cURL がそれらをサポートしている場合は、Curb gem を使用して、それらを使用できるかどうかを確認してください。

于 2013-06-27T20:17:40.103 に答える
1

この StackOverflow answerによると、ユーザー名とパスワードの特殊文字をエスケープするだけでよいはずです。次のようなことができます:

login = URI.escape('user name') + ':' + URI.escape('password')
open("ftp://#{login}@datafeeds.domain.com/1234/1234.txt.gz")
于 2013-06-27T20:53:16.630 に答える
1

open-uriその点で壊れているようです。文字を含むパスワードでも同様の問題がありました#

URI のインスタンス変数を直接設定することで、パスワードに char をset_password許可しない をバイパスすることになりました。#@password

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

ハックですが、仕事はします。

于 2017-04-21T14:41:58.080 に答える