📄 jk_isapi_plugin.c
字号:
"<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 + -