CGIアダプタ:データ構造
2007/03/30 (Fri) 22:07:46 JST
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のエラーを表す列挙体です。
Inverse Pages: WOCGIAdaptor