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