Logo address

CGI Header

2010/05/30

今日は Python.org の http://docs.python.org/library/cgi.html を訪れて愕然とした。CGI ヘッダの書き方について次の説明(サンプルコード)が載っているのである。

print "Content-Type: text/html"     # HTML is following
print                               # blank line, end of headers

コード1

この説明は HTTP 1.1 の要請に従っていない。RFC2616 には HTTP ヘッダに関して次のように説明されている:

generic-message = start-line
    *(message-header CRLF)
    CRLF
    [ message-body ]
    start-line      = Request-Line | Status-Line
つまり RFC によると CGI ヘッダの書き方は次が正しい:
print "Content-Type: text/html\r"     # HTML is following
print "\r"                            # blank line, end of headers

コード2

もっとも Windows の改行規則は CRLF だから、Windows に限定すればコード1で構わないであろう。しかし UNIX の場合には print は単に LF で改行するからコード2 のように CR を明示的に含めなくてはならない。

RFC では HTTP のヘッダ部の改行は CRLF であるが、僕の観察に寄ると、この規則に従わない CGI が世の中に氾濫している。僕は自作の web サーバー Pegasus を使っているが、Pegasus では CGI が HTTP ヘッダに対して CR を付けなくても、Pegasus が親切に CR を付加している。しかし他のサーバーはどうであろうか? 現実に CRLF 規則に従っていない CGI が世の中に氾濫している現状を考えると、必ずしもサーバーはそこまで親切ではないであろう。

注: tcpdump で実験しましたが、それによると Apache も Pegasus と同様に CR を付加しているようです。

CRLF 問題は実際にはブラウザが吸収しているはずである。ブラウザは RFC に従っていないからと言って簡単に拒否する訳には行かないのだ。ブラウザは可能な限り親切である。CGI コードの作成者は必ずしも RFC を読んでいないし、またプログラムが生成する文字コードについての知識を持っている訳ではない。そうした現実を考えると RFC の中で CRLF 問題はブラウザが吸収すべきであると書いてくれる方が好ましいだろう。