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

📄 jk_isapi_plugin.c

📁 以便Apache与其他服务进行整合 Mod_JK安装
💻 C
📖 第 1 页 / 共 5 页
字号:
                    return 1;                }            }        }    }    return 0;}static int init_error = 0;DWORD WINAPI HttpFilterProc(PHTTP_FILTER_CONTEXT pfc,                            DWORD dwNotificationType, LPVOID pvNotification){    /* Initialise jk */    if (is_inited && !is_mapread) {        char serverName[MAX_SERVERNAME];        DWORD dwLen = sizeof(serverName);        if (pfc->GetServerVariable(pfc, SERVER_NAME, serverName, &dwLen)) {            if (dwLen > 0)                serverName[dwLen - 1] = '\0';            if (init_jk(serverName))                is_mapread = JK_TRUE;        }        /* If we can't read the map we become dormant */        if (!is_mapread)            is_inited = JK_FALSE;    }    if (!is_inited && !is_mapread) {        /* In case the initialization failed         * return error. This will make entire IIS         * unusable like with Apache servers         */         SetLastError(ERROR_INVALID_FUNCTION);         return SF_STATUS_REQ_ERROR;    }    if (auth_notification_flags == dwNotificationType) {        char uri[INTERNET_MAX_URL_LENGTH];        char snuri[INTERNET_MAX_URL_LENGTH] = "/";        char Host[INTERNET_MAX_URL_LENGTH] = "";        char Port[INTERNET_MAX_URL_LENGTH] = "";        char Translate[INTERNET_MAX_URL_LENGTH];        char squery[INTERNET_MAX_URL_LENGTH] = "";        BOOL(WINAPI * GetHeader)            (struct _HTTP_FILTER_CONTEXT * pfc, LPSTR lpszName,             LPVOID lpvBuffer, LPDWORD lpdwSize);        BOOL(WINAPI * SetHeader)            (struct _HTTP_FILTER_CONTEXT * pfc, LPSTR lpszName,             LPSTR lpszValue);        BOOL(WINAPI * AddHeader)            (struct _HTTP_FILTER_CONTEXT * pfc, LPSTR lpszName,             LPSTR lpszValue);        char *query;        DWORD sz = sizeof(uri);        DWORD szHost = sizeof(Host);        DWORD szPort = sizeof(Port);        DWORD szTranslate = sizeof(Translate);        if (auth_notification_flags == SF_NOTIFY_AUTH_COMPLETE) {            GetHeader =                ((PHTTP_FILTER_AUTH_COMPLETE_INFO) pvNotification)->GetHeader;            SetHeader =                ((PHTTP_FILTER_AUTH_COMPLETE_INFO) pvNotification)->SetHeader;            AddHeader =                ((PHTTP_FILTER_AUTH_COMPLETE_INFO) pvNotification)->AddHeader;        }        else {            GetHeader =                ((PHTTP_FILTER_PREPROC_HEADERS) pvNotification)->GetHeader;            SetHeader =                ((PHTTP_FILTER_PREPROC_HEADERS) pvNotification)->SetHeader;            AddHeader =                ((PHTTP_FILTER_PREPROC_HEADERS) pvNotification)->AddHeader;        }        if (JK_IS_DEBUG_LEVEL(logger))            jk_log(logger, JK_LOG_DEBUG, "Filter started");        /*         * Just in case somebody set these headers in the request!         */        SetHeader(pfc, URI_HEADER_NAME, NULL);        SetHeader(pfc, QUERY_HEADER_NAME, NULL);        SetHeader(pfc, WORKER_HEADER_NAME, NULL);        SetHeader(pfc, TOMCAT_TRANSLATE_HEADER_NAME, NULL);        if (!GetHeader(pfc, "url", (LPVOID) uri, (LPDWORD) & sz)) {            jk_log(logger, JK_LOG_ERROR,                   "error while getting the url");            return SF_STATUS_REQ_ERROR;        }        if (strlen(uri)) {            int rc;            const char *worker = NULL;            query = strchr(uri, '?');            if (query) {                *query++ = '\0';                StringCbCopy(squery, INTERNET_MAX_URL_LENGTH, query);            }            rc = unescape_url(uri);            if (rc == BAD_REQUEST) {                jk_log(logger, JK_LOG_ERROR,                       "[%s] contains one or more invalid escape sequences.",                       uri);                write_error_response(pfc, "400 Bad Request",                                     HTML_ERROR_400);                return SF_STATUS_REQ_FINISHED;            }            else if (rc == BAD_PATH) {                jk_log(logger, JK_LOG_EMERG,                       "[%s] contains forbidden escape sequences.",                       uri);                write_error_response(pfc, "404 Not Found",                                     HTML_ERROR_404);                return SF_STATUS_REQ_FINISHED;            }            getparents(uri);            if (pfc->                GetServerVariable(pfc, SERVER_NAME, (LPVOID) Host,                                  (LPDWORD) & szHost)) {                if (szHost > 0) {                    Host[szHost - 1] = '\0';                }            }            Port[0] = '\0';            if (pfc->                GetServerVariable(pfc, "SERVER_PORT", (LPVOID) Port,                                  (LPDWORD) & szPort)) {                if (szPort > 0) {                    Port[szPort - 1] = '\0';                }            }            szPort = atoi(Port);            if (szPort != 80 && szPort != 443 && szHost > 0) {                StringCbCat(Host, INTERNET_MAX_URL_LENGTH, ":");                StringCbCat(Host, INTERNET_MAX_URL_LENGTH, Port);            }            if (szHost > 0) {                StringCbCat(snuri, INTERNET_MAX_URL_LENGTH, Host);                StringCbCat(snuri, INTERNET_MAX_URL_LENGTH, uri);                if (JK_IS_DEBUG_LEVEL(logger))                    jk_log(logger, JK_LOG_DEBUG,                           "Virtual Host redirection of %s",                           snuri);                worker = map_uri_to_worker(uw_map, snuri, logger);            }            if (!worker) {                if (JK_IS_DEBUG_LEVEL(logger))                    jk_log(logger, JK_LOG_DEBUG,                           "Default redirection of %s",                           uri);                worker = map_uri_to_worker(uw_map, uri, logger);            }            /*             * Check if somebody is feading us with his own TOMCAT data headers.             * We reject such postings !             */            if (worker) {                char *forwardURI;                if (JK_IS_DEBUG_LEVEL(logger))                    jk_log(logger, JK_LOG_DEBUG,                           "check if [%s] is points to the web-inf directory",                        uri);                if (uri_is_web_inf(uri)) {                    jk_log(logger, JK_LOG_EMERG,                           "[%s] points to the web-inf or meta-inf directory. "                           "Somebody try to hack into the site!!!",                           uri);                    write_error_response(pfc, "404 Not Found",                                         HTML_ERROR_404);                    return SF_STATUS_REQ_FINISHED;                }                /* This is a servlet, should redirect ... */                if (JK_IS_DEBUG_LEVEL(logger))                    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 if (uri_select_option == URI_SELECT_OPT_PROXY) {                    if (!jk_canonenc(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;                }                /* Do a simple rewrite .                 * Note that URI can be escaped, so thus the rule has                 * to be in that case.                 *                 * TODO: Add more advanced regexp rewrite.                 */                if (JK_IS_DEBUG_LEVEL(logger)) {                    char duri[INTERNET_MAX_URL_LENGTH];                    StringCbCopy(duri, INTERNET_MAX_URL_LENGTH, forwardURI);                    if (simple_rewrite(forwardURI)) {                        jk_log(logger, JK_LOG_DEBUG,                               "rewriten URI [%s]->[%s]",                               duri, forwardURI);                    }                    else if (rregex_rewrite(forwardURI)) {                        jk_log(logger, JK_LOG_DEBUG,                               "rewriten URI [%s]->[%s]",                               duri, forwardURI);                    }                }                else {                    if (!simple_rewrite(forwardURI))                        rregex_rewrite(forwardURI);                }                if (!AddHeader(pfc, URI_HEADER_NAME, forwardURI) ||                    ((strlen(squery) > 0)                     ? !AddHeader(pfc, QUERY_HEADER_NAME, squery) : FALSE) ||                    !AddHeader(pfc, WORKER_HEADER_NAME, (LPSTR)worker) ||                    !SetHeader(pfc, "url", extension_uri)) {                    jk_log(logger, JK_LOG_ERROR,                           "error while adding request headers");                    SetLastError(ERROR_INVALID_PARAMETER);                    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_HEADER, (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));                    StringCbCopy(ld->uri, INTERNET_MAX_URL_LENGTH, forwardURI);                    StringCbCopy(ld->query, INTERNET_MAX_URL_LENGTH, squery);                    pfc->pFilterContext = ld;                } else {                    isapi_log_data_t *ld = (isapi_log_data_t *)pfc->pFilterContext;                    memset(ld, 0, sizeof(isapi_log_data_t));                    StringCbCopy(ld->uri, INTERNET_MAX_URL_LENGTH, forwardURI);                    StringCbCopy(ld->query, INTERNET_MAX_URL_LENGTH, squery);                }            }            else {                if (JK_IS_DEBUG_LEVEL(logger))                    jk_log(logger, JK_LOG_DEBUG,                           "[%s] is not a servlet url", uri);                if (strip_session) {                    char *jsessionid = strstr(uri, JK_PATH_SESSION_IDENTIFIER);                    if (jsessionid) {                        if (JK_IS_DEBUG_LEVEL(logger))                            jk_log(logger, JK_LOG_DEBUG,                                   "removing session identifier [%s] for non servlet url [%s]",                                   jsessionid, uri);                        *jsessionid = '\0';                        SetHeader(pfc, "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);    StringCbCopy(pVer->lpszExtensionDesc, HSE_MAX_EXT_DLL_NAME_LEN, 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] = { 0 };        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;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -