障害情報・長文をWebブラウザから書き込む時に種類不定のエラーになる場合があるにて報告した障害の内容の詳細と対応について説明します。
この問題に対処したバージョン4.05.0を緊急リリースしました(ダウンロードページ)。りすと亭サーバ管理者は、このバージョンにバージョンアップすることを推奨します。
問題の概要 §
Webブラウザから長文を書き込もうとしたとき、書き込む内容の確認ページに進んだ時点で何らかのエラーメッセージが表示されます。(他のページでも、ボタンを押して大量のデータを送信した時点で発生する可能性があり得ます)
表示されるエラーメッセージの一例としては、以下のようなものがあります。
エラーメッセージの例1: §
インターネットサイト……を開けません。
サーバへの接続はリセットされま。
エラーメッセージの例2: §
サーバーが見つからないか、または DNS エラーです。
ページを表示できません
再現手順 §
この手順で再現する場合としない場合があります。主にタイミングに関連するので、同じ条件なら常に発生する訳ではありません。
まず、りすと亭へWebブラウザでアクセスし、書き込み権限を持つリスト板のページを表示させます。新規スレッド作成のリンクをクリックし、認証が要求された場合は認証します。本文に長めのテキストを入力します。(テストではシフトJIS表記で5457バイトのテキストデータを使用)
「メッセージ確認へ進む」ボタンをクリックします。
確認ページが表示されず、何らかのエラーメッセージが表示されます。
回避方法 §
りすと亭4.05.0以降のバージョンにバージョンアップして下さい。
参考情報: Microsoft Internet Explorer 6.0については、Extra CRLF Character Is Added to a POST Request That Is Sent to an HTTP 1.1 Serverに記述された対象方法によって解決できる場合もあるようです。
原因と対策 §
原因は、RFC 2068に以下のように書かれている問題に対する対策コードが不十分であったためと思われます。
Note: certain buggy HTTP/1.0 client implementations generate an
extra CRLF's after a POST request. To restate what is explicitly
forbidden by the BNF, an HTTP/1.1 client must not preface or follow
a request with an extra CRLF.
この問題は、HTTPのPOSTリクエストで、本来不必要である改行(CRLF)が送信されてしまうクライアントが存在することを示しています。
これに対応するために、りすと亭では、本来のデータのあとで受信する不必要なデータを読み飛ばす仕組みを持っていました。しかし、この仕組みが動作した後で不必要なデータが届いた場合、それらは読み込まれることなく通信が閉じられることになり、そこでクライアントは致命的な通信エラーが発生したと判断し、エラーメッセージを表示します。
このような問題に対処するために、2つの修正を行いました。
- 不必要なデータを読み飛ばす仕組みを発動するタイミングを、必要なデータの受信直後から通信を閉じる直前に移動させる (POSTリクエスト時のみの動作に変更)
- POSTリクエストの場合のみ、できるだけ確実に不必要なデータを受け取る時間を確保するために、0.5秒の待ち時間を付け加る
これらの修正により、たいていのケースではこの問題を解決できると思われます。しかし、閉じる直前の僅かな時間に不必要なデータが届くような状況が発生した場合は、同様のエラーが発生する可能性があり得ます。このような状況が発生する可能性は極めて低いものと考えます。