Logo address

技術ノート

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 のドキュメントルートとする。 この下で URI 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 のページへは飛べないであろう。

持続的接続を何時断ち切るか?

HTTP/1.1 では接続は原則として持続的に行う。そしてクライアントとサーバの何れかが 接続を閉じる要求を出せば(あるいは閉じてしまえば)持続的接続は終了する。 筆者は過度な持続的接続は好まない。メモリの無駄使いになるからである。 1つのページを表示するに必要なファイルが転送されれば接続を切って欲しい。 しかしサーバは HTML ファイルを解析してクライアントに転送する訳ではないので、 切断のタイミングの採り方は実際上クライアントに任せられる。 そして、ひたすら接続を維持するクライアントが存在する(IE6.0 など)。 Pegasus においては持続的接続をサーバ側で断ち切るタイミングを捕らえる事が必要である。 何故なら Pegasus のような特殊なサーバが存在することをクライアントは知らない。 http://ar.aichi-u.ac.jp/~alice は http://ar.aichi-u.ac.jp/ と接続を共有していても構わないとクライアントは判断するであろう。 Pegasus/1.0a では持続的接続に対して次のルールを採用する。 ・URI の中のホスト名とユーザ名が継続する場合には接続を維持する ・継続しない場合にはクライアントに再接続を要求し、接続を閉じる