From: Makoto Kuwata Date: 2008-02-06T23:25:12+09:00 Subject: [ruby-dev:33618] Re: cgi.rb再構築案 桑田といいます。 さっそくの対応、ありがとうございます。 2008/2/6 Nobuyoshi Nakada : > 1.9ではDelegateClass(Array)はかなり改善したと思います。 1.8 系にも反映されますか? もしそうなら、DelegateClass(Array) を取り除かなくてもいいかも しれません。 > StandardErrorを使っていますが、別のほうがいいんじゃないでしょう > か。RangeError? なるほど。そういう例外クラスがあるんですね。勉強になります。 > > > 簡単化のため制限値は定数で指定してますが、必要であればクラス変数や > > インスタンス変数で指定できるようにしてください。 > > 後者にしてみました。 cgi.rb の設計だと、CGI.new したと同時に HTTP Request がパース されるので、現状ではパースする前に @max_content_length とかを 設定することができません。 CGI#initialize() に第2引数 opts={} を追加して class CGI def initialize(type="query", opts={}) @max_content_length = opts[:max_content_length] @max_multipart_length = opts[:max_multipart_length] ... とするか、CGI#initialize() でパースするのを抑制しておいて あとで好きなタイミングでパースできるような仕組みがないと、 MAX_CONTENT_LENGTH を @max_content_length にしても あんまりうれしくありません。 たぶん上のコードのように、CGI#initialize に第2引数 opts={} を 追加してもらうのがいちばんスマートだと思います。 >[ruby-dev:33606]からの差分にしようかと思いま > したが、パッチが壊れているようなのでsvn HEADからの差分です。 申し訳ありませんでした。 パッチは、1.8.6 p111 に対して作成したんですけど、HEAD に対して 作成するものなんでしょうか。 今後のためにどなたか教えていただけますか。 > > 他に、NEEDS_BINMODEの判定条件がdarwinも含んでしまっている点や、 NEEDS_BINMODE って必要なのでしょうか。 cgi.rb では、設定だけされて、どこにも使われていません。 PATH_SEPARATOR も同様です。 > env_tableを使わずに直接ENVを使っているところも修正しています。 これはうれしいですね。現状では CGI#env_table を拡張しても、 ほとんど意味がなかったので。 > これに関しては、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 を設定するタイミングがありません。 しかし、前述したようにもし CGI#initialize() が opts={} を 取るなら、次のように自然に拡張できます。 class MyCGI < CGI def initialize(type="query", opts={}) @env = opts[:env] || ENV super end attr_accessor :env def env_table @env end end initialize() の仕様を子クラスで自由に変えてもいいですが、 できれば CGI クラスのほうで opts={} のようなサポートがあると、 CGI クラスを拡張したい人にはうれしいと思います。 いかがでしょうか。 ただ、これは実際に CGI クラスを拡張している方の意見を 聞いてみたいですね。 fcgi.rb の作者さん、どうでしょう? -- regards, makoto kuwata