DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT <http://nagoya.apache.org/bugzilla/show_bug.cgi?id=18472>. ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=18472 mod_jk2 doesn't handle vhosts correctly when using the JkUriSet commands ------- Additional Comments From [EMAIL PROTECTED] 2003-04-02 10:21 ------- here's an apache2 version diff -c against the tomcat 4.1.21 release of mod_jk2.c to fix the same problems as the apache13 version. (This sets the virtual host in the /jkstatus page as well as the apache13 version) *** ../../jakarta-tomcat-connectors-4.1.21-src-ORIG/jk/native2/server/apache2/mod_jk2.c 2003-02-25 16:30:56.000000000 +0000 --- native2/server/apache2/mod_jk2.c 2003-03-31 10:25:49.000000000 +0100 *************** *** 77,82 **** --- 77,88 ---- static char file_name[_MAX_PATH]; #endif + /* This is used to ensure that jk2_create_dir_config creates unique + * dir mappings. This prevents vhost configs as configured through + * httpd.conf from getting crossed. + */ + static int dirCounter=0; + #define JK_HANDLER ("jakarta-servlet2") #define JK_MAGIC_TYPE ("application/x-jakarta-servlet2") *************** *** 171,177 **** jk_uriEnv_t *uriEnv=(jk_uriEnv_t *)per_dir; uriEnv->mbean->setAttribute( workerEnv->globalEnv, uriEnv->mbean, (char *)name, (void *)val ); ! /* fprintf(stderr, "JkUriSet %s %s dir=%s args=%s\n", */ /* uriEnv->workerName, cmd->path, */ /* cmd->directive->directive, */ --- 177,211 ---- jk_uriEnv_t *uriEnv=(jk_uriEnv_t *)per_dir; uriEnv->mbean->setAttribute( workerEnv->globalEnv, uriEnv->mbean, (char *)name, (void *)val ); ! ! char *tmp, *tmp2; ! char *tmp_virtual=NULL, *tmp_full_url=NULL; ! server_rec *s = cmd->server; ! ! // all of the objects that get passed in now are unique. create_dir adds a incrementing counter to the ! // uri that is used to create the object! ! // Here we must now 'fix' the content of the object passed in. ! // Apache doesn't care what we do here as it has the reference to the unique object that has been ! // created. What we need to do is ensure that the data given to mod_jk2 is correct. Hopefully in the long run ! // we can ignore some of the mod_jk details... ! ! // if applicable we will set the hostname etc variables. ! if ( s->server_hostname != NULL && (uriEnv->virtual==NULL || !strchr( uriEnv->virtual, ':') || uriEnv->port != s->port )) ! { ! tmp_virtual = (char *) ap_pcalloc(cmd->pool, sizeof(char *) * (strlen(s->server_hostname) + 8 )) ; ! tmp_full_url = (char *) ap_pcalloc(cmd->pool, sizeof(char *) * (strlen(s->server_hostname) + strlen(uriEnv->uri)+8 )) ; ! sprintf(tmp_virtual, "%s:%d", s->server_hostname, s->port); ! sprintf(tmp_full_url, "%s:%d%s", s->server_hostname, s->port, uriEnv->uri ); ! ! uriEnv->mbean->setAttribute( workerEnv->globalEnv, uriEnv->mbean, "uri", tmp_full_url); ! uriEnv->mbean->setAttribute( workerEnv->globalEnv, uriEnv->mbean, "path", cmd->path); ! uriEnv->name=tmp_virtual; ! uriEnv->virtual=tmp_virtual; ! ! } ! // now lets actually add the parameter set in the <Location> block ! uriEnv->mbean->setAttribute( workerEnv->globalEnv, uriEnv->mbean, (char *)name, (void *)val ); ! /* fprintf(stderr, "JkUriSet %s %s dir=%s args=%s\n", */ /* uriEnv->workerName, cmd->path, */ /* cmd->directive->directive, */ *************** *** 201,212 **** /* We don't know the vhost yet - so path is not * unique. We'll have to generate a unique name */ jk_bean_t *jkb=workerEnv->globalEnv->createBean2( workerEnv->globalEnv, workerEnv->pool, "uri", ! (path==NULL)? "":path ); jk_uriEnv_t *newUri = jkb->object; newUri->workerEnv=workerEnv; ! newUri->mbean->setAttribute( workerEnv->globalEnv, newUri->mbean, "path", path ); return newUri; } --- 235,258 ---- /* We don't know the vhost yet - so path is not * unique. We'll have to generate a unique name */ + char *tmp=NULL; + int a=0; + + path==NULL?a=10:(a=strlen(path)+10); + tmp = (char *) ap_pcalloc(p, sizeof(char *) * (a ) ) ; + sprintf(tmp, "%s-%d", path==NULL?"":path, dirCounter++); + jk_bean_t *jkb=workerEnv->globalEnv->createBean2( workerEnv->globalEnv, workerEnv->pool, "uri", ! tmp ); jk_uriEnv_t *newUri = jkb->object; newUri->workerEnv=workerEnv; ! newUri->mbean->setAttribute( workerEnv->globalEnv, newUri->mbean, "path", tmp ); ! // I'm hoping that setting the id won't break anything. I havn't noticed it breaking anything. ! newUri->mbean->id=(dirCounter -1); ! // this makes the display in the status display make more sense ! newUri->mbean->localName=path; ! return newUri; } *************** *** 215,260 **** { jk_uriEnv_t *child =(jk_uriEnv_t *)childv; jk_uriEnv_t *parent = (jk_uriEnv_t *)parentv; ! if( child->uri==NULL ) ! return parentv; ! ! if( child->merged != JK_TRUE ) { ! /* Merge options from parent. ! */ ! if( parent->mbean->debug > 0 ) /* Inherit debugging */ ! child->mbean->debug = parent->mbean->debug; ! ! if( child->workerName==NULL ) { ! child->workerName=parent->workerName; ! child->worker=parent->worker; ! } ! if( child->virtual==NULL ) { ! child->virtual=parent->virtual; ! child->aliases=parent->aliases; ! } ! if( child->contextPath==NULL ) { ! child->contextPath=parent->contextPath; ! child->ctxt_len=parent->ctxt_len; ! } ! /* XXX Shuld we merge env vars ? ! */ ! ! /* When we merged to top - mark and stop duplicating the work ! */ ! if( parent->uri == NULL ) ! child->merged=JK_TRUE; ! ! ! if( child->mbean->debug > -1 ) { ! fprintf(stderr, "mod_jk2:mergeDirConfig() Merged dir config %#lx %s %s %s %s\n", ! child, child->uri, parent->uri, child->workerName, parent->workerName); ! fprintf(stderr, "mod_jk2:mergeDirConfig() Merged dir config %#lx %s %s %s %s\n", ! child, child->uri, parent->uri, child->workerName, parent->workerName); ! } ! } - return childv; } /** Basic initialization for jk2. --- 261,288 ---- { jk_uriEnv_t *child =(jk_uriEnv_t *)childv; jk_uriEnv_t *parent = (jk_uriEnv_t *)parentv; + jk_uriEnv_t *winner=NULL; ! if ( child == NULL || child->uri==NULL || child->workerName==NULL ) ! winner=parent; ! else if ( parent == NULL || parent->uri ==NULL || parent->workerName==NULL ) ! winner=child; ! // interresting bit... so far they are equal ... ! else if ( strlen(parent->uri) > strlen(child->uri) ) ! winner=parent; ! else ! winner=child; ! ! /*if ( winner == child ) ! fprintf(stderr, "Going with the child\n"); ! else if ( winner == parent ) ! fprintf(stderr, "Going with the parent\n"); ! else ! fprintf(stderr, "Going with NULL\n"); ! */ ! ! return (void *) winner; } /** Basic initialization for jk2. --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]