まつもとさん、おはようございます。

>>[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>