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

📄 mod_jk2.c

📁 Tomcat 4.1与WebServer集成组件的源代码包.
💻 C
📖 第 1 页 / 共 2 页
字号:
    apr_pool_t *tmpPool=NULL;    void *data=NULL;    int i;        for( i=0; i<10; i++ ) {        tmpPool=apr_pool_get_parent( gPool );        if( tmpPool == NULL ) {            /* fprintf(stderr, "XXX Found Root pool %#lx\n", gPool ); */            break;        }        gPool=tmpPool;    }    if( tmpPool != NULL ) {        /* We can't detect the root pool */        /* fprintf(stderr, "XXX Can't find root pool\n" ); */        return JK_ERR;    }    if(mainPool != NULL )        *mainPool=gPool;        /* We have a global pool ! */    apr_pool_userdata_get( &data, "mod_jk_init", gPool );    if( data==NULL ) {        return JK_OK;    } else {        return JK_ERR;    }}static int jk2_post_config(apr_pool_t *pconf,                            apr_pool_t *plog,                            apr_pool_t *ptemp,                            server_rec *s){    apr_pool_t *gPool=NULL;    int rc;    jk_env_t *env;        if(s->is_virtual)         return OK;    /* Other apache 2.0 modules add version info at post_config */    ap_add_version_component(pconf, JK_EXPOSED_VERSION);    env=workerEnv->globalEnv;        rc=jk2_apache2_isValidating( plog, &gPool );    env->setAprPool(env, gPool);    if( rc == JK_OK && gPool != NULL ) {        /* This is the first step */        env->l->jkLog(env, env->l, JK_LOG_INFO,                      "mod_jk.post_config() first invocation\n");                apr_pool_userdata_set( "INITOK", "mod_jk_init", NULL, gPool );        return OK;    }            env->l->jkLog(env, env->l, JK_LOG_INFO,                  "mod_jk.post_config() second invocation\n" );     workerEnv->parentInit( env, workerEnv);    return OK;}/** Standard apache callback, initialize jk. */static void jk2_child_init(apr_pool_t *pconf,                            server_rec *s){    apr_proc_t proc;        jk_uriEnv_t *serverEnv=(jk_uriEnv_t *)        ap_get_module_config(s->module_config, &jk2_module);    jk_env_t *env;            if( workerEnv==NULL )        workerEnv = serverEnv->workerEnv;    env=workerEnv->globalEnv;        if (!workerEnv->childProcessId)        workerEnv->childProcessId = getpid();    proc.pid = workerEnv->childProcessId;    /* detect if scoreboard exists    */    if (!ap_exists_scoreboard_image()) {        env->l->jkLog(env, env->l, JK_LOG_ERROR,             "jk2_init() Scoreboard image does not exists %d\n", proc.pid);        workerEnv->childId=-2;    }    else        workerEnv->childId = find_child_by_pid(&proc);    /* Avoid looking again    *  and fix the mpm_winnt reporting 0 daemons.    */    if (workerEnv->childId == -1) {        int max_daemons_limit;        ap_mpm_query(AP_MPMQ_MAX_DAEMONS, &max_daemons_limit);        if (max_daemons_limit == 0) {            workerEnv->childId = 0;                env->l->jkLog(env, env->l, JK_LOG_INFO,                 "jk2_init() Found child %d in scoreboard slot %d\n",                proc.pid, workerEnv->childId);        }        else {            env->l->jkLog(env, env->l, JK_LOG_ERROR,                 "jk2_init() Can't find child %d in scoreboard\n",                proc.pid);            workerEnv->childId = -2;        }    } else {        env->l->jkLog(env, env->l, JK_LOG_INFO,             "jk2_init() Found child %d in scoreboard slot %d\n",            proc.pid, workerEnv->childId);    }    /* If the child slot was found in the scoreboard, increment the     * generation status. This will prevent initializing jk2 if something     * goes wrong.     */    if (workerEnv->childId >= 0) {        workerEnv->childGeneration = ap_scoreboard_image->parent[workerEnv->childId].generation;        ++ap_scoreboard_image->parent[workerEnv->childId].generation;    }    if(!workerEnv->was_initialized) {        workerEnv->was_initialized = JK_TRUE;                        jk2_init( env, pconf, workerEnv, s );        if( workerEnv->childId <= 0 )             env->l->jkLog(env, env->l, JK_LOG_ERROR, "mod_jk child init %d %d\n",                          workerEnv->was_initialized, workerEnv->childId );    }    if (workerEnv->childGeneration)        env->l->jkLog(env, env->l, JK_LOG_ERROR, "mod_jk child workerEnv in error state %d\n",                      workerEnv->childGeneration);    /* Restore the process generation */    if (workerEnv->childId >= 0) {        ap_scoreboard_image->parent[workerEnv->childId].generation = workerEnv->childGeneration;    }    }/* ========================================================================= *//* The JK module handlers                                                    *//* ========================================================================= *//** Main service method, called to forward a request to tomcat */static int jk2_handler(request_rec *r){       jk_logger_t      *l=NULL;    int              rc;    jk_worker_t *worker=NULL;    jk_endpoint_t *end = NULL;    jk_uriEnv_t *uriEnv;    jk_env_t *env;    jk_ws_service_t *s=NULL;    jk_pool_t *rPool=NULL;    int rc1;    uriEnv=ap_get_module_config( r->request_config, &jk2_module );    /* not for me, try next handler */    if(uriEnv==NULL || strcmp(r->handler,JK_HANDLER))      return DECLINED;        /* If this is a proxy request, we'll notify an error */    if(r->proxyreq) {        return HTTP_INTERNAL_SERVER_ERROR;    }    /* Get an env instance */    env = workerEnv->globalEnv->getEnv( workerEnv->globalEnv );    /* Set up r->read_chunked flags for chunked encoding, if present */    if(rc = ap_setup_client_block(r, REQUEST_CHUNKED_DECHUNK)) {        env->l->jkLog(env, env->l, JK_LOG_INFO,                      "mod_jk.handler() Can't setup client block %d\n", rc);        workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );        return rc;    }    worker=uriEnv->worker;            if( worker==NULL && uriEnv->workerName != NULL ) {        worker=env->getByName( env, uriEnv->workerName);        env->l->jkLog(env, env->l, JK_LOG_INFO,                       "mod_jk.handler() finding worker for %#lx %#lx %s\n",                      worker, uriEnv, uriEnv->workerName);        uriEnv->worker=worker;    }    if(worker==NULL || worker->mbean == NULL || worker->mbean->localName==NULL ) {        env->l->jkLog(env, env->l, JK_LOG_ERROR,                       "mod_jk.handle() No worker for %s\n", r->uri);         workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );        return 500;    }    if( uriEnv->mbean->debug > 0 )        env->l->jkLog(env, env->l, JK_LOG_DEBUG,                       "mod_jk.handler() serving %s with %#lx %#lx %s\n",                      uriEnv->mbean->localName, worker, worker->mbean, worker->mbean->localName );    /* 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 );        if( uriEnv->mbean->debug > 0 )            env->l->jkLog(env, env->l, JK_LOG_DEBUG,                          "mod_jk.handler(): new rpool %#lx\n", rPool );    }        s=(jk_ws_service_t *)rPool->calloc( env, rPool, sizeof( jk_ws_service_t ));        /* XXX we should reuse the request itself !!! */    jk2_service_apache2_init( env, s );        s->pool = rPool;    s->init( env, s, worker, r );        s->is_recoverable_error = JK_FALSE;    s->uriEnv = uriEnv;     /* env->l->jkLog(env, env->l, JK_LOG_INFO,  */    /*              "mod_jk.handler() Calling %s\n", worker->mbean->name); */        rc = worker->service(env, worker, s);        s->afterRequest(env, s);        rPool->reset(env, rPool);        rc1=worker->rPoolCache->put( env, worker->rPoolCache, rPool );    if( rc1 == JK_OK ) {        rPool=NULL;    }    if( rPool!=NULL ) {        rPool->close(env, rPool);    }    if(rc==JK_OK) {        workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );        return OK;    /* NOT r->status, even if it has changed. */    }    env->l->jkLog(env, env->l, JK_LOG_ERROR,                  "mod_jk.handler() Error connecting to tomcat %d\n", rc);    workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );    return 500;}/** Use the internal mod_jk mappings to find if this is a request for *    tomcat and what worker to use.  */static int jk2_translate(request_rec *r){    jk_uriEnv_t *uriEnv;    jk_env_t *env;    if(r->proxyreq || workerEnv==NULL) {        return DECLINED;    }    uriEnv=ap_get_module_config( r->per_dir_config, &jk2_module );        /* get_env() */    env = workerEnv->globalEnv->getEnv( workerEnv->globalEnv );    /* This has been mapped to a location by apache     * In a previous ( experimental ) version we had a sub-map,     * but that's too complex for now.     */    if( uriEnv!= NULL && uriEnv->workerName != NULL) {        if( uriEnv->mbean->debug > 0 )            env->l->jkLog(env, env->l, JK_LOG_DEBUG,                           "PerDir mapping  %s=%s\n",r->uri, uriEnv->workerName);                ap_set_module_config( r->request_config, &jk2_module, uriEnv );                r->handler=JK_HANDLER;        workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );        /* This could be a sub-request, possibly from mod_dir */        if(r->main){            ap_set_module_config( r->main->request_config, &jk2_module, uriEnv );            r->main->handler=JK_HANDLER;        }        return OK;    }    /* One idea was to use "SetHandler jakarta-servlet". This doesn't       allow the setting of the worker. Having a specific SetWorker directive       at location level is more powerfull. If anyone can figure any reson       to support SetHandler, we can add it back easily */    /* Check JkMount directives, if any *//*     if( workerEnv->uriMap->size == 0 ) { *//*         workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env ); *//*         return DECLINED; *//*     } */        /* XXX TODO: Split mapping, similar with tomcat. First step will       be a quick test ( the context mapper ), with no allocations.       If positive, we'll fill a ws_service_t and do the rewrite and       the real mapping.     */    uriEnv = workerEnv->uriMap->mapUri(env, workerEnv->uriMap,                ap_get_server_name(r),                ap_get_server_port(r),                r->uri);    if( uriEnv== NULL || uriEnv->workerName == NULL) {        workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );        return DECLINED;    }    ap_set_module_config( r->request_config, &jk2_module, uriEnv );    r->handler=JK_HANDLER;    /* This could be a sub-request, possibly from mod_dir */    if(r->main){        ap_set_module_config( r->main->request_config, &jk2_module, uriEnv );        r->main->handler=JK_HANDLER;    }    if( uriEnv->mbean->debug > 0 )        env->l->jkLog(env, env->l, JK_LOG_DEBUG,                       "mod_jk.translate(): uriMap %s %s %#lx\n",                      r->uri, uriEnv->workerName, uriEnv->worker);    workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );    return OK;}/* XXX Can we use type checker step to set our stuff ? *//* bypass the directory_walk and file_walk for non-file requests */static int jk2_map_to_storage(request_rec *r){    jk_uriEnv_t *uriEnv=ap_get_module_config( r->request_config, &jk2_module );        if( uriEnv != NULL ) {            /* First find just the name of the file, no directory */        r->filename = (char *)apr_filename_of_pathname(r->uri);        /* Only if sub-request for a directory, most likely from mod_dir */        if (r->main && r->main->filename &&            !*apr_filename_of_pathname(r->main->filename)){            /* The filename from the main request will be set to what should             * be picked up, aliases included. Tomcat will need to know about             * those aliases or things won't work for them. Normal files             * should be fine. */            /* Need absolute path to stat */            if (apr_filepath_merge(&r->filename,                                   r->main->filename, r->filename,                                   APR_FILEPATH_SECUREROOT |                                   APR_FILEPATH_TRUENAME,                                   r->pool)                != APR_SUCCESS){              return DECLINED; /* We should never get here, very bad */            }            /* Stat the file so that mod_dir knows it's there */            apr_stat(&r->finfo, r->filename, APR_FINFO_TYPE, r->pool);        }        return OK;    }    return DECLINED;}static void jk2_register_hooks(apr_pool_t *p){    ap_hook_handler(jk2_handler, NULL, NULL, APR_HOOK_MIDDLE);    ap_hook_post_config(jk2_post_config,NULL,NULL,APR_HOOK_MIDDLE);    /* Force the mpm to run before us and set the scoreboard image */    ap_hook_child_init(jk2_child_init,NULL,NULL,APR_HOOK_LAST);    ap_hook_translate_name(jk2_translate,NULL,NULL,APR_HOOK_FIRST);    ap_hook_map_to_storage(jk2_map_to_storage, NULL, NULL, APR_HOOK_MIDDLE);}module AP_MODULE_DECLARE_DATA jk2_module ={    STANDARD20_MODULE_STUFF,    jk2_create_dir_config, /*  dir config creater */    jk2_merge_dir_config,  /* dir merger --- default is to override */    jk2_create_config,     /* server config */    jk2_merge_config,      /* merge server config */    jk2_cmds,              /* command ap_table_t */    jk2_register_hooks     /* register hooks */};#ifdef WIN32BOOL WINAPI DllMain(HINSTANCE hInst,        // Instance Handle of the DLL                    ULONG ulReason,         // Reason why NT called this DLL                    LPVOID lpReserved)      // Reserved parameter for future use{    GetModuleFileName( hInst, file_name, sizeof(file_name));    return TRUE;}#endif

⌨️ 快捷键说明

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