やすいです.はじめまして.

mod_ruby と cgi.rb で Web プログラミングのテストをしているの
ですが,HTTP のレスポンスヘッダがうまく出力されていないよう
です.ぼくのやりかたが間違っているのかもしれないので,正しい
やりかたを教えていただけると,ありがたいです.

たとえば,以下のような「index.rbx」を作りました.

    require "cgi"

    cgi = CGI.new
    print cgi.header("nph" => true,
                     "type" => "text/plain",
                     "status" => "NOT_FOUND")
    print "Hello Ruby.\n"

これを,コマンドラインから起動すると,

    % ruby index.rbx
    (offline mode: enter name=value pairs on standard input)
    HTTP/1.0 404 Not Found
    Date: Sat, 03 Feb 2001 21:08:46 GMT
    Server: 
    Connection: close
    Content-Type: text/plain

    Hello Ruby.

という風になります.しかし,mod_ruby 経由で HTTP アクセスすると,

    % telnet localhost 80
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    GET /~tach/index.rbx HTTP/1.1
    Host: hostname.of.webserver

    HTTP/1.1 200 OK
    Date: Sat, 03 Feb 2001 21:11:12 GMT
    Server: Apache/1.3.9 (Unix) Debian/GNU mod_jk mod_ruby/0.1.4 Ruby/1.4.3(1999-12-08) mod_ssl/2.4.10 OpenSSL/0.9.4 mod_perl/1.21_03-dev
    HTTP/1.1 404 Not Found
    Date: Sat, 03 Feb 2001 21:11:21 GMT
    Connection: close
    Transfer-Encoding: chunked
    Content-Type: text/plain

    Hello Ruby.

となります.HTTP/1.1 レスポンスと Date: が二重になって出ている
のがわかります.どうやら,200 OK は固定で出ているようで,status
をいろいろ変更しても 200 が出ました.

cgi.rb のソースを読んでみましたが,mod_ruby 経由のときは,
CGI#header で,

    Apache::request.send_http_header

を呼び出しています.これが,強制的に 200 を吐いているのだと思い
ますが,いかがでしょうか.

cgi.rb を使わずに直接書けば Status を変更することができますが,
cgi.rb を利用して行う方法はこれで正しいのでしょうか.
あるいは,ほかのやり方があるのでしょうか.
#あるいは,このような使い方を想定していない?

環境は,Debian GNU/Linux 2.2 で,関連するソフトのバージョンは,
以下のようになっています.

ii  ruby           1.4.3-6        An interactive object-oriented scripting lan
ii  libruby        1.4.3-6        Libraries necessary to run the Ruby.
ii  libapache-mod- 0.1.4-2.2      Embedding Ruby in the Apache web server
ii  apache         1.3.9-13.2     Versatile, high-performance HTTP server
-- 
// 安井 卓 (Yasui, Taku) <tach / debian.or.jp>
// WWW: http://tach.nu/