Edit Diff Annotate History
Upload
List
Recent
Alias
Top
Help
CGIアダプタ:データ構造 : Edit
Last updated: Fri Mar 30 22:07:46 +0900 2007
HTTPRequest *req; /* HTTPリクエスト */ HTTPResponse *resp = NULL; /* HTTPレスポンス*/ WOURLComponents wc = WOURLComponents_Initializer; /* URLの各要素 */ const char *qs; /* クエリ文字列。QUERY_STRING */ unsigned int qs_len; /* クエリ文字列の長さ */ char *url; /* URL */ const char *script_name; /* スクリプト名。SCRIPT_NAME */ const char *path_info; /* パス情報。PATH_INFO */ const char *config_url; /* Webサーバアダプタ設定用URL */ const char *username; /* ユーザ名 */ const char *password; /* パスワード */ const char *config_options; /* 設定オプション */ const char *reqerr; /* エラーメッセージ */ WOURLError urlerr; /* URLエラー */ strtbl *options = NULL; /* 設定オプション */ ここで使われる構造体はアダプタ全体で使われるので、特に重要なものを最初にざっとおさえておきます。 !struct HTTPRequest HTTPRequest (request.h) typedef struct _HTTPRequest { RequestMethod method; /* get/put/post/... */ char *request_str; /* HTTPリクエスト(CRLFを含む) */ void *headers; /* (strtbl *) 気にする必要なし */ void *api_handle; /* APIハンドラ */ unsigned content_length; void *content; unsigned content_buffer_size; req_getMoreContentCallback getMoreContent; /* 関数ポインタ */ int haveReadStreamedData; #ifdef IIS /* for IIS we have to keep track of how much we have read */ int total_len_read; #endif } HTTPRequest; HTTPリクエストを扱うための構造体です。 どのアダプタでも共通して使われます。 ところで、Webサーバごとに使われるデータ構造はまず異なるはずです。 Webサーバ依存のデータは api_handle と req_getMoreContentCallback に入れておきます。 これをアダプタごとにカスタマイズして使います。 !!api_handle Webサーバで使われるデータへのポインタが入ります。 例えばApacheアダプタなら、ここにApacheのハンドラに渡される引数、request_rec * 型のポインタをセットします。 ただし、CGIアダプタでは使いません。 !!req_getMoreContentCallback req_getMoreContentCallback (request.h) typedef int (*req_getMoreContentCallback)(void *handle, void *buffer, int bufferSize, int mustFill); HTTPコンテントデータを取得する関数へのポインタです。 CGIアダプタでは readContentData() へのポインタがセットされます。 !!RequestMethod RequestMethod (request.h) typedef enum { HTTP_NO_METHOD = -2, HTTP_UNKNOWN_METHOD, HTTP_GET_METHOD, HTTP_POST_METHOD, HTTP_HEAD_METHOD, HTTP_PUT_METHOD, } RequestMethod; HTTPメソッドです。 これもCGIアダプタでは使いません。 !!struct HTTPResponse HTTPResponse (response.h) typedef struct _HTTPResponse { unsigned status; char *statusMsg; struct _strtbl *headers; int flags; /* レスポンスで使うデータを含むStringの配列 */ /* レスポンスと一緒に解放される */ String *responseStrings; void *content; unsigned content_length; unsigned content_buffer_size; unsigned content_read; /* インスタンスから取得したデータの総サイズ */ unsigned content_valid; /* 有効なコンテントデータのサイズ */ int (*getMoreContent)(struct _HTTPResponse *resp, void *buffer, int bufferSize); WOConnection *instanceConnection; WOInstanceHandle instHandle; int keepConnection; } HTTPResponse; こちらはHTTPレスポンスを扱うための構造体です。 HTTPRequestと同じ関数ポインタの getMoreContent がありますが、CGIアダプタ以外でも、どうも使われている様子がありません。 無視しても大丈夫でしょう。 !WOURLError WOURLError (WOURLCUtilities.h) typedef enum { WOURLOK = 0, WOURLInvalidPrefix = 1, WOURLInvalidWebObjectsVersion = 2, WOURLInvalidApplicationName = 3, WOURLInvalidApplicationNumber = 4, WOURLInvalidRequestHandlerKey = 5, WOURLInvalidRequestHandlerPath = 6, WOURLInvalidApplicationHost, WOURLInvalidPageName, WOURLInvalidSessionID, WOURLInvalidContextID, WOURLInvalidSenderID, WOURLInvalidQueryString, WOURLInvalidSuffix, WOURLInvalidPostData, WOURLNoPostData } WOURLError; URLのエラーを表す列挙体です。