まつもとさん、おはようございます。 >>[ruby-list:4866] Re: Re^2: Request for M >>From: matz / netlab.co.jp (Yukihiro Matsumoto) >> >>おはようございます.こちらは急に冷え込んだせいか,調子が悪い >>です.風邪かな? 大丈夫ですか? 会津(福島)もだいぶ気温が下がってきました。 >>[ruby-list:4867] Re: Re^2: cgi-lib.rb >>From: matz / netlab.co.jp (Yukihiro Matsumoto) >> >>ですから,rubyでは'\1'(または"\\1")を使う,と覚えてください. あ、違和感があったのはこの点です。それで string の方ではなく、syntax のあの部分を引用したのですが、それでも紛らわしかったようですね。 シングルクォートの中で \1 が有効である事と、\nnn だけでなく \n も8進 数として扱われる事の2点です。どちらもマニュアルとも異なるようですから。 ----- cgi-lib.rb に url エンコード部分を追加しました。これに伴い initialize に も手を加えてみました。こんな書き方が出来るなんて。ruby って面白いですね。 ところで、肝心の url エンコード部分にちょっと問題が残りました。配列で はなく、文字列を渡すと動作しません。string の each って動作しているの でしょうか? それとも私が動作を勘違いしているのかな。こんな感じの使い 方だと思ったのですけれど、この例も期待する値("10101010\n")を返しません。 a = "a0a0a0a0\n" a.each("\n"){|x| x.gsub! /a/, '1' } print a ----- もう一つ。 IIS, PWS は、CGI が起動した時に、そのスクリプトのあるディレクトリがカ レントディレクトリになってくれません。そこで、これに対応する部分も追加 しました。 出来るだけ早く(少なくともファイル操作を行う前に)実行されるように外に出 しました。require で呼び出した時に実行されます。 多くの場合はこれで大丈夫だと思いますが、問題が発生するようなパターンも あるでしょう。それに当たったり、思い付いたりした方はお知らせ下さい。 *** cgi-lib.rb.org Wed Oct 08 04:08:51 1997 --- cgi-lib.rb Fri Oct 10 05:47:43 1997 *************** *** 9,14 **** --- 9,19 ---- # foo.keys <== array of fields # foo.inputs <== hash of { <field> => <value> } + # if running on Windows(IIS or PWS) then change cwd. + if ENV['SERVER_SOFTWARE'] =~ /^Microsoft-/ then + Dir.chdir ENV['PATH_TRANSLATED'].sub(/[^\\]+$/, '') + end + class CGI attr("inputs") *************** *** 39,64 **** query_string end def initialize - str = if ENV['REQUEST_METHOD'] == "GET" then - ENV['QUERY_STRING'] or "" - elsif ENV['REQUEST_METHOD'] == "POST" then - $stdin.read ENV['CONTENT_LENGTH'].to_i - else - read_from_cmdline - end - arr = str.split(/&/) @inputs = {} ! arr.each do |x| ! x.gsub!(/\+/, ' ') ! key, val = x.split(/=/, 2) ! val = "" unless val ! ! key.gsub!(/%(..)/) { [$1.hex].pack("c") } ! val.gsub!(/%(..)/) { [$1.hex].pack("c") } ! ! @inputs[key] += "\0" if @inputs[key] ! @inputs[key] += val end end --- 44,78 ---- query_string end + # escape url encode + def escape(val) + val.each do |x| + x.gsub!(/[^a-zA-Z0-9_\-.]/n){ sprintf("%%%02X", $&.unpack("C")[0]) } + end + val + end + + # unescape url encoded + def unescape(val) + val.each do |x| + x.gsub! /\+/, ' ' + x.gsub!(/%([0-9a-fA-F]{2})/){ [$1.hex].pack("c") } + end + val + end + def initialize @inputs = {} ! case ENV['REQUEST_METHOD'] ! when "GET" ! ENV['QUERY_STRING'] or "" ! when "POST" ! $stdin.read ENV['CONTENT_LENGTH'].to_i ! else ! read_from_cmdline ! end.split(/&/).each do |x| ! key, *val = unescape(x.split(/=/)) ! @inputs[key] += ("\0" if @inputs[key]) + val end end 青山 和光 Wakou Aoyama <pxn11625 / niftyserve.or.jp>