hgomez 2004/02/27 00:34:18
Modified: jk/native2/server/apache2 mod_jk2.c
jk/native2/common jk_worker_lb.c
jk/native2/include jk_worker.h
Log:
Fix problem with ErrorDocument and Apache 2.0.
By default now, WE DON'T touch the headers
Revision Changes Path
1.68 +12 -5 jakarta-tomcat-connectors/jk/native2/server/apache2/mod_jk2.c
Index: mod_jk2.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/apache2/mod_jk2.c,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -r1.67 -r1.68
--- mod_jk2.c 24 Feb 2004 08:44:42 -0000 1.67
+++ mod_jk2.c 27 Feb 2004 08:34:18 -0000 1.68
@@ -22,7 +22,7 @@
***************************************************************************/
/*
- * mod_jk: keeps all servlet/jakarta related ramblings together.
+ * mod_jk2: keeps all servlet/jakarta related ramblings together.
*/
@@ -697,7 +697,7 @@
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;
+ return HTTP_INTERNAL_SERVER_ERROR;
}
if( uriEnv->mbean->debug > 0 )
@@ -752,9 +752,16 @@
}
env->l->jkLog(env, env->l, JK_LOG_ERROR,
- "mod_jk.handler() Error connecting to tomcat %d\n", rc);
+ "mod_jk.handler() Error connecting to tomcat %d, status %d\n",
rc, s->status);
+
workerEnv->globalEnv->releaseEnv( workerEnv->globalEnv, env );
- return 500;
+
+ /* In case of error, if service() set a status code, send it back */
+ /* Else fallback to HTTP_INTERNAL_SERVER_ERROR (500). */
+ if (s->status != 0)
+ return s->status;
+ else
+ return HTTP_INTERNAL_SERVER_ERROR;
}
/** Use the internal mod_jk mappings to find if this is a request for
1.37 +24 -16 jakarta-tomcat-connectors/jk/native2/common/jk_worker_lb.c
Index: jk_worker_lb.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_worker_lb.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- jk_worker_lb.c 24 Feb 2004 08:44:40 -0000 1.36
+++ jk_worker_lb.c 27 Feb 2004 08:34:18 -0000 1.37
@@ -326,7 +326,7 @@
}
/* Initialize here the recovery POST buffer */
- s->reco_buf = jk2_msg_ajp_create( env, s->pool, 0);
+ s->reco_buf = jk2_msg_ajp_create( env, s->pool, 0);
s->reco_status = RECO_INITED;
while(1) {
@@ -356,17 +356,21 @@
s->status=lb->noWorkerCode; /* SERVICE_UNAVAILABLE is the default */
}
- if( s->status == 302 ) {
- s->headers_out->put(env, s->headers_out,
- "Location", lb->noWorkerMsg, NULL);
- s->head(env, s );
- } else {
- s->headers_out->put(env, s->headers_out,
- "Content-Type", "text/html", NULL);
- s->head(env, s );
- s->jkprintf(env, s, lb->noWorkerMsg );
- }
-
+ /* Don't touch headers if noErrorHeader set to TRUE, ie ErrorDocument
in Apache via mod_alias */
+ if (! lb->noErrorHeader) {
+ /* XXX: I didn't understand the 302, since s->status is
lb->hwBalanceErr or lb->noWorkerCode */
+ /* Both could be set in workers2.properties so ..... */
+ if( s->status == 302 ) {
+ s->headers_out->put(env, s->headers_out,
+ "Location", lb->noWorkerMsg, NULL);
+ s->head(env, s );
+ } else {
+ s->headers_out->put(env, s->headers_out,
+ "Content-Type", "text/html", NULL);
+ s->head(env, s );
+ s->jkprintf(env, s, lb->noWorkerMsg );
+ }
+ }
s->afterRequest( env, s);
lb_priv->error_time = time(NULL);
return JK_ERR;
@@ -473,10 +477,10 @@
static char *jk2_worker_lb_multiValueInfo[]={"worker", NULL };
static char *jk2_worker_lb_setAttributeInfo[]={"attempts", "stickySession",
"recovery", "timeout",
- "hwBalanceErr", "noWorkerMsg",
"noWorkerCode", "worker", NULL };
+ "hwBalanceErr", "noErrorHeader",
"noWorkerMsg", "noWorkerCode", "worker", NULL };
static char *jk2_worker_lb_getAttributeInfo[]={"attempts", "stickySession",
"recovery", "timeout",
- "hwBalanceErr", "noWorkerMsg",
"noWorkerCode", "workers", NULL };
+ "hwBalanceErr", "noErrorHeader",
"noWorkerMsg", "noWorkerCode", "workers", NULL };
static void * JK_METHOD jk2_lb_getAttribute(jk_env_t *env, jk_bean_t *mbean,
@@ -494,6 +498,8 @@
return jk2_env_itoa( env, lb->noWorkerCode);
} else if( strcmp( name, "hwBalanceErr") == 0 ) {
return jk2_env_itoa( env, lb->hwBalanceErr);
+ } else if( strcmp( name, "noErrorHeader") == 0 ) {
+ return jk2_env_itoa( env, lb->noErrorHeader);
} else if( strcmp( name, "timeout") == 0 ) {
return jk2_env_itoa( env, lb_priv->timeout);
} else if( strcmp( name, "recovery") == 0 ) {
@@ -534,6 +540,8 @@
lb->noWorkerCode=atoi( value );
} else if( strcmp( name, "hwBalanceErr") == 0 ) {
lb->hwBalanceErr=atoi( value );
+ } else if( strcmp( name, "noErrorHeader") == 0 ) {
+ lb->noErrorHeader=atoi( value );
} else if( strcmp( name, "timeout") == 0 ) {
lb_priv->timeout=atoi( value );
} else if( strcmp( name, "recovery") == 0 ) {
@@ -637,10 +645,10 @@
w->hwBalanceErr=0;
w->noWorkerCode=503;
w->noWorkerMsg=NO_WORKER_MSG;
-
+ /* Let Apache handle the error via ErrorDocument and mod_alias */
+ w->noErrorHeader=1;
w->workerEnv=env->getByName( env, "workerEnv" );
w->workerEnv->addWorker( env, w->workerEnv, w );
return JK_OK;
}
-
1.35 +6 -2 jakarta-tomcat-connectors/jk/native2/include/jk_worker.h
Index: jk_worker.h
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/include/jk_worker.h,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -r1.34 -r1.35
--- jk_worker.h 24 Feb 2004 08:44:39 -0000 1.34
+++ jk_worker.h 27 Feb 2004 08:34:18 -0000 1.35
@@ -50,7 +50,6 @@
in error state, we move to the next leve.
*/
#define JK_LB_LEVELS 4
-#define JK_LB_MAX_WORKERS 256
/* XXX Separate this in 2 structures: jk_lb.h and jk_ajp.h.
Using 'worker' as a generic term is confusing, the objects are very different.
@@ -222,6 +221,11 @@
*/
char *noWorkerMsg;
int noWorkerCode;
+
+ /* jk2 shouldn't set headers if noErrorHeader (true by default)
+ * It will allow Apache 2.0 to handle correctly ErrorDocument
+ */
+ int noErrorHeader;
int workerCnt[JK_LB_LEVELS];
jk_worker_t *workerTables[JK_LB_LEVELS][JK_LB_MAX_WORKERS];
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]