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

📄 jk_isapi_plugin.c

📁 Tomcat 4.1与WebServer集成组件的源代码包.
💻 C
📖 第 1 页 / 共 4 页
字号:
                                "<HTML><BODY><H1>Request contains too many characters that need to be encoded.</H1></BODY></HTML>");                        return SF_STATUS_REQ_FINISHED;                    }                    jk_log(logger, JK_LOG_DEBUG,                            "HttpFilterProc fowarding escaped URI [%s]\n",snuri);                    forwardURI = snuri;                } else {                    forwardURI = uri;                }                if(!AddHeader(pfc, URI_HEADER_NAME, forwardURI) ||                    ( (query != NULL && strlen(query) > 0)                           ? !AddHeader(pfc, QUERY_HEADER_NAME, query) : FALSE ) ||                    !AddHeader(pfc, WORKER_HEADER_NAME, worker) ||                   !SetHeader(pfc, "url", extension_uri)) {                    jk_log(logger, JK_LOG_ERROR,                            "HttpFilterProc error while adding request headers\n");                    return SF_STATUS_REQ_ERROR;                }				                /* Move Translate: header to a temporary header so                 * that the extension proc will be called.                 * This allows the servlet to handle 'Translate: f'.                 */                if(GetHeader(pfc, "Translate:", (LPVOID)Translate, (LPDWORD)&szTranslate) &&                    Translate != NULL && szTranslate > 0) {                    if (!AddHeader(pfc, TOMCAT_TRANSLATE_HEADER_NAME, Translate)) {                        jk_log(logger, JK_LOG_ERROR,                           "HttpFilterProc error while adding Tomcat-Translate headers\n");                        return SF_STATUS_REQ_ERROR;                    }                SetHeader(pfc, "Translate:", NULL);                }            } else {                jk_log(logger, JK_LOG_DEBUG,                        "HttpFilterProc [%s] is not a servlet url\n",                        uri);            }            /*             * Check if somebody is feading us with his own TOMCAT data headers.             * We reject such postings !             */            jk_log(logger, JK_LOG_DEBUG,                    "HttpFilterProc check if [%s] is points to the web-inf directory\n",                    uri);            if(uri_is_web_inf(uri)) {                jk_log(logger, JK_LOG_EMERG,                        "HttpFilterProc [%s] points to the web-inf or meta-inf directory.\nSomebody try to hack into the site!!!\n",                        uri);                write_error_response(pfc,"403 Forbidden",                        "<HTML><BODY><H1>Access is Forbidden</H1></BODY></HTML>");                return SF_STATUS_REQ_FINISHED;            }        }    }    return SF_STATUS_REQ_NEXT_NOTIFICATION;}BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO  *pVer){    pVer->dwExtensionVersion = MAKELONG( HSE_VERSION_MINOR,                                         HSE_VERSION_MAJOR );    strcpy(pVer->lpszExtensionDesc, VERSION_STRING);    if (!is_inited) {        return initialize_extension();    }    return TRUE;}DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK  lpEcb){       DWORD rc = HSE_STATUS_ERROR;    lpEcb->dwHttpStatusCode = HTTP_STATUS_SERVER_ERROR;    jk_log(logger, JK_LOG_DEBUG,            "HttpExtensionProc started\n");	/* Initialise jk */	if (is_inited && !is_mapread) {		char serverName[MAX_SERVERNAME];		DWORD dwLen = sizeof(serverName);		if (lpEcb->GetServerVariable(lpEcb->ConnID, SERVER_NAME, serverName, &dwLen)){			if (dwLen > 0) serverName[dwLen-1] = '\0';			if (init_jk(serverName))				is_mapread = JK_TRUE;		}		if (!is_mapread)			is_inited = JK_FALSE;	}	if (is_inited) {        isapi_private_data_t private_data;        jk_ws_service_t s;        jk_pool_atom_t buf[SMALL_POOL_SIZE];        char *worker_name;        jk_init_ws_service(&s);        jk_open_pool(&private_data.p, buf, sizeof(buf));        private_data.request_started = JK_FALSE;        private_data.bytes_read_so_far = 0;        private_data.lpEcb = lpEcb;        s.ws_private = &private_data;        s.pool = &private_data.p;        if (init_ws_service(&private_data, &s, &worker_name)) {            jk_worker_t *worker = wc_get_worker_for_name(worker_name, logger);            jk_log(logger, JK_LOG_DEBUG,                    "HttpExtensionProc %s a worker for name %s\n",                    worker ? "got" : "could not get",                   worker_name);            if (worker) {                jk_endpoint_t *e = NULL;                if (worker->get_endpoint(worker, &e, logger)) {                    int recover = JK_FALSE;                    if (e->service(e, &s, logger, &recover)) {                        rc = HSE_STATUS_SUCCESS;                        lpEcb->dwHttpStatusCode = HTTP_STATUS_OK;                        jk_log(logger, JK_LOG_DEBUG,                                "HttpExtensionProc service() returned OK\n");                    } else {                        jk_log(logger, JK_LOG_ERROR,                                "HttpExtensionProc error, service() failed\n");                    }                    e->done(&e, logger);                }            } else {                jk_log(logger, JK_LOG_ERROR,                        "HttpExtensionProc error, could not get a worker for name %s\n",                       worker_name);            }        }        jk_close_pool(&private_data.p);         } else {        jk_log(logger, JK_LOG_ERROR,                "HttpExtensionProc error, not initialized\n");    }    return rc;}    BOOL WINAPI TerminateExtension(DWORD dwFlags) {    return TerminateFilter(dwFlags);}BOOL WINAPI TerminateFilter(DWORD dwFlags) {    if (is_inited) {        is_inited = JK_FALSE;		if (is_mapread) {			uri_worker_map_free(&uw_map, logger);			is_mapread = JK_FALSE;		}        wc_close(logger);        if (logger) {            jk_close_file_logger(&logger);        }    }        return TRUE;}BOOL WINAPI DllMain(HINSTANCE hInst,        // Instance Handle of the DLL                    ULONG ulReason,         // Reason why NT called this DLL                    LPVOID lpReserved)      // Reserved parameter for future use{    BOOL fReturn = TRUE;    char drive[_MAX_DRIVE];    char dir[_MAX_DIR];    char fname[_MAX_FNAME];    char file_name[_MAX_PATH];    switch (ulReason) {        case DLL_PROCESS_DETACH:            __try {                TerminateFilter(HSE_TERM_MUST_UNLOAD);            } __except(1) {            }        break;        default:        break;    }     if (GetModuleFileName( hInst, file_name, sizeof(file_name))) {        _splitpath( file_name, drive, dir, fname, NULL );        _makepath( ini_file_name, drive, dir, fname, ".properties" );    } else {        fReturn = JK_FALSE;    }    return fReturn;}static int init_jk(char *serverName){    int rc = JK_FALSE;      jk_map_t *map;    if (!jk_open_file_logger(&logger, log_file, log_level)) {        logger = NULL;    }    /* Logging the initialization type: registry or properties file in virtual dir    */    if (using_ini_file) {        jk_log(logger, JK_LOG_DEBUG, "Using ini file %s.\n", ini_file_name);    } else {        jk_log(logger, JK_LOG_DEBUG, "Using registry.\n");    }    jk_log(logger, JK_LOG_DEBUG, "Using log file %s.\n", log_file);    jk_log(logger, JK_LOG_DEBUG, "Using log level %d.\n", log_level);    jk_log(logger, JK_LOG_DEBUG, "Using extension uri %s.\n", extension_uri);    jk_log(logger, JK_LOG_DEBUG, "Using worker file %s.\n", worker_file);    jk_log(logger, JK_LOG_DEBUG, "Using worker mount file %s.\n", worker_mount_file);    jk_log(logger, JK_LOG_DEBUG, "Using uri select %d.\n", uri_select_option);    if (map_alloc(&map)) {        if (map_read_properties(map, worker_mount_file)) {            /* remove non-mapping entries (assume they were string substitutions) */            jk_map_t *map2;            if (map_alloc(&map2)) {                int sz,i;                void* old;                sz = map_size(map);                for(i = 0; i < sz ; i++) {                    char *name = map_name_at(map, i);                    if ('/' == *name) {                        map_put(map2, name, map_value_at(map, i), &old);                    } else {                        jk_log(logger, JK_LOG_DEBUG,                               "Ignoring worker mount file entry %s=%s.\n",                               name, map_value_at(map, i));                    }                }                if (uri_worker_map_alloc(&uw_map, map2, logger)) {                    rc = JK_TRUE;                }                map_free(&map2);            }        } else {            jk_log(logger, JK_LOG_EMERG,                     "Unable to read worker mount file %s.\n",                     worker_mount_file);        }        map_free(&map);    }    if (rc) {        rc = JK_FALSE;        if (map_alloc(&map)) {            if (map_read_properties(map, worker_file)) {                /* we add the URI->WORKER MAP since workers using AJP14 will feed it */                worker_env.uri_to_worker = uw_map;                worker_env.server_name = serverName;                if (wc_open(map, &worker_env, logger)) {                    rc = JK_TRUE;                }            } else {                jk_log(logger, JK_LOG_EMERG,                         "Unable to read worker file %s.\n",                         worker_file);            }            map_free(&map);        }    }    return rc;}static int initialize_extension(void){    if (read_registry_init_data()) {        is_inited = JK_TRUE;    }    return is_inited;}int parse_uri_select(const char *uri_select){    if(0 == strcasecmp(uri_select, URI_SELECT_PARSED_VERB)) {        return URI_SELECT_OPT_PARSED;    }    if(0 == strcasecmp(uri_select, URI_SELECT_UNPARSED_VERB)) {        return URI_SELECT_OPT_UNPARSED;    }    if(0 == strcasecmp(uri_select, URI_SELECT_ESCAPED_VERB)) {        return URI_SELECT_OPT_ESCAPED;    }    return -1;}static int read_registry_init_data(void){    char tmpbuf[INTERNET_MAX_URL_LENGTH];    HKEY hkey;    long rc;    int  ok = JK_TRUE;    char *tmp;    jk_map_t *map;    if (map_alloc(&map)) {        if (map_read_properties(map, ini_file_name)) {            using_ini_file = JK_TRUE;		}    }    if (using_ini_file) {        tmp = map_get_string(map, JK_LOG_FILE_TAG, NULL);        if (tmp) {            strcpy(log_file, tmp);        } else {            ok = JK_FALSE;        }        tmp = map_get_string(map, JK_LOG_LEVEL_TAG, NULL);        if (tmp) {            log_level = jk_parse_log_level(tmp);        } else {            ok = JK_FALSE;        }        tmp = map_get_string(map, EXTENSION_URI_TAG, NULL);        if (tmp) {            strcpy(extension_uri, tmp);        } else {            ok = JK_FALSE;        }        tmp = map_get_string(map, JK_WORKER_FILE_TAG, NULL);        if (tmp) {            strcpy(worker_file, tmp);        } else {            ok = JK_FALSE;        }        tmp = map_get_string(map, JK_MOUNT_FILE_TAG, NULL);        if (tmp) {            strcpy(worker_mount_file, tmp);        } else {            ok = JK_FALSE;        }        tmp = map_get_string(map, URI_SELECT_TAG, NULL);        if (tmp) {            int opt = parse_uri_select(tmp);            if (opt >= 0) {                uri_select_option = opt;            } else {                ok = JK_FALSE;            }        }        } else {        rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE,                          REGISTRY_LOCATION,                          (DWORD)0,                          KEY_READ,                          &hkey);        if(ERROR_SUCCESS != rc) {            return JK_FALSE;        }         if(get_registry_config_parameter(hkey,                                         JK_LOG_FILE_TAG,                                          tmpbuf,                                         sizeof(log_file))) {            strcpy(log_file, tmpbuf);        } else {            ok = JK_FALSE;        }            if(get_registry_config_parameter(hkey,                                         JK_LOG_LEVEL_TAG,                                         tmpbuf,                                         sizeof(tmpbuf))) {            log_level = jk_parse_log_level(tmpbuf);        } else {            ok = JK_FALSE;

⌨️ 快捷键说明

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