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

📄 jk_isapi_plugin.c

📁 jboss与apache集成的中间件,详情请参看文档说明.
💻 C
📖 第 1 页 / 共 4 页
字号:
                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 + -