@kyanny's blog

My thoughts, my life. Views/opinions are my own.

X-Pad: avoid browser bug

特に何かに困ったわけではないけどメモ。

とあるサイトでこんなレスポンスヘッダをみつけた。

HTTP/1.1 200 OK
Date: Wed, 21 Oct 2009 02:31:27 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Wed, 14 Oct 2009 12:11:11 GMT
ETag: "119565d-13ae0-475e40ef875c0"
Accept-Ranges: bytes
Content-Length: 80608
Connection: close
Content-Type: text/html
X-Pad: avoid browser bug

X-Pad ってなんぞや?と疑問に思ったのでぐぐってみたら PHP-users の過去ログに書いてあった。

[PHP-users 19224]X-Pad: avoid browserbugとは?
[PHP-users 19225]Re: X-Pad: avoidbrowserbugとは?

古いNavigatorのバグを回避するために、Apacheが
ダミーデータをパディングしています。

http://ml.php.gr.jp/pipermail/php-users/2003-December/019752.html

なるほど、古い Netscape Navigator のバグを回避するためのコードが Apache にあるんですな。ご丁寧に調べ方まで書いてあるのでありかを調べてみる。

$ find httpd-2.2.14 -name '*.[ch]' -exec grep -l 'X-Pad:' {} \;
httpd-2.2.14/modules/http/http_filters.c
$ grep -n 'X-Pad:' httpd-2.2.14/modules/http/http_filters.c
959:    char tmp[] = "X-Pad: avoid browser bug" CRLF;

なるほどここにあった。ちょっとバージョン古くて行番号も違うけど Google Code Search だとここ → http://www.google.co.jp/codesearch/p?hl=ja&sa=N&cd=1&ct=rc#W6G7kfsfmHo/httpd-2.2.4/modules/http/http_filters.c&q=http_filters.c&l=770

コメントを読んでみると、どうやらバグというのはヘッダの終了を意味する CRLF がヘッダの先頭から数えて特定のバイト数目にあらわれるとパースに失敗する、というものらしい。なので CRLF の位置をバグに当たらない位置までずらすためにダミーデータで埋めている、と。

ブラウザに歴史あれば、ウェブサーバのソースコードにも歴史あり。それにしても、最近はてダにこんなことばっかり書いてるな。もう少しトレンドっぽいことも書かないとまずいかなーと思うのだけど、不思議と興味関心が沸くのはこういう、枯れたものというのか、重箱の隅をつつくようなことばかりだったりする。バッドノウハウを蓄積するのが性に合ってるのかもな。