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

📄 jk_isapi_plugin.c

📁 Tomcat 4.1与WebServer集成组件的源代码包.
💻 C
📖 第 1 页 / 共 3 页
字号:
            /*             * 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)) {                env->l->jkLog(env, env->l,  JK_LOG_ERROR,                        "HttpFilterProc error while getting the url\n");                workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );                return SF_STATUS_REQ_ERROR;            }            if (strlen(uri)) {                int rc;                char *worker=0;                query = strchr(uri, '?');                if (query) {                    *query++ = '\0';                }                rc = jk_requtil_unescapeUrl(uri);                if (rc == BAD_REQUEST) {                    env->l->jkLog(env, env->l,  JK_LOG_ERROR,                            "HttpFilterProc [%s] contains one or more invalid escape sequences.\n",                            uri);                    write_error_response(pfc,"400 Bad Request", HTML_ERROR_400);                    workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );                    return SF_STATUS_REQ_FINISHED;                }                else if(rc == BAD_PATH) {                    env->l->jkLog(env, env->l,  JK_LOG_EMERG,                            "HttpFilterProc [%s] contains forbidden escape sequences.\n",                            uri);                    write_error_response(pfc,"403 Forbidden", HTML_ERROR_403);                    workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );                    return SF_STATUS_REQ_FINISHED;                }                jk_requtil_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';                    }                }                nPort = atoi(Port);                env->l->jkLog(env, env->l,  JK_LOG_DEBUG,                             "In HttpFilterProc Virtual Host redirection of %s : %s\n",                             Host, Port);                uriEnv = workerEnv->uriMap->mapUri(env, workerEnv->uriMap,Host, nPort, uri );                if( uriEnv!=NULL ) {                    char *forwardURI;                    /* This is a servlet, should redirect ... */                    env->l->jkLog(env, env->l,  JK_LOG_DEBUG,                            "HttpFilterProc [%s] is a servlet url - should redirect to %s\n",                            uri, uriEnv->workerName);                                    /* get URI we should forward */                                    if( workerEnv->options == JK_OPT_FWDURICOMPATUNPARSED ){                        /* get original unparsed URI */                        GetHeader(pfc, "url", (LPVOID)uri, (LPDWORD)&sz);                        /* restore terminator for uri portion */                        if (query)                            *(query - 1) = '\0';                        env->l->jkLog(env, env->l,  JK_LOG_DEBUG,                                "HttpFilterProc fowarding original URI [%s]\n",uri);                        forwardURI = uri;                    } else if( workerEnv->options == JK_OPT_FWDURIESCAPED ){                        if (!jk_requtil_escapeUrl(uri,snuri,INTERNET_MAX_URL_LENGTH)) {                            env->l->jkLog(env, env->l,  JK_LOG_ERROR,                                    "HttpFilterProc [%s] re-encoding request exceeds maximum buffer size.\n",                                    uri);                            write_error_response(pfc,"400 Bad Request", HTML_ERROR_400);                            workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );                            return SF_STATUS_REQ_FINISHED;                        }                        env->l->jkLog(env, env->l,  JK_LOG_DEBUG,                                "HttpFilterProc fowarding escaped URI [%s]\n",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, uriEnv->workerName) ||                       !SetHeader(pfc, "url", extension_uri)) {                        env->l->jkLog(env, env->l,  JK_LOG_ERROR,                                "HttpFilterProc error while adding request headers\n");                        workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );                        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)) {                            env->l->jkLog(env, env->l,  JK_LOG_ERROR,                               "HttpFilterProc error while adding Tomcat-Translate headers\n");                            workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );                            return SF_STATUS_REQ_ERROR;                        }                    SetHeader(pfc, "Translate:", NULL);                    }                } else {                    env->l->jkLog(env, env->l,  JK_LOG_DEBUG,                            "HttpFilterProc [%s] is not a servlet url\n",                            uri);                }                /*                 * Check if somebody is feeding us with his own TOMCAT data headers.                 * We reject such postings !                 */                env->l->jkLog(env, env->l,  JK_LOG_DEBUG,                        "HttpFilterProc check if [%s] is pointing to the web-inf directory\n",                        uri);                if(jk_requtil_uriIsWebInf(uri)) {                    env->l->jkLog(env, env->l,  JK_LOG_EMERG,                            "HttpFilterProc [%s] points to the web-inf or meta-inf directory.\nSomebody try to hack into the site!!!\n",                            uri);                    write_error_response(pfc,"403 Forbidden", HTML_ERROR_403);                    workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );                    return SF_STATUS_REQ_FINISHED;                }            }        }        workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );    }    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);    return TRUE;}DWORD WINAPI HttpExtensionProcWorker(LPEXTENSION_CONTROL_BLOCK  lpEcb,                                      jk_ws_service_t *service){       DWORD rc = HSE_STATUS_ERROR;    jk_env_t *env;    jk_ws_service_t sOnStack;    jk_ws_service_t *s;    char *worker_name;    char huge_buf[16 * 1024]; /* should be enough for all */    DWORD huge_buf_sz;            jk_worker_t *worker;    jk_pool_t *rPool=NULL;    int rc1;    if (service)        s = service;    else        s = &sOnStack;    lpEcb->dwHttpStatusCode = HTTP_STATUS_SERVER_ERROR;    env = workerEnv->globalEnv->getEnv( workerEnv->globalEnv );    env->l->jkLog(env, env->l,  JK_LOG_DEBUG,                   "HttpExtensionProc started\n");    huge_buf_sz = sizeof(huge_buf);    get_server_value(lpEcb, HTTP_WORKER_HEADER_NAME, huge_buf, huge_buf_sz, "");    worker_name = huge_buf;    worker=env->getByName( env, worker_name);    env->l->jkLog(env, env->l,  JK_LOG_DEBUG,         "HttpExtensionProc %s a worker for name %s\n",         worker ? "got" : "could not get",        worker_name);    if( worker==NULL ){        env->l->jkLog(env, env->l,  JK_LOG_ERROR,             "HttpExtensionProc worker is NULL\n");        return rc;                }    /* Get a pool for the request XXX move it in workerEnv to    be shared with other server adapters */    rPool= worker->rPoolCache->get( env, worker->rPoolCache );    if( rPool == NULL ) {        rPool=worker->mbean->pool->create( env, worker->mbean->pool, HUGE_POOL_SIZE );        env->l->jkLog(env, env->l, JK_LOG_DEBUG,            "HttpExtensionProc: new rpool\n");    }    jk2_service_iis_init( env, s );    s->pool = rPool;    s->is_recoverable_error = JK_FALSE;    s->response_started = JK_FALSE;    s->content_read = 0;    s->ws_private = lpEcb;    s->workerEnv = workerEnv;    /* Initialize the ws_service structure */    s->init( env, s, worker, lpEcb );    if (JK_OK == worker->service(env, worker, s)){        rc=HSE_STATUS_SUCCESS;        lpEcb->dwHttpStatusCode = HTTP_STATUS_OK;        env->l->jkLog(env, env->l,  JK_LOG_DEBUG,             "HttpExtensionProc service() returned OK\n");    } else {        env->l->jkLog(env, env->l,  JK_LOG_DEBUG,             "HttpExtensionProc service() Failed\n");    }    s->afterRequest(env, s);    if (service != NULL) {        lpEcb->ServerSupportFunction(lpEcb->ConnID,                                      HSE_REQ_DONE_WITH_SESSION,                                      NULL,                                      NULL,                                      NULL);    }    rPool->reset(env, rPool);    rc1=worker->rPoolCache->put( env, worker->rPoolCache, rPool );    workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );    return rc;}DWORD WINAPI HttpExtensionProc(LPEXTENSION_CONTROL_BLOCK  lpEcb){    if (is_inited) {        if (!use_thread_pool) {            return HttpExtensionProcWorker(lpEcb, NULL);        }        else {            /* Pass the request to the thread pool */            jk2_iis_thread_pool(lpEcb);            return HSE_STATUS_PENDING;        }    }    return HSE_STATUS_ERROR;}BOOL WINAPI TerminateExtension(DWORD dwFlags) {    return TerminateFilter(dwFlags);}BOOL WINAPI TerminateFilter(DWORD dwFlags) {    /* detatch the starter thread */    SetEvent(jk2_starter_event);    WaitForSingleObject(jk2_starter_thread, 3000);    CloseHandle(jk2_starter_thread);    jk2_starter_thread = INVALID_HANDLE_VALUE;    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];    switch (ulReason) {        case DLL_PROCESS_ATTACH:            if (GetModuleFileName( hInst, file_name, sizeof(file_name))) {

⌨️ 快捷键说明

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