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

📄 jk_isapi_plugin.c

📁 以便Apache与其他服务进行整合 Mod_JK安装
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -