0件のコメントはじめに今回の記事はこの記事の続きです。mod_proxyのソースコードリーディングをしてみます。mod_proxyはリクエストを振り分けるリバースプロキシだけでなく、フォワードプロキシとしても動かすことができます。mod_xxxとあるのがプラグイン群です。mod_proxyのイベントハンドラから見てみます。ハンドラはどのプラグインでも必須になります。0;}SUBREQUEST_FUNCエントリから見ていきます。このフックエントリはReadPostが終了した時に呼ばれます。...}hctxというのは接続先のファイルディスクリプタや状態、バッファへのポインタを管理している構造体です。handler_ctx;リクエストが完了した時にmod_proxy_check_extensionが呼ばれhandler_ctxを初期化しています。hctx;}話を戻しますが、SUBREQUEST_FUNCエントリの中でproxy_write_requestを呼んでいます。socket関数でソケットを作成しています。次にhctx構造体の状態を管理するstateで分岐します。初期状態はPROXY_STATE_INITなのでこの分岐に入り、proxy_establish_connectionを呼んでいます。sockaddr構造体にポートやアドレスを設定しproxy接続先のアドレスに接続しにいきます。場合は接続中ということでPROXY_STATE_CONNECTに遷移します。PROXY_STATE_PREPARE_WRITE);break;}connectで成功していればhctxのstateはPROXY_STATE_PREPARE_WRITEに遷移します。呼ばれHTTPヘッダを作成しています。"http");続いてPOST時はmessage-bodyが一定サイズ以上は一時ファイル、それ以外はメモリに格納しています。con->request_content_queueでmessage-bodyを見てhctx->wb->bytes_inに入れています。PROXY_STATE_WRITEです。繋がりますが、ここでsrv->network_backend_writeを呼んでいます。MAX_WRITE_LIMIT);chunkqueue_remove_finished_chunks(hctx->wb);これが,write/kqueueなどmake時に決定したプラットフォームに合ったシステムコールでhctx->fdに書き込みを行います。linux2.6以降ならwritevを使うことができます。この後、PROXY_STATE_READに遷移します。HANDLER_WAIT_FOR_EVENT;}続いて、PROXY_STATE_INITに戻ります。hctx)で接続しているhostServerを登録することで何かイベントを検出したときに通知が来ます。*ctxにはhandler_ctxが入っているので、これがFDEVENT_INかFDEVENT_OUTかによって分岐します。次にproxy_demux_responseに処理が移り,readでhostServerからptrを読み込んでいます。{ioctlでhostServerのバッファバイト数を読み取ります。-1;}バッファバイトがある場合にreadでhostServerからレスポンスを読み取ります。-1;}readで読みこんだhostServerのレスポンスをparseします。FDEVENT_OUTの結果、writeで接続元にレスポンスを返す処理に入ります。hostServerのレスポンスを接続元に返すためにメモリに格納します。hctx->response->used);http_chunk_append_memはhttp_chunk.cで宣言されています。len)でデータをセットしています。最後に接続がサーバ内でリセットされた場合にはconnection_reset、接続がクライアントに切られた場合にはhandle_connection_closeで共に、mod_proxy_connection_close_callbackが呼ばれます。ここでfdevent_event_del,fdevent_unregisterが行われfdeventを消去し,handler_ctx_freeで接続先のために確保したメモリを解放しています。以上が一連の流れです。lighttpd.confの設定取得lighttpd.confの設定を掴んでいるのはSUBREQUEST_FUNC,mod_proxy_check_extensionです。ここで、mod_proxy_patch_connection関数を呼び設定を取得しています。p->config_storage[0];buffer_is_equal_stringでkeyとproxy.serverなどのchar比較をしてplugin_dataに取得した設定を入れています。s->x;特徴のある設計なので掴むまで時間がかかりました。Elmastudio。