From: Nobuyoshi Nakada Date: 2008-02-07T11:43:06+09:00 Subject: [ruby-dev:33625] Re: cgi.rb再構築案 なかだです。 At Wed, 6 Feb 2008 23:25:12 +0900, Makoto Kuwata wrote in [ruby-dev:33618]: > > 1.9ではDelegateClass(Array)はかなり改善したと思います。 > > 1.8 系にも反映されますか? > もしそうなら、DelegateClass(Array) を取り除かなくてもいいかも > しれません。 残念ながら1.8ではブロック引数を受け取るブロックを定義できないた め、不可能です。 > > > 簡単化のため制限値は定数で指定してますが、必要であればクラス変数や > > > インスタンス変数で指定できるようにしてください。 > > > > 後者にしてみました。 > > cgi.rb の設計だと、CGI.new したと同時に HTTP Request がパース > されるので、現状ではパースする前に @max_content_length とかを > 設定することができません。 とりあえず、CGIを継承したクラスのinitializeでsuperの前にセットす ることで、対応できるはずです。 > >[ruby-dev:33606]からの差分にしようかと思いま > > したが、パッチが壊れているようなのでsvn HEADからの差分です。 > > 申し訳ありませんでした。 > パッチは、1.8.6 p111 に対して作成したんですけど、HEAD に対して > 作成するものなんでしょうか。 > 今後のためにどなたか教えていただけますか。 この場合HEADといっているのは、1.8系列の最新ということです。 cgi.rbについてはp111(というかそれ以前)から変化がないので、実際に はどちらでも問題ありません。「壊れている」というのは、それとは別 の話で、GMailで勝手に折り返されてしまっているということです。 > > 他に、NEEDS_BINMODEの判定条件がdarwinも含んでしまっている点や、 > > NEEDS_BINMODE って必要なのでしょうか。 > cgi.rb では、設定だけされて、どこにも使われていません。 > PATH_SEPARATOR も同様です。 消そうかとも思ったのですが、もしかしてcgi.rbを使う側で参照してい たりするのかなと。 > > env_tableを使わずに直接ENVを使っているところも修正しています。 > > これはうれしいですね。現状では CGI#env_table を拡張しても、 > ほとんど意味がなかったので。 しかし、残っていたのはSCRIPT_NAMEとGATEWAY_INTERFACEだけで、それ 以外はどうでもいいということはないと思うのですが。 > > これに関しては、CGIを継承したクラスでenv_tableをオーバーライドす > > るのが正しいのではないでしょうか。たしかに漏れている部分もありま > > したが、その二つについては以前からenv_tableを使うようになってい > > ます。 > > CGI#env_table も、今のままだと使いづらいです。 > たとえば CGI#env_table を次のように変更したいとき、 > > class MyCGI < CGI > attr_accessor :env > def env_table > @env > end > end > > 現状だと MyCGI.new したときにはパースが終わってしまうので、 > @env を設定するタイミングがありません。 そもそも、initializeの中で全部閉じてしまっているのがうまくないの だと思います。 > しかし、前述したようにもし CGI#initialize() が opts={} を > 取るなら、次のように自然に拡張できます。 とりあえずの回避策としてはそれでいいんじゃないでしょうか。今まで のcgi.rbでも使えますし。@max_content_lengthでも同じことですよね。 あるいは、define_methodで上書きするとか。 my_env = {...} cgi = Class.new(CGI) {define_method(:env_table){my_env}}.new > initialize() の仕様を子クラスで自由に変えてもいいですが、 > できれば CGI クラスのほうで opts={} のようなサポートがあると、 > CGI クラスを拡張したい人にはうれしいと思います。 > いかがでしょうか。 そのへんも含めて再設計すべきだと思います。 -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦