読者です 読者をやめる 読者になる 読者になる

HTTP サーバのレスポンスヘッダは Firefox の Live HTTP headers よりも wget -S の方が詳しく取れる

Apache lighttpd
#!/usr/bin/ruby

print "Content-Type:application/xhtml+xml\r\n"
print "Content-Type:text/plain\r\n\r\n"
print <<EOF
Test for
How to deal Content-Type
EOF

たとえば上記のようにわざと Content-Type を二重に出力してしまうと、Apache はバリデートで後者のみがクライアントに返されるが、lighttpd はそのまま二重定義で返してしまう。
これを確認するために、FirefoxLive HTTP headers を使ってレスポンスヘッダを見ても、下記のように Content-Type はどちらも1つしかない。lighttpd の前記の動作を確認することはできない。

Firefox Live HTTP headers

Apache
HTTP/1.x 200 OK
Date: Fri, 12 Dec 2008 15:23:14 GMT
Server: Apache/2.2.3 (CentOS)
Content-Length: 34
Connection: close
Content-Type: text/plain; charset=UTF-8
lighttpd
HTTP/1.x 200 OK
Transfer-Encoding: chunked
Content-Type: text/plain
Date: Fri, 12 Dec 2008 15:23:55 GMT
Server: lighttpd/1.4.20

wget -S

今度は wget -S オプションで server response を見るようにしてみると、lighttpd の方は Content-Type がそのまま二重に出力されていることが確認できた。

Apache
$ wget -S http://localhost:80/type.cgi
--00:10:50--  http://localhost/type.cgi
localhost をDNSに問いあわせています... 127.0.0.1
localhost|127.0.0.1|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 
  HTTP/1.1 200 OK
  Date: Fri, 12 Dec 2008 15:10:50 GMT
  Server: Apache/2.2.3 (CentOS)
  Connection: close
  Content-Type: text/plain; charset=UTF-8
長さ: 特定できません [text/plain]
Saving to: `type.cgi.1'

    [ <=>                                    ] 34          --.-K/s   in 0s     

00:10:50 (566 KB/s) - `type.cgi.1' を保存しました [34]
lighttpd
$ wget -S http://localhost:81/type.cgi
--00:13:18--  http://localhost:81/type.cgi
localhost をDNSに問いあわせています... 127.0.0.1
localhost|127.0.0.1|:81 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 
  HTTP/1.0 200 OK
  Connection: close
  Content-Type: application/xhtml+xml
  Content-Type: text/plain
  Date: Fri, 12 Dec 2008 15:13:18 GMT
  Server: lighttpd/1.4.20
長さ: 特定できません [application/xhtml+xml]
Saving to: `type.cgi.2'

    [ <=>                                    ] 34          --.-K/s   in 0s     

00:13:18 (300 KB/s) - `type.cgi.2' を保存しました [34]

wget -S の方が Firefox Live HTTP headers より生のストリームに近いものを見ることができた。話が少しそれるが、Firefox は後の定義で、wget は先に現れた Content-Type で認識しているということもわかった。
ちなみにケータイ向けの CGI で、cgi.out({ "Content-Type" => "application/xhtml+xml" }) としていて、XHTML として認識されなかったのをデバッグしていた過程で気づいた。正しくは、cgi.out({ "type" => "application/xhtml+xml" }) としなくてはならない。そのため、カスタム定義と見なされて二つ出力されてしまっていた。