[#4754] Now,I am starting ruby. — mamoru@... (Mamoru Matushita)

先日、初めて投稿したつもりだったのですが間違えて

14 messages 1997/10/02

[#4891] mixin - singleton method inheritance, const etc... — shugo@... (Shugo Maeda)

前田です。

13 messages 1997/10/10

[#5000] ruby 1.0-971015 released — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

14 messages 1997/10/15

[#5056] RubyでOODB — hisanori@...

松尾です。

20 messages 1997/10/20
[#5057] Re: RubyでOODB — matz@... (Yukihiro Matsumoto) 1997/10/20

まつもと ゆきひろです

[#5065] Re: RubyでOODB — hisanori@... 1997/10/20

松尾です。

[#5066] Re: RubyでOODB — matz@... (Yukihiro Matsumoto) 1997/10/20

まつもと ゆきひろです

[ruby-list:4886] Re^4: cgi-lib.rb

From: 青山 和光 <PXN11625@...>
Date: 1997-10-09 22:52:17 UTC
List: ruby-list #4886
まつもとさん、おはようございます。

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

In This Thread

Prev Next