question:1159850302へのフォロー

ありがとうございます。key=[URL]で指定されるURLにGetパラメータが含まれていた場合には、[URL]が分解されるので正しくリクエストできませんね。[URL]を丸ごと取得する方法をご存知であれば教えていただけますか。ポイントを差し上げます。

もしも、対象となるURLに「&」や「;」が含まれているようでしたら、「&」は「%26」と、「;」は「%3B」と置き換えてください。私の回答にありますCGIのフォームから入力しますと置き換えも行われますので、よろしければフォームから入力してご確認ください(Windows上で、Firefox 1.5とIE6で正しく動作するのを確認しました)。

こちらが提示したCGIのURL(例)
http://localhost/get_html.cgi
対象となるURL(例)
http://localhost/foo.cgi?foo=foo&bar=bar;baz=baz
クエリが分離してしまう、まずい場合
http://localhost/get.cgi?key=http://localhost/foo.cgi?foo=foo&bar=bar;baz=baz
「&」と「;」を置き換えて、問題のない場合
http://localhost/get.cgi?key=http://localhost/foo.cgi?foo=foo%26bar=bar%3Bbaz=baz
CGIのGetボタンを押した時の、問題のない場合
http://localhost/~don/ruby/get_html.cgi?key=http%3A%2F%2Flocalhost%2Ffoo.cgi%3Ffoo%3Dfoo%26bar%3Dbar%3Bbaz%3Dbaz

もしくは、id:er7さんが直接ブラウザのURL欄に手もしくはコピペで対象URLを書いていて、上記のような置き換えは面倒だからやってられない、ということでしたら、私の回答にありますCGIを一部変更することでそれなりに対処できます。ただしこの場合対象となるURLのクエリにkeyが含まれますとまずいことになる場合がありますので注意してください。たとえば「http://localhost/get.cgi?key=http://localhost/foo.cgi?foo=foo&key=value」を対象とすると「key=value」はなかったことになるか、あるいは対象URLがvalueになる可能性があります。ただし「http://localhost/get.cgi?key=http://localhost/foo.cgi?key=value;foo=foo」のようにkeyが?の直後にある場合は問題ありません。このように不安定な仕様ですので、あまりお勧めできません。

class MyCGI < WEBrick::CGI
  def do_GET(req, res)
    if req.query.include?('key')
      uri = URI.parse(req.query['key'])
      # この下の行から
      req.query.each do |k, v|
        next if k == 'key'
        uri.query += ";#{k}=#{v}"
      end
      # この上の行までを追加する
      STDERR.puts(uri.inspect)
      uri.open do |f|
        res['content-type'] = f.content_type

ということで、上記二つのうち前者の「文字の置き換え」による対処をお勧めします。ということでよろしいでしょうか?