From: Masaki Fujimoto Date: 2003-03-04T13:45:19+09:00 Subject: [ruby-dev:19724] Re: bug in cgi.rb? ふじもとです。 Yukihiro Matsumotoさんの<1046737099.743944.14518.nullmailer@picachu.netlab.jp>から >$1などは毎回新しい文字列を生成していますので、table.addした >文字列が次のマッチで破壊されるとかいうことはないような気がし >ます。せっかくname, valueに代入しているんだからそっちを使っ >たほうがよいと思うけど。 そうですよね... >ただ、「今日それでハマった」ということはなにか問題があるのか >もしれません。「ハマった」現象についてもう少し聞かせていただ >けると参考になると思います。 すいません、基本を忘れてました。お恥ずかしいです。 で、何が問題だったかと言いますと、(cgi/session.rbではなく独自の)セッション処理の 箇所で @cgi.instance_eval do @output_cookies = [ Cookie::new("name" => session_key, "value" => session_id, "path" => session_path) ] end というような感じで基本どおりCookieオブジェクトをセットしてから、さまざまな処理を 経てcgi#headerをでヘッダを出力させると Server: Apache/1.3.26 (Unix) Debian GNU/Linux mod_ruby/1.0.5 Ruby/1.6.7 PHP/4.1.2 \230\f\e\010P顧010(: session_id=17bb2bb19263e96849be85f11d9eedc07456d322; path=/ のようにHTTPヘッダの'Set-Cookie'となるべき箇所にあらぬ文字列が出力される*ことが *あるという現象がありました(必ず、ではないというのがまた悩ましいです)。 先ほど、またちょっと調べてみたのですが、httpd.confでRubyOutputMode=sync (またはsyncheader)を設定すると上記の問題は発生しないので、やはりap_table_addn() してから"実際に"ヘッダが送信されるまでの間にバッファが壊れているような気もしま す。 # というか、デフォルトだとApache.request.send_http_header()で出力がペンディング # されるというのを今日知りました(汗) 簡単なスクリプトで再現しないかと思ってちょこちょこ試しているのですが、やはりとい うかなんというか再現できないので、レアケースということで。とりあえずsyncheaderを セットして逃げつつ、週末にでも本腰いれて調べてみようと思います。 # Ruby/1.6.8にしたら直ったりして... -- Masaki Fujimoto fujimoto@tunebiz.net