costin 01/12/04 15:59:01 Modified: jk/native2/server/apache2 mod_jk.c Log: Updated. Started to add the per_dir structure that will allow JkSetWorker inside <Locations>. This in turn will allow full 'native' configuration for apache ( i.e. using SetHandler and <Location> instead of JkMount ). ( all is optional of course, JkMount and uriWorkerMap remain the default ). In addition per_dir config allows faster access to jk info. Added comments about using request_config instead of notes to pass worker information ( plus per_dir_config ). jk_translate will detect SetHandler-style configuration and do the shortcut. Revision Changes Path 1.5 +100 -73 jakarta-tomcat-connectors/jk/native2/server/apache2/mod_jk.c Index: mod_jk.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/apache2/mod_jk.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- mod_jk.c 2001/12/04 19:12:52 1.4 +++ mod_jk.c 2001/12/04 23:59:01 1.5 @@ -60,7 +60,7 @@ * Description: Apache 2 plugin for Jakarta/Tomcat * * Author: Gal Shachor <[EMAIL PROTECTED]> * * Henri Gomez <[EMAIL PROTECTED]> * - * Version: $Revision: 1.4 $ * + * Version: $Revision: 1.5 $ * ***************************************************************************/ /* @@ -104,16 +104,6 @@ AP_MODULE_DECLARE_DATA module jk_module; -struct apache_private_data { - jk_pool_t p; - - int response_started; - int read_body_started; - request_rec *r; -}; - -typedef struct apache_private_data apache_private_data_t; - static int JK_METHOD ws_start_response(jk_ws_service_t *s, int status, @@ -147,8 +137,7 @@ { if(s && s->ws_private) { unsigned h; - apache_private_data_t *p = s->ws_private; - request_rec *r = p->r; + request_rec *r = (request_rec *)s->ws_private; if(!reason) { reason = ""; @@ -185,8 +174,8 @@ /* this NOP function was removed in apache 2.0 alpha14 */ /* ap_send_http_header(r); */ - p->response_started = JK_TRUE; - + s->response_started = JK_TRUE; + return JK_TRUE; } return JK_FALSE; @@ -207,16 +196,15 @@ unsigned *actually_read) { if(s && s->ws_private && b && actually_read) { - apache_private_data_t *p = s->ws_private; - if(!p->read_body_started) { - if(ap_should_client_block(p->r)) { - p->read_body_started = JK_TRUE; + if(!s->read_body_started) { + if(ap_should_client_block(s->ws_private)) { + s->read_body_started = JK_TRUE; } } - if(p->read_body_started) { + if(s->read_body_started) { long rv; - if ((rv = ap_get_client_block(p->r, b, len)) < 0) { + if ((rv = ap_get_client_block(s->ws_private, b, len)) < 0) { *actually_read = 0; } else { *actually_read = (unsigned) rv; @@ -250,8 +238,6 @@ jk_logger_t *l=s->workerEnv->l; if(s && s->ws_private && b) { - apache_private_data_t *p = s->ws_private; - if(l) { /* BUFF *bf = p->r->connection->client; */ size_t w = (size_t)l; @@ -259,7 +245,7 @@ long ll=len; char *bb=(char *)b; - if(!p->response_started) { + if(!s->response_started) { l->jkLog(l, JK_LOG_DEBUG, "Write without start, starting with defaults\n"); if(!s->start_response(s, 200, NULL, NULL, NULL, 0)) { @@ -270,7 +256,7 @@ /* Debug - try to get around rwrite */ while( ll > 0 ) { unsigned long toSend=(ll>CHUNK_SIZE) ? CHUNK_SIZE : ll; - r = ap_rwrite((const char *)bb, toSend, p->r ); + r = ap_rwrite((const char *)bb, toSend, s->ws_private ); l->jkLog(l, JK_LOG_DEBUG, "writing %ld (%ld) out of %ld \n",toSend, r, ll ); ll-=CHUNK_SIZE; @@ -285,7 +271,7 @@ /* * To allow server push. After writing full buffers */ - if(ap_rflush(p->r) != APR_SUCCESS) { + if(ap_rflush(s->ws_private) != APR_SUCCESS) { ap_log_error(APLOG_MARK, APLOG_STARTUP | APLOG_NOERRNO, 0, NULL, "mod_jk: Error flushing \n" ); return JK_FALSE; @@ -342,16 +328,15 @@ return 0; } -static int init_ws_service(apache_private_data_t *private_data, - jk_ws_service_t *s, +static int init_ws_service(jk_ws_service_t *s, jk_workerEnv_t *workerEnv) { - request_rec *r = private_data->r; - jk_logger_t *l=s->workerEnv->l; - + request_rec *r=s->ws_private; + jk_logger_t *l=workerEnv->l; apr_port_t port; - char *ssl_temp = NULL; + + s->workerEnv=workerEnv; s->jvm_route = NULL; /* Used for sticky session routing */ /* Copy in function pointers (which are really methods) */ @@ -1200,22 +1185,21 @@ if(worker) { int rc = JK_FALSE; - apache_private_data_t private_data; + jk_pool_t p; jk_ws_service_t s; jk_pool_atom_t buf[SMALL_POOL_SIZE]; - jk_open_pool(&private_data.p, buf, sizeof(buf)); + jk_open_pool(&p, buf, sizeof(buf)); s.workerEnv=workerEnv; - private_data.response_started = JK_FALSE; - private_data.read_body_started = JK_FALSE; - private_data.r = r; + s.response_started = JK_FALSE; + s.read_body_started = JK_FALSE; jk_requtil_initRequest(&s); - s.ws_private = &private_data; - s.pool = &private_data.p; + s.ws_private = r; + s.pool = &p; - if(init_ws_service(&private_data, &s, workerEnv)) { + if(init_ws_service(&s, workerEnv)) { jk_endpoint_t *end = NULL; /* Use per/thread pool ( or "context" ) to reuse the @@ -1264,7 +1248,7 @@ } } - jk_close_pool(&private_data.p); + p.close(&p); if(rc) { return OK; /* NOT r->status, even if it has changed. */ @@ -1275,6 +1259,27 @@ return DECLINED; } +static void *create_jk_dir_config(apr_pool_t *p, char *dummy) +{ + jk_uriEnv_t *new = + (jk_uriEnv_t *)apr_pcalloc(p, sizeof(jk_uriEnv_t)); + + printf("XXX Create dir config \n"); + return new; +} + + +static void *merge_jk_dir_configs(apr_pool_t *p, void *basev, void *addv) +{ + jk_uriEnv_t *base =(jk_uriEnv_t *)basev; + jk_uriEnv_t *add = (jk_uriEnv_t *)addv; + jk_uriEnv_t *new = (jk_uriEnv_t *)apr_pcalloc(p,sizeof(jk_uriEnv_t)); + + /* XXX */ + printf("XXX Merged dir config \n"); + return add; +} + /** Create default jk_config. XXX This is mostly server-independent, all servers are using something similar - should go to common. @@ -1453,44 +1458,60 @@ static int jk_translate(request_rec *r) { jk_logger_t *l; - - if(!r->proxyreq) { - jk_workerEnv_t *workerEnv = - (jk_workerEnv_t *)ap_get_module_config(r->server->module_config, - &jk_module); + jk_workerEnv_t *workerEnv; + jk_uriEnv_t *uriEnv; + + if(r->proxyreq) { + return DECLINED; + } - l=workerEnv->l; + workerEnv=(jk_workerEnv_t *)ap_get_module_config(r->server->module_config, + &jk_module); + l=workerEnv->l; - if(workerEnv) { - char *workerName; - jk_uriEnv_t *uriEnv; - - if( (r->handler != NULL ) && - (! strcmp( r->handler, JK_HANDLER ) )) { - /* Somebody already set the handler, probably manual config - * or "native" configuration, no need for extra overhead - */ - l->jkLog(l, JK_LOG_DEBUG, - "Manually mapped, no need to call uri_to_worker\n"); - return DECLINED; - } - uriEnv = workerEnv->uriMap->mapUri(workerEnv->uriMap, - NULL, - r->uri ); + if(!workerEnv) { + /* Shouldn't happen, init problems ! */ + ap_log_error(APLOG_MARK, APLOG_EMERG | APLOG_NOERRNO, 0, + NULL, "Assertion failed, workerEnv==NULL" ); + return DECLINED; + } - if(uriEnv==NULL ) { - return DECLINED; - } + if( (r->handler != NULL ) && + ( strcmp( r->handler, JK_HANDLER ) == 0 )) { + /* Somebody already set the handler, probably manual config + * or "native" configuration, no need for extra overhead + */ + l->jkLog(l, JK_LOG_DEBUG, + "Manually mapped, no need to call uri_to_worker\n"); + return DECLINED; + } - r->handler=apr_pstrdup(r->pool,JK_HANDLER); - apr_table_setn(r->notes, JK_WORKER_ID, uriEnv->worker->name); - l->jkLog(l, JK_LOG_DEBUG, - "mod_jk: map %s %s\n", r->uri, uriEnv->worker->name); - return OK; - } + { + /* XXX 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(workerEnv->uriMap,NULL,r->uri ); } + + if(uriEnv==NULL ) { + return DECLINED; + } - return DECLINED; + /* Why do we need to duplicate a constant ??? */ + r->handler=apr_pstrdup(r->pool,JK_HANDLER); + + apr_table_setn(r->notes, JK_WORKER_ID, uriEnv->worker->name); + l->jkLog(l, JK_LOG_DEBUG, + "mod_jk: map %s %s\n", r->uri, uriEnv->worker->name); + + /* XXXX XXXX + Use request_config -> it's much cheaper then notes !!! + + ap_set_module_config(r->request_config, &jk_module, XXX); + */ + return OK; } /* XXX Can we use type checker step to set our stuff ? */ @@ -1499,6 +1520,12 @@ /* bypass the directory_walk and file_walk for non-file requests */ static int jk_map_to_storage(request_rec *r) { + if( (r->handler != NULL ) && + ( strcmp( r->handler, JK_HANDLER ) == 0 )) { + + r->filename = (char *)apr_filename_of_pathname(r->uri); + printf( "XXX (httpd -X): manual mapping, map to storage OK \n" ); + } if (apr_table_get(r->notes, JK_WORKER_ID) != NULL ) { /* XXX Does this ever happens ? I doubt, it seems to be run too early - and even if it would be, what happens
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>