From: zunda Date: 2005-09-27T16:43:22+09:00 Subject: [ruby-list:41186] 1.8.2 と 1.8.3 の WEBrick::HTTPRequest#query の動作の変化について zundaと申します ruby-1.8.2では期待通りに動いていたBitChannelがruby-1.8.3で期待通りに動 かなくなったのをきかっけに、WEBrick::HTTPRequest#queryが返す値がruby-1.8.2 から1.8.3で変わったことに気づきました。1.8.2と1.8.3と、どちらが期待され る動作かご存じの方がいらっしゃたらお知らせいただけませんか? 手元のBitChannel(1.162)では、http://example.com/PageName.htmlというURLに来た リクエストをApache(2.0.48)のmod_rewriteでhttp://example.com/?cmd=view;name=PageName にリダイレクトしてからindex.cgiを呼びだしています。 BitChannelの内部では、lib/bitchannel/handler.rbでWEBrick::HTTPRequest#query['name'] を呼んでリクエストされたページ名を解釈しているようです。下記のdiffにあるように、 このメソッドが参照するURLが、ruby-1.8.2では環境変数SCRIPT_NAME、PATH_INFO、 QUERY_STRINGをつなぎ合わせて作られていたのに対して、ruby-1.8.3ではREQUEST_URI をもとにして作られているようです。このため、ruby-1.8.3で動くBitChannelはリクエスト されたページ名が得られずに、いつでもFrontPageを表示するようになっています。 この変更は意図されたものでしょうか?ご存じの方、お知らせください。 --- ruby-1.8.2/lib/webrick/cgi.rb 2004-09-15 23:14:27.000000000 -1000 +++ ruby-1.8.3/lib/webrick/cgi.rb 2005-09-26 21:23:05.000000000 -1000 (前略) def request_line - meth = @env["REQUEST_METHOD"] - url = @env["SCRIPT_NAME"].dup - if path_info = @env["PATH_INFO"] - url << path_info - end - if query_string = @env["QUERY_STRING"] - unless query_string.empty? - url << "?" << query_string + meth = @env["REQUEST_METHOD"] || "GET" + unless url = @env["REQUEST_URI"] + url = (@env["SCRIPT_NAME"] || File.expand_path($0)).dup + url << @env["PATH_INFO"].to_s + url = WEBrick::HTTPUtils.escape_path(url) + if query_string = @env["QUERY_STRING"] + unless query_string.empty? + url << "?" << query_string + end end end # we cannot get real HTTP version of client ;) httpv = @config[:HTTPVersion] - "#{meth} #{url} HTTP/#{httpv}" + return "#{meth} #{url} HTTP/#{httpv}" end __________________________________ For All Sports Fans! http://pr.mail.yahoo.co.jp/yells/