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