From: Wakou Aoyama Date: 2001-12-30T17:51:59+09:00 Subject: [ruby-list:33124] Re: cgi.rb で cookie の encoding について 青山です。 On Sun, Dec 30, 2001 at 01:03:31PM +0900, Tanaka Akira wrote: > 個人的にはぜんぜん標準になりそうには見えないんですが、それはそれとして、 rfc に取り込まれるか、という意味でなら、確かにそんな感じもします。標準、 とまでは言わず、まあ、デファクトスタンダード、あたりでしょうか。 > まず、次の理由により cgi.rb の現在の挙動を変えるべきでないとは思います。 > > * 既存の cgi.rb が発行した cookie を変更後の cgi.rb が受け取ると値が変 > わってしまう。 > > * w3m のように cookie が client を通過する時に変換が行なわれることがあ > り、これを安全に避けるノウハウをライブラリが提供してくれると嬉しい。 > > というわけで、二者択一なら escape するというのは悪くない選択だと思いま > す。しかし、この件は実際には二者択一ではないので、他の選択肢もあります。 前者に関しては、互換性の無い変更を行う場合には、互換性のある挙動をデフォ ルトとして移行期間を設ける等の対応はありえると思いますので、escape し ないのをデフォルトにする強い理由があれば、かまわないかなとも思います。 後者に関しては、日本語と CGI における文字コードの問題はいろいろとあり ますし、たまたまうまくいくようだ、という感じの不安定な要素ですが、確か に日本人にとっては理由の1つにはなりますね。 > 他の形式の(しかし RFC には従っている) escape 手法を扱えないのは cgi.rb > の欠点であることには違いありませんから、他の形式「も」扱えるように拡張 > するのがいいんじゃないかと思います。具体的には 略 > この拡張を一般化し、Ruby のオブジェクトと(生の)cookie の相互変換部分を > 自由に差し替えられるようにすれば実現できます。そしてデフォルトで既存の > escape と同様な変換を設定しておけば互換性も確保できます。 > > # IRC でもだれかが述べてましたが、escape/unescape 用の proc を設定でき > # るようにするだけで充分だと思います。 escape, unescape の proc を設定できる、というのは良い選択肢だとは思い ます。 ただ、それを採用する場合には、keyword 引数が使えるようになってからかな、 という気持はします。 理由としては、セット時には、Cookie オブジェクトの属性の一つとして、 cookie.escape_proc = proc というのは、まあ、良さそうかとは思うのですが、 ゲット時の処理のタイミングは CGI.new() の時なので... query = CGI.new(cookie_escape_proc = proc) このようなインターフェイスになるのでしょうかね。もし、現在の cgi.rb に そのまま追加するとしたら、毎度ながら Hash を利用する事になるのでしょう か... query = CGI.new("html" => "html3", cookie_escape_proc => proc) このあたりからの検討が必要になりますので、少なくとも、現在の cgi.rb に 単純に追加するという事はないだろうと思います。 > 例えば、Set-Cookie2: name=p1|p2|p3; Version=1 は RFC 2965 (と > RFC 2616)になんら反するところのない形式です。そして、仮に、この形式を > 用いる既存のシステムを Ruby script で差し替えるという状況を考えると、 > 残念ながら cgi.rb の cookie では扱えません。そのような状況は扱わないと > いうのも一つの立場ですが、そういう立場をとるんでしょうか? 特殊な例でない限りは、セット側とゲット側を別の言語で開発するという事は 無いと思われますので、そのような問題は発生しないと思っております。 ただし、絶対に無いとは限らないのも確かではありますので、その場合には、 他の発言にも書いたように、特殊な例として、HTTP_COOKIE を直接扱って頂く のが無難そうだ、という感じに思っています。 ま、先に書いたように、これは、現在の cgi.rb としては、ですが。 -- 青山 和光 Wakou Aoyama