⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jk_isapi_plugin.c

📁 Tomcat 4.1与WebServer集成组件的源代码包.
💻 C
📖 第 1 页 / 共 4 页
字号:
        }        if(get_registry_config_parameter(hkey,                                         EXTENSION_URI_TAG,                                         tmpbuf,                                         sizeof(extension_uri))) {            strcpy(extension_uri, tmpbuf);        } else {            ok = JK_FALSE;        }        if(get_registry_config_parameter(hkey,                                         JK_WORKER_FILE_TAG,                                         tmpbuf,                                         sizeof(worker_file))) {            strcpy(worker_file, tmpbuf);        } else {            ok = JK_FALSE;        }        if(get_registry_config_parameter(hkey,                                         JK_MOUNT_FILE_TAG,                                         tmpbuf,                                         sizeof(worker_mount_file))) {            strcpy(worker_mount_file, tmpbuf);        } else {            ok = JK_FALSE;        }        if(get_registry_config_parameter(hkey,                                         URI_SELECT_TAG,                                          tmpbuf,                                         sizeof(tmpbuf))) {            int opt = parse_uri_select(tmpbuf);            if (opt >= 0) {                uri_select_option = opt;            } else {                ok = JK_FALSE;            }        }        RegCloseKey(hkey);    }        return ok;} static int get_registry_config_parameter(HKEY hkey,                                         const char *tag,                                          char *b,                                         DWORD sz){       DWORD type = 0;    LONG  lrc;    lrc = RegQueryValueEx(hkey,                               tag,                                (LPDWORD)0,                          &type,                              (LPBYTE)b,                          &sz);     if ((ERROR_SUCCESS != lrc) || (type != REG_SZ)) {        return JK_FALSE;            }        b[sz] = '\0';    return JK_TRUE;     }static int init_ws_service(isapi_private_data_t *private_data,                           jk_ws_service_t *s,                           char **worker_name) {    char huge_buf[16 * 1024]; /* should be enough for all */    DWORD huge_buf_sz;    s->jvm_route = NULL;    s->start_response = start_response;    s->read = read;    s->write = write;    GET_SERVER_VARIABLE_VALUE(HTTP_WORKER_HEADER_NAME, (*worker_name));               GET_SERVER_VARIABLE_VALUE(HTTP_URI_HEADER_NAME, s->req_uri);         GET_SERVER_VARIABLE_VALUE(HTTP_QUERY_HEADER_NAME, s->query_string);         if (s->req_uri == NULL) {        s->query_string = private_data->lpEcb->lpszQueryString;        *worker_name    = DEFAULT_WORKER_NAME;        GET_SERVER_VARIABLE_VALUE("URL", s->req_uri);               if (unescape_url(s->req_uri) < 0)            return JK_FALSE;        getparents(s->req_uri);    }        GET_SERVER_VARIABLE_VALUE("AUTH_TYPE", s->auth_type);    GET_SERVER_VARIABLE_VALUE("REMOTE_USER", s->remote_user);    GET_SERVER_VARIABLE_VALUE("SERVER_PROTOCOL", s->protocol);    GET_SERVER_VARIABLE_VALUE("REMOTE_HOST", s->remote_host);    GET_SERVER_VARIABLE_VALUE("REMOTE_ADDR", s->remote_addr);    GET_SERVER_VARIABLE_VALUE(SERVER_NAME, s->server_name);    GET_SERVER_VARIABLE_VALUE_INT("SERVER_PORT", s->server_port, 80)    GET_SERVER_VARIABLE_VALUE(SERVER_SOFTWARE, s->server_software);    GET_SERVER_VARIABLE_VALUE_INT("SERVER_PORT_SECURE", s->is_ssl, 0);    s->method           = private_data->lpEcb->lpszMethod;    s->content_length   = private_data->lpEcb->cbTotalBytes;    s->ssl_cert     = NULL;    s->ssl_cert_len = 0;    s->ssl_cipher   = NULL;    s->ssl_session  = NULL;	s->ssl_key_size = -1;    s->headers_names    = NULL;    s->headers_values   = NULL;    s->num_headers      = 0;        /*     * Add SSL IIS environment     */    if (s->is_ssl) {                 char *ssl_env_names[9] = {            "CERT_ISSUER",             "CERT_SUBJECT",             "CERT_COOKIE",             "HTTPS_SERVER_SUBJECT",             "CERT_FLAGS",             "HTTPS_SECRETKEYSIZE",             "CERT_SERIALNUMBER",             "HTTPS_SERVER_ISSUER",             "HTTPS_KEYSIZE"        };        char *ssl_env_values[9] = {            NULL,             NULL,             NULL,             NULL,             NULL,             NULL,             NULL,             NULL,             NULL        };        unsigned i;        unsigned num_of_vars = 0;        for(i = 0 ; i < 9 ; i++) {            GET_SERVER_VARIABLE_VALUE(ssl_env_names[i], ssl_env_values[i]);            if (ssl_env_values[i]) {                num_of_vars++;            }        }        if (num_of_vars) {            unsigned j;            s->attributes_names =                 jk_pool_alloc(&private_data->p, num_of_vars * sizeof(char *));            s->attributes_values =                 jk_pool_alloc(&private_data->p, num_of_vars * sizeof(char *));            j = 0;            for(i = 0 ; i < 9 ; i++) {                                if (ssl_env_values[i]) {                    s->attributes_names[j] = ssl_env_names[i];                    s->attributes_values[j] = ssl_env_values[i];                    j++;                }            }            s->num_attributes = num_of_vars; 			if (ssl_env_values[4] && ssl_env_values[4][0] == '1') {				CERT_CONTEXT_EX cc;				DWORD cc_sz = sizeof(cc);				cc.cbAllocated = sizeof(huge_buf);				cc.CertContext.pbCertEncoded = (BYTE*) huge_buf;				cc.CertContext.cbCertEncoded = 0;				if (private_data->lpEcb->ServerSupportFunction(private_data->lpEcb->ConnID,											 (DWORD)HSE_REQ_GET_CERT_INFO_EX,                               											 (LPVOID)&cc,NULL,NULL) != FALSE)				{					jk_log(logger, JK_LOG_DEBUG,"Client Certificate encoding:%d sz:%d flags:%ld\n",								cc.CertContext.dwCertEncodingType & X509_ASN_ENCODING ,								cc.CertContext.cbCertEncoded,								cc.dwCertificateFlags);                    s->ssl_cert=jk_pool_alloc(&private_data->p,                                base64_encode_cert_len(cc.CertContext.cbCertEncoded));                    s->ssl_cert_len = base64_encode_cert(s->ssl_cert,                                huge_buf,cc.CertContext.cbCertEncoded) - 1;				}			}        }    }    huge_buf_sz = sizeof(huge_buf);             if (get_server_value(private_data->lpEcb,                        "ALL_HTTP",                                     huge_buf,                                   huge_buf_sz,                                "")) {                      unsigned cnt = 0;        char *tmp;        for(tmp = huge_buf ; *tmp ; tmp++) {            if (*tmp == '\n'){                cnt++;            }        }        if (cnt) {            char *headers_buf = jk_pool_strdup(&private_data->p, huge_buf);            unsigned i;            unsigned len_of_http_prefix = strlen("HTTP_");            BOOL need_content_length_header = (s->content_length == 0);                        cnt -= 2; /* For our two special headers */            /* allocate an extra header slot in case we need to add a content-length header */            s->headers_names  = jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *));            s->headers_values = jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *));            if (!s->headers_names || !s->headers_values || !headers_buf) {                return JK_FALSE;            }            for(i = 0, tmp = headers_buf ; *tmp && i < cnt ; ) {                int real_header = JK_TRUE;                /* Skipp the HTTP_ prefix to the beginning of th header name */                tmp += len_of_http_prefix;                if (!strnicmp(tmp, URI_HEADER_NAME, strlen(URI_HEADER_NAME)) ||                   !strnicmp(tmp, WORKER_HEADER_NAME, strlen(WORKER_HEADER_NAME))) {                    real_header = JK_FALSE;                } else if(need_content_length_header &&                   !strnicmp(tmp, CONTENT_LENGTH, strlen(CONTENT_LENGTH))) {                    need_content_length_header = FALSE;                    s->headers_names[i]  = tmp;                } else if (!strnicmp(tmp, TOMCAT_TRANSLATE_HEADER_NAME,                                          strlen(TOMCAT_TRANSLATE_HEADER_NAME))) {                    tmp += 6; /* TOMCAT */                    s->headers_names[i]  = tmp;                } else {                    s->headers_names[i]  = tmp;                }                while(':' != *tmp && *tmp) {                    if ('_' == *tmp) {                        *tmp = '-';                    } else {                        *tmp = tolower(*tmp);                    }                    tmp++;                }                *tmp = '\0';                tmp++;                /* Skip all the WS chars after the ':' to the beginning of th header value */                while(' ' == *tmp || '\t' == *tmp || '\v' == *tmp) {                    tmp++;                }                if (real_header) {                    s->headers_values[i]  = tmp;                }                                while(*tmp != '\n' && *tmp != '\r') {                    tmp++;                }                *tmp = '\0';                tmp++;                /* skipp CR LF */                while(*tmp == '\n' || *tmp == '\r') {                    tmp++;                }                if (real_header) {                    i++;                }            }            /* Add a content-length = 0 header if needed.             * Ajp13 assumes an absent content-length header means an unknown,             * but non-zero length body.             */            if(need_content_length_header) {                s->headers_names[cnt] = "content-length";                s->headers_values[cnt] = "0";                cnt++;            }            s->num_headers = cnt;        } else {            /* We must have our two headers */            return JK_FALSE;        }    } else {        return JK_FALSE;    }        return JK_TRUE;}static int get_server_value(LPEXTENSION_CONTROL_BLOCK lpEcb,                            char *name,                            char  *buf,                            DWORD bufsz,                            char  *def_val){    if (!lpEcb->GetServerVariable(lpEcb->ConnID,                                  name,                                 buf,                                 (LPDWORD)&bufsz)) {        strcpy(buf, def_val);        return JK_FALSE;    }    if (bufsz > 0) {        buf[bufsz - 1] = '\0';    }    return JK_TRUE;}static const char begin_cert [] = 	"-----BEGIN CERTIFICATE-----\r\n";static const char end_cert [] = 	"-----END CERTIFICATE-----\r\n";static const char basis_64[] =    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";static int base64_encode_cert_len(int len){	int n = ((len + 2) / 3 * 4) + 1; // base64 encoded size	n += (n + 63 / 64) * 2; // add CRLF's	n += sizeof(begin_cert) + sizeof(end_cert) - 2;  // add enclosing strings.    return n;}static int base64_encode_cert(char *encoded,                              const unsigned char *string, int len){    int i,c;    char *p;	const char *t;    p = encoded;	t = begin_cert;	while (*t != '\0')		*p++ = *t++;    c = 0;    for (i = 0; i < len - 2; i += 3) {        *p++ = basis_64[(string[i] >> 2) & 0x3F];        *p++ = basis_64[((string[i] & 0x3) << 4) |                        ((int) (string[i + 1] & 0xF0) >> 4)];        *p++ = basis_64[((string[i + 1] & 0xF) << 2) |                        ((int) (string[i + 2] & 0xC0) >> 6)];        *p++ = basis_64[string[i + 2] & 0x3F];        c += 4;        if ( c >= 64 ) {            *p++ = '\r';            *p++ = '\n';            c = 0;		}    }    if (i < len) {        *p++ = basis_64[(string[i] >> 2) & 0x3F];        if (i == (len - 1)) {            *p++ = basis_64[((string[i] & 0x3) << 4)];            *p++ = '=';        }        else {            *p++ = basis_64[((string[i] & 0x3) << 4) |                            ((int) (string[i + 1] & 0xF0) >> 4)];            *p++ = basis_64[((string[i + 1] & 0xF) << 2)];        }        *p++ = '=';        c++;    }    if ( c != 0 ) {        *p++ = '\r';        *p++ = '\n';    }	t = end_cert;	while (*t != '\0')		*p++ = *t++;    *p++ = '\0';    return p - encoded;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -