WOCGICopyHTTPHeaders
2007/03/30 (Fri) 22:07:46 JST
while (envp && *envp) {
char *key, *value;
/* 環境変数行をコピー */
key = WOSTRDUP(*envp);
for (value = key; *value &&
!isspace((int)*value) &&
(*value != '='); value++) {}
if (*value) {
*value++ = '?0'; /* null terminate 'key' */
}
while (*value && (isspace((int)*value) || (*value == '='))) {
value++;
}
/* クライアント証明書の確認を開始 */
if (strcmp((const char *)key, "SSL_CLIENT_CERTIFICATE") == 0 ||
strcmp((const char *)key, "SSL_SERVER_CERTIFICATE") == 0 ) {
value = 0;
WOLog(WO_INFO," DROPPING ENV VAR (DUPLICATE) = %s", key);
}
if (strcmp((const char *)key, "SSL_CLIENT_CERT") == 0 ||
strcmp((const char *)key, "SSL_SERVER_CERT") == 0) {
value = make_cert_one_line(value);
//WOLog(WO_INFO," PASSING %s = %s", key, value);
}
/* クライアント証明書の確認を終了 */
if (key && *key && value && *value) {
/* キーと値を指定してコピーする */
/* バッファ中のキーと値が鍵交換によって置換される可能性がある */
req_addHeader(req, key, value, STR_COPYKEY|STR_COPYVALUE);
}
/* クライアント証明書の確認を開始 */
if (freeValueNeeded) {
free(value);
freeValueNeeded=0;
}
/* クライアント証明書の確認を終了 */
WOFREE(key);
envp++; /* next env variable */
}
アプリケーションに渡すため、環境変数にあるすべてのヘッダをコピーします。 途中いくつかマクロや関数があるので、そこだけチェックしましょう。
WOSTRDUP, WOFREEアダプタには、メモリリークをチェックするためのマクロが定義されています。 デフォルトではメモリリークをチェックするフラグは無効になっていて、それぞれstrdup(), free()となります。 フラグを有効にしても、機能的には同じです。
char *make_cert_one_line(char *value) {
char *returnValue = (char *)NULL;
int i;
int j;
if (value) {
returnValue = strdup(value);
freeValueNeeded=1;
for (j=0, i = 0; i < strlen(value);i++) {
if (value[i] != '?n') {
returnValue[j]= value[i];
j++;
}
}
returnValue[j] = '?0'; // and NULL-terminate
}
return returnValue;
}
BASE64のデータを取り出すため、改行、スペース、タブを除いて文字列をコピーします。 しかし、実際の実装では改行を除いて文字列をコピーするだけです。 コメントには "this will do for now..." とありますが、まあCGIアダプタなんて誰も使わないからいいや、ってことでしょう。
req_addHeader()
req_addHeader() (request.c)
void req_addHeader(HTTPRequest *req,
const char *key,
const char *value,
int flags)
{
const char *hdrkey;
hdrkey = req_AddHeader_common(req, key, value);
st_add((strtbl *)req->headers, hdrkey, value, flags);
return;
}
Inverse Pages: WOCGIAdaptor