📄 jk_isapi_plugin.c
字号:
wc_maintain(logger); 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); if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "%s a worker for name %s", worker ? "got" : "could not get", worker_name); if (worker) { jk_endpoint_t *e = NULL; /* Update retries for this worker */ s.retries = worker->retries; if (worker->get_endpoint(worker, &e, logger)) { int is_error = JK_HTTP_SERVER_ERROR; int result; if ((result = e->service(e, &s, logger, &is_error)) > 0) { rc = HSE_STATUS_SUCCESS; lpEcb->dwHttpStatusCode = HTTP_STATUS_OK; if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "service() returned OK"); } else { if ((result == JK_CLIENT_ERROR) && (is_error == JK_HTTP_OK)) { jk_log(logger, JK_LOG_INFO, "service() failed because client aborted connection"); } else { jk_log(logger, JK_LOG_ERROR, "service() failed with http error %d", is_error); } lpEcb->dwHttpStatusCode = is_error; write_error_message(lpEcb, is_error); } e->done(&e, logger); } else { jk_log(logger, JK_LOG_ERROR, "Failed to obtain an endpoint to service request - " "your connection_pool_size is probably less than the threads in your web server!"); } } else { jk_log(logger, JK_LOG_ERROR, "could not get a worker for name %s", worker_name); } } else { jk_log(logger, JK_LOG_ERROR, "failed to init service for request."); } jk_close_pool(&private_data.p); } else { jk_log(logger, JK_LOG_ERROR, "not initialized"); } JK_TRACE_EXIT(logger); return rc;}BOOL WINAPI TerminateExtension(DWORD dwFlags){ return TerminateFilter(dwFlags);}BOOL WINAPI TerminateFilter(DWORD dwFlags){ UNREFERENCED_PARAMETER(dwFlags); if (is_inited) { is_inited = JK_FALSE; if (is_mapread) { uri_worker_map_free(&uw_map, logger); is_mapread = JK_FALSE; } if (workers_map) { jk_map_free(&workers_map); } if (rewrite_map) { jk_map_free(&rewrite_map); } if (rregexp_map) { int i; for (i = 0; i < jk_map_size(rregexp_map); i++) { ap_regex_t *regexp = (ap_regex_t *)jk_map_value_at(rregexp_map, i); if (regexp) { ap_regfree(regexp); free(regexp); } } jk_map_free(&rregexp_map); } jk_shm_close(); 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_PATH]; char file_name[MAX_PATH]; UNREFERENCED_PARAMETER(lpReserved); switch (ulReason) { case DLL_PROCESS_ATTACH: 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; } /* Construct redirector headers to use for this redirector instance */ StringCbPrintf(URI_HEADER_NAME, MAX_PATH, HEADER_TEMPLATE, URI_HEADER_NAME_BASE, hInst); StringCbPrintf(QUERY_HEADER_NAME, MAX_PATH, HEADER_TEMPLATE, QUERY_HEADER_NAME_BASE, hInst); StringCbPrintf(WORKER_HEADER_NAME, MAX_PATH, HEADER_TEMPLATE, WORKER_HEADER_NAME_BASE, hInst); StringCbPrintf(TOMCAT_TRANSLATE_HEADER_NAME, MAX_PATH, HEADER_TEMPLATE, TOMCAT_TRANSLATE_HEADER_NAME_BASE, hInst); StringCbPrintf(HTTP_URI_HEADER_NAME, MAX_PATH, HTTP_HEADER_TEMPLATE, URI_HEADER_NAME_BASE, hInst); StringCbPrintf(HTTP_QUERY_HEADER_NAME, MAX_PATH, HTTP_HEADER_TEMPLATE, QUERY_HEADER_NAME_BASE, hInst); StringCbPrintf(HTTP_WORKER_HEADER_NAME, MAX_PATH, HTTP_HEADER_TEMPLATE, WORKER_HEADER_NAME_BASE, hInst); break; case DLL_PROCESS_DETACH: __try { TerminateFilter(HSE_TERM_MUST_UNLOAD); } __except(1) { } break; default: break; } return fReturn;}static int init_jk(char *serverName){ char shm_name[MAX_PATH]; int rc = JK_FALSE; if (!jk_open_file_logger(&logger, log_file, log_level)) { logger = NULL; } StringCbCopy(shm_name, MAX_PATH, SHM_DEF_NAME); if (*serverName) { size_t i; StringCbCat(shm_name, MAX_PATH, "_"); StringCbCat(shm_name, MAX_PATH, serverName); for(i = 0; i < strlen(shm_name); i++) { shm_name[i] = toupper(shm_name[i]); if (!isalnum(shm_name[i])) shm_name[i] = '_'; } } /* * Create named shared memory for each server */ jk_shm_open(shm_name, shm_config_size, logger); jk_set_worker_def_cache_size(DEFAULT_WORKER_THREADS); /* Logging the initialization type: registry or properties file in virtual dir */ if (JK_IS_DEBUG_LEVEL(logger)) { if (using_ini_file) { jk_log(logger, JK_LOG_DEBUG, "Using ini file %s.", ini_file_name); } else { jk_log(logger, JK_LOG_DEBUG, "Using registry."); } jk_log(logger, JK_LOG_DEBUG, "Using log file %s.", log_file); jk_log(logger, JK_LOG_DEBUG, "Using log level %d.", log_level); jk_log(logger, JK_LOG_DEBUG, "Using extension uri %s.", extension_uri); jk_log(logger, JK_LOG_DEBUG, "Using worker file %s.", worker_file); jk_log(logger, JK_LOG_DEBUG, "Using worker mount file %s.", worker_mount_file); jk_log(logger, JK_LOG_DEBUG, "Using rewrite rule file %s.", rewrite_rule_file); jk_log(logger, JK_LOG_DEBUG, "Using uri select %d.", uri_select_option); } if (rewrite_rule_file[0] && jk_map_alloc(&rewrite_map)) { if (jk_map_read_properties(rewrite_map, rewrite_rule_file, NULL, JK_MAP_HANDLE_RAW, logger)) { int i; if (JK_IS_DEBUG_LEVEL(logger)) { jk_log(logger, JK_LOG_DEBUG, "Loaded rewrite rule file %s.", rewrite_rule_file); } jk_map_alloc(&rregexp_map); for (i = 0; i < jk_map_size(rewrite_map); i++) { const char *src = jk_map_name_at(rewrite_map, i); if (*src == '~') { ap_regex_t *regexp = malloc(sizeof(ap_regex_t)); const char *val = jk_map_value_at(rewrite_map, i); /* Skip leading tilde */ regexp->real = src + 1; regexp->fake = val; if (!ap_regcomp(regexp, regexp->real, AP_REG_EXTENDED)) { jk_map_add(rregexp_map, regexp->real, regexp); if (JK_IS_DEBUG_LEVEL(logger)) { jk_log(logger, JK_LOG_DEBUG, "Added regular expression rule %s -> %s", regexp->real, regexp->fake); } } else { jk_log(logger, JK_LOG_ERROR, "Unable to compile regular expression %s", regexp->real); free(regexp); } } } } else { jk_map_free(&rewrite_map); rewrite_map = NULL; } } if (uri_worker_map_alloc(&uw_map, NULL, logger)) { rc = JK_FALSE; if (reject_unsafe) uw_map->reject_unsafe = 1; else uw_map->reject_unsafe = 0; uw_map->fname = worker_mount_file; uw_map->reload = worker_mount_reload; if (worker_mount_file[0]) rc = uri_worker_map_load(uw_map, logger); } if (rc) { rc = JK_FALSE; if (jk_map_alloc(&workers_map)) { if (jk_map_read_properties(workers_map, worker_file, NULL, JK_MAP_HANDLE_DUPLICATES, logger)) { /* we add the URI->WORKER MAP since workers using AJP14 will feed it */ if (jk_map_resolve_references(workers_map, "worker.", 1, 1, logger) == JK_FALSE) { jk_log(logger, JK_LOG_ERROR, "Error in resolving configuration references"); } worker_env.uri_to_worker = uw_map; worker_env.server_name = serverName; if (wc_open(workers_map, &worker_env, logger)) { rc = JK_TRUE; } } else { jk_log(logger, JK_LOG_EMERG, "Unable to read worker file %s.", worker_file); } if (rc != JK_TRUE) { jk_map_free(&workers_map); workers_map = NULL; } } } if (rc) { jk_log(logger, JK_LOG_INFO, "isapi_redirect/%s initialized", JK_VERSTRING); } return rc;}static int initialize_extension(void){ if (read_registry_init_data()) { auth_notification_flags = get_auth_flags(); 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; } if (0 == strcasecmp(uri_select, URI_SELECT_PROXY_VERB)) { return URI_SELECT_OPT_PROXY; } return -1;}static int read_registry_init_data(void){ char tmpbuf[MAX_PATH]; int ok = JK_TRUE; LPVOID src; HKEY hkey; jk_map_t *map = NULL; if (jk_map_alloc(&map)) { if (jk_map_read_properties(map, ini_file_name, NULL, JK_MAP_HANDLE_DUPLICATES, logger)) { using_ini_file = JK_TRUE; src = map; } else { jk_map_free(&map); } } if (!using_ini_file) { long rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGISTRY_LOCATION, (DWORD)0, KEY_READ, &hkey); if (ERROR_SUCCESS != rc) { return JK_FALSE; } else { src = &hkey; } } ok = ok && get_config_parameter(src, JK_LOG_FILE_TAG, log_file, sizeof(log_file)); if (get_config_parameter(src, JK_LOG_LEVEL_TAG, tmpbuf, sizeof(tmpbuf))) { log_level = jk_parse_log_level(tmpbuf); } ok = ok && get_config_parameter(src, EXTENSION_URI_TAG, extension_uri, sizeof(extension_uri)); ok = ok && get_config_parameter(src, JK_WORKER_FILE_TAG, worker_file, sizeof(worker_file)); ok = ok && get_config_parameter(src, JK_MOUNT_FILE_TAG, worker_mount_file, sizeof(worker_mount_file)); get_config_parameter(src, URI_REWRITE_TAG, rewrite_rule_file, sizeof(rewrite_rule_file));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -