eRubyのその後の状況を報告します。
mswin32版とcygwin版で出力の改行コードが異なっていた件は、
mswin32版ではテキストモードで出力し、cygwin版にはもともと
テキストモードという概念がないことによる違いが原因でした。
eRubyのバージョン 0.9.6 で両者ともSTDOUTがbinmodeになるように
修正してもらい、現在は AN HTTPD(HTTPバージョン1.1) +
IE(HTTPバージョン 1.1使用) という組み合わせでもエラーは
なくなりました。
経緯については ruby-listの以下のスレッドを参考に。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/30725
中田さん
> それでも (CR)(CR)(LF) を改行とみなすようにしないとうまく動作はしませんね。
eRubyの問題と判明したので、Ruby-MLで報告して対応を検討してもらおうと思います。
ありがとうございました。
いとさん、
なるほど、(CR)(LF) が (CR)(CR)(LF) になっているということですね。
trace.log でも確認しました。
これはたぶん UNIX で作ったものを Windows にそのまま移すとありがちなミスだと思います。
Windows ではファイル入出力はテキストモードがデフォルトなので (LF)->(CR)(LF) という変換をしてしまいます。
UNIX で (CR)(LF) を出していたところが (CR)(CR)(LF) になってしまっているのだと思います。
AN HTTPDで (CR)(CR) で切れていると解釈する件は、その通りでした。
つまり2つ目の(CR)を空行とみなしていました。これは直せますが、それでも (CR)(CR)(LF) を改行とみなすようにしないとうまく動作はしませんね。
中田さん
> trace.log では改行コードについて確認できませんでした。
LHAでアーカイブしたファイルを再度メールします。
ところで以下のように -Mc オプションを付けるとコマンドラインから CGIモードで実行できました。
C:\>eruby -Mc c:\www\hello.rhtml
その出力は、mswin32版では
-------------------------------------------------------
Content-Type: text/html; charset=iso-8859-1(CR)(CR)(LF)
Content-Length: 13(CR)(CR)(LF)
(CR)(CR)(LF)
Hello, Ruby!(CR)(LF)
一方、Cygwin版では
-------------------------------------------------------
Content-Type: text/html; charset=iso-8859-1(CR)(LF)
Content-Length: 13(CR)(LF)
(CR)(LF)
Hello, Ruby!(CR)(LF)
でした。やはりmswin32版の改行の出し方に問題があると思えます。
ただ、trace.log を見るとAN HTTPDは以下の ∨ の位置で切れていると解釈しているようにも思えるのですが?
Content-Type: text/html; charset=iso-8859-1(CR)(CR)∨(LF)
いとさん、
trace.log では改行コードについて確認できませんでした。
>Content-Type: text/html; charset=iso-8859-1(CR)(CR)(LF)
>Content-Length: 12(CR)(CR)
について言えば、trace.log では 最後が(LF)でなければ (CR)(LF) を補うので、
>Content-Type: text/html; charset=iso-8859-1(CR)
>Content-Length: 12(CR)(CR)
ということだと思います。
ただやはり (CR)(LF) が (CR) になっているというのは考えにくいので、何か eRuby の設定の問題などもあるのではないでしょうか?
中田さん
eRubyのcygwin版も試してみたところ、こちらはHTTPバージョン1.1+IEでも問題なしでした。
どうもeRuby mswin版自体の問題であり、改行が怪しいということになるかと思います。
Ruby-ML で報告しようと思います。ログを吐くプログラムの改行とeRubyの改行の区別が
ちょっと分かり辛いのですが、eRubyの出力は以下と考えればいいのでしょうか?
Content-Type: text/html; charset=iso-8859-1(CR)(CR)(LF)
Content-Length: 12(CR)(CR)
Hello, Ruby(CR)(LF)
念のため中田さん宛にtrace.logファイルをメールで送ります。
中田さん
> ひょっとすると、eRubyが出すヘッダ部分の改行が CRLF ではなく LF なのかもしれませんね。
この前のtrace.logの関連部分だけを改行も表示すると以下の通りです。
どうも改行は(CR)のようですね。一つ(LF)が入ってますが。
-----------------------------------------------
>>>…(CRLF)
Content-Type: text/html; charset=iso-8859-1(CR)
(CR)
(CRLF)
>>>…(CRLF)
27(CRLF)
>>>…(CRLF)
(LF)
Content-Length: 13(CR)
(CRLF)
(CR)
(CRLF)
Hello, Ruby!(CRLF)
>>>…(CRLF)
(CRLF)
>>>…(CRLF)
0(CRLF)
(CRLF)
いとさん、
コマンドラインでは、
-------------------------------------------------
Hello, Ruby!
-------------------------------------------------
なのに、CGIとして動作させると、
-------------------------------------------------
Content-Type: text/html; charset=iso-8859-1
Content-Length: 13
Hello, Ruby!
-------------------------------------------------
になっているようで、それが不思議ですね。
環境変数をチェックして、CGIの場合に Content-Type と Content-Length を出すのでしょうが、Content-Lengthの前に空行があるのが変です。
Content-Length をヘッダ行と認識できれば chunkedエンコーディングにはしません。
ひょっとすると、eRubyが出すヘッダ部分の改行が CRLF ではなく LF なのかもしれませんね。
一応それも考えてあるつもりでしたが、確認してみます。
中田さん
例えば、hello.rhtml ファイルのソースは以下の1行だけにします。
<% print "Hello, Ruby!" %>
これをドキュメントルートc:\wwwに置き、コマンドラインから実行すると以下の通りです。
-----------------------------
C:\>eruby c:\www\hello.rhtml
Hello, Ruby!
C:\>
-----------------------------
HTTPバージョンが1.1 かつ IEで「HTTP1.1を使用する」にチェックありのときだけ以下の問題があり。
IEで http://127.0.0.1/hello.rhtml にアクセスすると、画面上に「ページを表示できません」
下に「サーバが見つからないか、DNS エラーです。」が出ます。そのときのtrace.logは以下の通りです。
(冗長ですみません。なぜか二度繰り返しています)
-----------------------------------------------------------------------------
<<< s=188: Fri Jul 20 20:18:54 2001 <<<
GET /hello.rhtml HTTP/1.1
Accept: application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Referer: http://127.0.0.1/
Accept-Language: ja
Accept-Encoding: gzip, deflate
If-Modified-Since: Fri, 20 Jul 2001 11:14:07 GMT; length=14
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)
Host: 127.0.0.1
Connection: Keep-Alive
>>> s=188: Fri Jul 20 20:18:55 2001 >>>
HTTP/1.1 200 Document follows
MIME-Version: 1.0
Server: AnWeb/1.34c
Date: Fri, 20 Jul 2001 11:18:54 GMT
Transfer-Encoding: chunked
Pragma: no-cache
Last-Modified: Fri, 20 Jul 2001 11:18:54 GMT
>>> s=188: Fri Jul 20 20:18:55 2001 >>>
Content-Type: text/html; charset=iso-8859-1
>>> s=188: Fri Jul 20 20:18:55 2001 >>>
27
>>> s=188: Fri Jul 20 20:18:55 2001 >>>
Content-Length: 13
Hello, Ruby!
>>> s=188: Fri Jul 20 20:18:55 2001 >>>
>>> s=188: Fri Jul 20 20:18:55 2001 >>>
0
<<< s=204: Fri Jul 20 20:18:56 2001 <<<
GET /hello.rhtml HTTP/1.1
Accept: application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
Accept-Language: ja
Accept-Encoding: gzip, deflate
If-Modified-Since: Fri, 20 Jul 2001 11:14:07 GMT; length=14
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)
Host: 127.0.0.1
Connection: Keep-Alive
>>> s=204: Fri Jul 20 20:18:56 2001 >>>
HTTP/1.1 200 Document follows
MIME-Version: 1.0
Server: AnWeb/1.34c
Date: Fri, 20 Jul 2001 11:18:56 GMT
Transfer-Encoding: chunked
Pragma: no-cache
Last-Modified: Fri, 20 Jul 2001 11:18:56 GMT
>>> s=204: Fri Jul 20 20:18:56 2001 >>>
Content-Type: text/html; charset=iso-8859-1
>>> s=204: Fri Jul 20 20:18:56 2001 >>>
27
>>> s=204: Fri Jul 20 20:18:56 2001 >>>
Content-Length: 13
Hello, Ruby!
>>> s=204: Fri Jul 20 20:18:56 2001 >>>
>>> s=204: Fri Jul 20 20:18:56 2001 >>>
0
いとさん、
eRuby の簡単な例でコマンドラインで実行した時の出力例を示してもらえませんか?
特にヘッダの内容を確認したいと思います。
中田さん
eRuby の簡単なスクリプトを AN HTTPD 上で動かしてみました。
mswin版、Cygwin版など全部で4種類のバイナリがあちこちにあって
適当に落としたものが古いバージョンだったことに気付かず、
Ruby-MLで質問して http://www.ruby-lang.org/~usa/mswin32/ から
Ruby/eRuby をダウンロードしてやっとうまくいきました。
ひとつ問題があって、IE + HTTPバージョン1.1の組み合わせでは
例のchunkedが原因でしょうかエラーになります。
調べていただければありがたいです。