📄 mod_jk2.c
字号:
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 + -