[an error occurred while processing this directive] [APACHE DOCUMENTATION]

Reading Client Input in Apache 1.2


Apache 1.1と初期版はそれ自身によってモジュールにPOSTとPUTの要求をハンドルさせます。モジュールはそれ自身で、要求が存在したかどうか、それは何バイトか、を決定して、それからデータを得るために機能(read_client_block)を呼び出します。

しかしながら、このモジュールに適合しないPOSTとPUTの要求ハンドラーのいくつかをHTTP/1.1は要求して、全ての存在するモジュールは書き換えられます。これをハンドルすることを要求しているAPIはさらに要約され、古いものとの互換性を残す一方、将来のHTTPプロトコルの変更を行なうことができます。


The New API Functions

   int setup_client_block (request_rec *, int read_policy);
   int should_client_block (request_rec *);
   long get_client_block (request_rec *, char *buffer, int buffer_size);
  1. 要求ハンドラーを始める頃にはsetup_client_block()を呼び出します。これは必要な全てのプロパティをセットアップして、OKかエラーコードをリターンします。もし後者なら、モジュールはそのエラーコードをリターンすべきです。二番目のパラメータは、もし要求メッセージがボディを指し示していれば方策を選択し、どのようにしてチャンクになった転送コーディングが解釈されるべきかを選択します。一つ選ぶと
        REQUEST_NO_BODY          メッセージがなんらかのボディを持っていれば413エラーを送信します
        REQUEST_CHUNKED_ERROR    もしコンテント長のないボディなら411エラーを送信します
        REQUEST_CHUNKED_DECHUNK  チャンクになっていれば、それを引き離します
        REQUEST_CHUNKED_PASS     引き離さないでチャンクをパスします
    
    最後の二つのオプションを使うために、callerはなんらかの拡張を含むチャンクサイズの行を維持するのに十分な大きさのバファーを供給しなければなりません。
  2. 入力を受け入れることが既に可能な時、should_client_block()を呼び出して下さい。これは入力を読めるかどうかをモジュールに教えるでしょう。もしそれが0なら、モジュールは入力は存在しないタイプ(例えばGET request)であると仮定するでしょう。ゼロでないレスポンスはモジュールが処理すべきである(to step 3)ことを指し示しています。このステップはまた、HTTP/1.1クライアントに対して100の持続するレスポンスを送信して、モジュールがコンテントを読み込む準備が明らかにできるまで呼び出すべきではありません(そうでなければ、100のレスポンスのポイントは失敗します)。この機能を一度以上呼び出すことは決してありません。
  3. 最後に、ループにget_client_blockを呼び出して、それをバファーとそのサイズにパスさせます。それはデータをバファーに置き換えて(フルバファーは必要ではなく、チャンクされた入力の場合です)、入力ブロックの長さをリターンします。読み込みが行われる時、もしEOFなら0をリターンし、エラーがあれば-1をリターンするでしょう。

例としてmod_cgi.cにあるコードを参照してください。これは新しいAPIの概要について適切に書かれています。


Index Home