📄 jk_isapi_plugin.c
字号:
return SF_STATUS_REQ_FINISHED; } if (worker) { char *forwardURI; /* This is a servlet, should redirect ... */ jk_log(logger, JK_LOG_DEBUG, "[%s] is a servlet url - should redirect to %s", uri, worker); /* get URI we should forward */ if (uri_select_option == URI_SELECT_OPT_UNPARSED) { /* get original unparsed URI */ GetHeader(pfc, "url", (LPVOID) uri, (LPDWORD) & sz); /* restore terminator for uri portion */ if (query) *(query - 1) = '\0'; if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "fowarding original URI [%s]", uri); forwardURI = uri; } else if (uri_select_option == URI_SELECT_OPT_ESCAPED) { if (!escape_url(uri, snuri, INTERNET_MAX_URL_LENGTH)) { jk_log(logger, JK_LOG_ERROR, "[%s] re-encoding request exceeds maximum buffer size.", uri); write_error_response(pfc, "400 Bad Request", HTML_ERROR_400); return SF_STATUS_REQ_FINISHED; } if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "fowarding escaped URI [%s]", 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, (LPSTR)worker) || !SetHeader(pfc, "url", extension_uri)) { jk_log(logger, JK_LOG_ERROR, "error while adding request headers"); 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, "error while adding Tomcat-Translate headers"); return SF_STATUS_REQ_ERROR; } SetHeader(pfc, "Translate:", NULL); } if (!pfc->pFilterContext) { isapi_log_data_t *ld = (isapi_log_data_t *)pfc->AllocMem(pfc, sizeof(isapi_log_data_t), 0); if (!ld) { jk_log(logger, JK_LOG_ERROR, "error while allocating memory"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); return SF_STATUS_REQ_ERROR; } memset(ld, 0, sizeof(isapi_log_data_t)); strcpy(ld->uri, forwardURI); if (query && strlen(query) > 0) strcpy(ld->query, query); pfc->pFilterContext = ld; } } else { if (JK_IS_DEBUG_LEVEL(logger)) jk_log(logger, JK_LOG_DEBUG, "[%s] is not a servlet url", uri); } } } else if (is_inited && (dwNotificationType == SF_NOTIFY_LOG)) { if (pfc->pFilterContext) { isapi_log_data_t *ld = (isapi_log_data_t *)pfc->pFilterContext; HTTP_FILTER_LOG *pl = (HTTP_FILTER_LOG *)pvNotification; pl->pszTarget = ld->uri; pl->pszParameters = ld->query; } } 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_TRACE_ENTER(logger); /* 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; 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; if (e->service(e, &s, logger, &is_error)) { rc = HSE_STATUS_SUCCESS; lpEcb->dwHttpStatusCode = HTTP_STATUS_OK; jk_log(logger, JK_LOG_DEBUG, "service() returned OK"); } else { lpEcb->dwHttpStatusCode = is_error; jk_log(logger, JK_LOG_ERROR, "service() failed"); } e->done(&e, logger); } } else { jk_log(logger, JK_LOG_ERROR, "could not get a worker for name %s", worker_name); } } 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; } 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]; 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; } break; case DLL_PROCESS_DETACH: __try { TerminateFilter(HSE_TERM_MUST_UNLOAD); } __except(1) { } break; default: break; } 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; } /* Simulate shared memory * For now use fixed size. */ jk_shm_open(NULL, JK_SHM_DEF_SIZE, logger); /* 10 is minimum supported on WINXP */ jk_set_worker_def_cache_size(10); /* 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 uri select %d.", uri_select_option); } if (uri_worker_map_alloc(&uw_map, NULL, logger)) { rc = JK_FALSE; uw_map->fname = worker_mount_file; if (worker_mount_file[0]) rc = uri_worker_map_load(uw_map, logger); } if (rc) { rc = JK_FALSE; if (jk_map_alloc(&map)) { if (jk_map_read_properties(map, worker_file, NULL)) { /* 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.", worker_file); } jk_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; const char *tmp; jk_map_t *map; if (jk_map_alloc(&map)) { if (jk_map_read_properties(map, ini_file_name, NULL)) { using_ini_file = JK_TRUE; } } if (using_ini_file) { tmp = jk_map_get_string(map, JK_LOG_FILE_TAG, NULL); if (tmp) { strcpy(log_file, tmp); } else { ok = JK_FALSE; } tmp = jk_map_get_string(map, JK_LOG_LEVEL_TAG, NULL); if (tmp) { log_level = jk_parse_log_level(tmp); } else { ok = JK_FALSE; } tmp = jk_map_get_string(map, EXTENSION_URI_TAG, NULL); if (tmp) { strcpy(extension_uri, tmp); } else { ok = JK_FALSE; } tmp = jk_map_get_string(map, JK_WORKER_FILE_TAG, NULL); if (tmp) { strcpy(worker_file, tmp); } else { ok = JK_FALSE; } tmp = jk_map_get_string(map, JK_MOUNT_FILE_TAG, NULL); if (tmp) { strcpy(worker_mount_file, tmp); } else { ok = JK_FALSE; } tmp = jk_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; } } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -