From: Tanaka Akira Date: 2004-04-13T00:41:12+09:00 Subject: [ruby-list:39543] Re: open-uri takes wrong value for Host with proxy In article , Atsushi SHICHI writes: > [ruby-list:25882]のスレッドで、proxy を使う場合、Net::HTTP が > Host ヘッダフィールドに proxy のアドレスとポートから作られた > 文字列を入れてしまうバグが報告され、青木さんが修正して下さった > と思いますが、open-uri にも同様のバグがあるようです。 うぅむ。Host: には origin server を指定しないといけなかったんですね。 気づいてませんでした。 (つまり、name based virtual proxy というのはできないわけだ。) これを open-uri 側で Host: を生成するようにするなら次のようになります。 (そうか。こーゆーときに Host: を変える機能が必要になるのか?) Index: lib/open-uri.rb =================================================================== RCS file: /src/ruby/lib/open-uri.rb,v retrieving revision 1.25 diff -u -r1.25 open-uri.rb --- lib/open-uri.rb 12 Apr 2004 10:17:46 -0000 1.25 +++ lib/open-uri.rb 12 Apr 2004 15:01:58 -0000 @@ -529,6 +529,8 @@ header = {} options.each {|k, v| header[k] = v if String === k } + header['host'] = uri.host + require 'net/http' resp = nil Net::HTTP.start(self.host, self.port) {|http| Index: lib/net/http.rb =================================================================== RCS file: /src/ruby/lib/net/http.rb,v retrieving revision 1.115 diff -u -r1.115 http.rb --- lib/net/http.rb 29 Mar 2004 07:54:37 -0000 1.115 +++ lib/net/http.rb 12 Apr 2004 15:02:00 -0000 @@ -949,7 +949,7 @@ if not req.response_body_permitted? and @close_on_empty_response req['connection'] = 'close' end - req['host'] = addr_port() + req['host'] ||= addr_port() end def end_transport(req, res) ほかの案としては、net/http 側で Request-URI に absoluteURI がきたらそ こから Host: を生成するという可能性もあります。ただ、net/http はもとも と proxy を別の形でサポートしていて、open-uri はそうではない方法でむり やり proxy を扱うので、そういうのは net/http にはそぐわないという気も します。 なお、open-uri が素直でない方法で net/http を使うのは、素直な方法だと http proxy 経由の ftp を扱えないためです。 ついでにいえば http proxy 経由の http の場合には net/http の proxy を 素直に使うというのもあり得ます。が、そうした場合には http proxy 経由の ftp の場合に Host: が proxy になってしまいます。まぁ、ftp には name based virtual host はないのでそれはそれで構わないという気もしますが... さて、どうしましょうね。 -- [田中 哲][たなか あきら][Tanaka Akira]