nntpProxy v1.3.0以降は、対応ニュースリーダがフィルタ状況を把握し、 XOVERのフィルタリングに起因するタイムアウトが発生しないよう、拡張 プロトコルを実装しています。
この文書は、nntpProxy経由での接続方法と、拡張プロトコルに関する仕
様を公開するものです。
なお、この仕様書はNNTP(NetNews Transfer Protocol , RFC977を参照)お
よびXOVER、AUTHINFO等のRFCに記述がないが一般的に使用されている拡張
コマンドについて最低限の知識がある開発者を対象としています。
nntpProxy経由での接続方法
nntpProxyは、自身を経由して接続するクライアントに、AUTHINFOコマン
ドによる認証を要求します。
クライアントは、nntpProxy経由で接続したいサーバのアドレスおよびポー ト番号、必要ならばユーザIDとパスワードを用いて、認証します。
その書式と認証の手順は
|
のように、一般的に使われているAUTHINFOコマンドを使用したものです。
異なる点は、本来ユーザ認証を必要としないサーバでも、サーバアドレ スの指定のために、AUTHINFOコマンドによる認証を行わなければならな い点です。
また、ユーザ認証を必要とするサーバに接続する場合は、「AUTHINFO USER」
コマンドにおいて、サーバアドレスの直前に「ユーザID@」を挿入し、
「AUTHINFO PASS」コマンドに、本来のパスワードを渡します。
nntpProxyは、必要ならばユーザ認証をクライアントに代わって行い、認証
後の結果を「AUTHINFO PASS」コマンドの結果として返します。
nntpProxyは、「AUTHINFO PASS」コマンドが送信された時点で初めてリクエ
ストされたサーバに接続を試みます。
サーバへの接続に失敗した場合は、「AUTHINFO PASS」コマンドの失敗とい
う形でクライアントに応答します。
この手順で認証を行い、成功すればサーバへの接続も成功したことになります。
nntpProxy拡張プロトコル先に述べた手順で接続を確立した場合、XOVERコマンドがフィルタされる点、 nntproxy.filteredというローカルグループが増える点を除けば通常の接続と同じです。
しかし、XOVERのフィルタリングは、しばしばクライアント側をタイムアウト
させる原因になります。
たとえば、100通の記事があり1通目と100通目以外はすべてnntpProxyによっ
てフィルタされたとしましょう。すると、クライアント側からは、たった2
通の記事の取り寄せに100通の記事を取り寄せる時間がかかっていることにな
ります。
これは極端な例ですが、フィルタ対象(多くの場合SPAM)が多いグループを
ユーザが購読している場合は、これに近い現象が発生する場合がままあります。
nntpProxyは、このフィルタによるタイムアウトを防止するために、拡張モー
ドを用意しています。
拡張モードに切り替えるためには、MODEコマンドを利用します。
|
もしユーザがnntpProxy v1.3.0より古いバージョンを使用している場合は、 この拡張プロトコルに対応していないので、エラーコード「500」が返されます。
拡張モードに切り替わると、XOVERコマンドを発行した場合のレスポンスが
変更され、通常のXOVERデータに混じって「filtered」という行が含まれてきます。
これは記事がnntpProxyによってフィルタリングされたことを示し、フィルタ
された記事の位置にフィルタされた数だけ「filtered」行が返されます。
すなわち、行数という観点からのみ見た場合、本来返されるXOVERの行数と
フィルタ後の行数は一致することになります。
対応クライアントは、filtered行を受け取ったら無視しなければなりません。
これにより、クライアントはサーバから実際に受け取った記事数とそのタイ
ミングを把握でき、フィルタによるタイムアウトを防止できます。
nntpProxyは、フィルタ対象になった記事を「nntpproxy.filtered」という
ローカルグループに移動します。
クライアントからは見かけ上、サーバに上記グループが存在するように見え
ますが、実際はnntpProxyがフィルタした記事の一覧を元に、架空のグルー
プとして再構成しているだけです。
クライアントからこのローカルグループ上の記事に対するリクエストを
受け取ると、nntpProxyはMessage-IDを利用してサーバに要求をし
ます。
現在わかっている問題点は、Message-IDでの記事取得を制限しているサー
バが少数ながら存在し、それらのサーバではローカルグループでの記事の
取得ができないことです。
なお、ローカルグループへの記事の返信は、通常と同じ手順、すなわち