2002/04/26
Pegasus/1.0 はユーザドキュメント扱いにバグを持っていた。このバグは HTTP1.1 における持続的接続の問題と関連している。(Pegasus/1.0a では解決しています)
ar.aichi-u.ac.jp
、alice
を ar.aichi-u.ac.jp
のユーザ、 /usr/alice/web/doc
を alice
のドキュメントルートとする。http://ar.aichi-u.ac.jp/~alice/index.htmlでアクセスされるファイル
/usr/alice/web/doc/index.html (1)の中の記述
<img src="/image/logo.gif"> (2)について考える。この中の
/image/logo.gifは何を指しているか?
HTTP のルールでは、(2)は URI が
http://ar.aichi-u.ac.jp/image/logo.gifで示されるドキュメントを指している。つまり実ホストのファイルであり alice のファイル
/usr/alice/web/doc/image/logo.gif (3)ではない。(3)のファイルを(1)で指定するには(2)ではなく
<img src="/~alice/image/logo.gif">とする必要がある。
実は筆者はうっかりと(2)でドキュメントを書いていた。ドキュメントを作成する立場から考えると自分のドキュメントルートを "/" で書きたくなるのである。(とりわけ Pegasus では)
そしてそのように書いても誤りが露呈しなかったのは、幸運が重なったからである。即ち、Pegasus/1.0 を HTTP/1.1 のクライアントからアクセスした場合には、持続的接続の結果として、alice のドキュメント空間の中の "/image/logo.gif" を取りに行く。
Pegasus/1.0 の誤りは(1)の中で
<a href="http://ar.aichi-u.ac.jp">ar.aichi-u.ac.jp</a>と書いた場合に露呈する。alice のドキュメント空間から抜け出せないのである。同様に実ホストのドキュメントの中で
<a href="http://ar.aichi-u.ac.jp/~alice/">alice のページ</a>としても alice のページへは飛べないであろう。
筆者は過度な持続的接続は好まない。メモリの無駄使いになるからである。1つのページを表示するに必要なファイルが転送されれば接続を切って欲しい。しかしサーバは HTML ファイルを解析してクライアントに転送する訳ではないので、切断のタイミングの採り方は実際上クライアントに任せられる。そして、ひたすら接続を維持するクライアントが存在する(IE6.0 など)。
Pegasus においては持続的接続をサーバ側で断ち切るタイミングを捕らえる事が必要である。何故なら Pegasus のような特殊なサーバが存在することをクライアントは知らない。
http://ar.aichi-u.ac.jp/~aliceは
http://ar.aichi-u.ac.jp/と接続を共有していても構わないとクライアントは判断するであろう。
Pegasus は持続的接続に対して次のルールを採用する。