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