hgomez 01/07/02 14:17:10
Modified: jk/native/common jk_ajp14_worker.c
Log:
At least, the discovery (autoconf) is implemented
Will have to focus next on where to get virtuals
J-T-C peoples don't forget about SSL case which is
also a virtual (host:443)
Revision Changes Path
1.9 +192 -85 jakarta-tomcat-connectors/jk/native/common/jk_ajp14_worker.c
Index: jk_ajp14_worker.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_ajp14_worker.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- jk_ajp14_worker.c 2001/06/23 16:04:12 1.8
+++ jk_ajp14_worker.c 2001/07/02 21:17:07 1.9
@@ -58,115 +58,103 @@
/***************************************************************************
* Description: AJP14 next generation Bi-directional protocol. *
* Author: Henri Gomez <[EMAIL PROTECTED]> *
- * Version: $Revision: 1.8 $ *
+ * Version: $Revision: 1.9 $ *
***************************************************************************/
#include "jk_context.h"
#include "jk_ajp14_worker.h"
-/* -------------------- Method -------------------- */
-static int JK_METHOD validate(jk_worker_t *pThis,
- jk_map_t *props,
- jk_worker_env_t *we,
- jk_logger_t *l)
-{
- ajp_worker_t *aw;
- char * secret_key;
- if (ajp_validate(pThis, props, we, l, AJP14_PROTO) == JK_FALSE)
- return JK_FALSE;
+/*
+ * AJP14 Autoconf Phase
+ *
+ * CONTEXT QUERY / REPLY
+ */
- aw = pThis->worker_private;
+#define MAX_URI_SIZE 512
- secret_key = jk_get_worker_secret_key(props, aw->name);
+static int handle_discovery(ajp_endpoint_t *ae,
+ jk_worker_env_t *we,
+ jk_msg_buf_t *msg,
+ jk_logger_t *l)
+{
+ int cmd;
+ int i,j;
+ jk_login_service_t *jl = ae->worker->login;
+ jk_context_item_t *ci;
+ jk_context_t *c;
+ char *old;
+ char *buf;
- if ((!secret_key) || (!strlen(secret_key))) {
- jk_log(l, JK_LOG_ERROR, "validate error, empty or missing
secretkey\n");
- return JK_FALSE;
- }
+#ifndef TESTME
- /* jk_log(l, JK_LOG_DEBUG, "Into ajp14:validate - secret_key=%s\n",
secret_key); */
- return JK_TRUE;
-}
+ ajp14_marshal_context_query_into_msgb(msg, we->virtual, l);
-static int JK_METHOD get_endpoint(jk_worker_t *pThis,
- jk_endpoint_t **pend,
- jk_logger_t *l)
-{
- return (ajp_get_endpoint(pThis, pend, l, AJP14_PROTO));
-}
+ jk_log(l, JK_LOG_DEBUG, "Into ajp14:discovery - send query\n");
-static int JK_METHOD init(jk_worker_t *pThis,
- jk_map_t *props,
- jk_worker_env_t *we,
- jk_logger_t *l)
-{
- ajp_worker_t *aw;
- ajp_endpoint_t *ae;
- jk_endpoint_t *je;
- /*char *secret_key; unused */
+ if (ajp_connection_tcp_send_message(ae, msg, l) != JK_TRUE)
+ return JK_FALSE;
- if (ajp_init(pThis, props, we, l, AJP14_PROTO) == JK_FALSE)
- return JK_FALSE;
+ jk_log(l, JK_LOG_DEBUG, "Into ajp14:discovery - wait context reply\n");
- aw = pThis->worker_private;
+ jk_b_reset(msg);
- /* Set Secret Key (used at logon time) */
- aw->login->secret_key = strdup(jk_get_worker_secret_key(props, aw->name));
+ if (ajp_connection_tcp_get_message(ae, msg, l) != JK_TRUE)
+ return JK_FALSE;
- if (aw->login->secret_key == NULL) {
- jk_log(l, JK_LOG_ERROR, "can't malloc secret_key\n");
- return JK_FALSE;
- }
+ if ((cmd = jk_b_get_byte(msg)) != AJP14_CONTEXT_INFO_CMD) {
+ jk_log(l, JK_LOG_ERROR, "Error ajp14:discovery - awaited command %d,
received %d\n", AJP14_CONTEXT_INFO_CMD, cmd);
+ return JK_FALSE;
+ }
- /* Set WebServerName (used at logon time) */
- aw->login->web_server_name = strdup(we->server_name);
+ if (context_alloc(&c, we->virtual) != JK_TRUE) {
+ jk_log(l, JK_LOG_ERROR, "Error ajp14:discovery - can't allocate context
room\n");
+ return JK_FALSE;
+ }
+
+ if (ajp14_unmarshal_context_info(msg, c, l) != JK_TRUE) {
+ jk_log(l, JK_LOG_ERROR, "Error ajp14:discovery - can't get context
reply\n");
+ return JK_FALSE;
+ }
- if (aw->login->web_server_name == NULL) {
- jk_log(l, JK_LOG_ERROR, "can't malloc web_server_name\n");
- return JK_FALSE;
- }
+ jk_log(l, JK_LOG_DEBUG, "Into ajp14:discovery - received context\n");
- if (get_endpoint(pThis, &je, l) == JK_FALSE)
- return JK_FALSE;
-
- ae = je->endpoint_private;
+ buf = malloc(MAX_URI_SIZE); /* Really a very long URI */
- if (ajp_connect_to_endpoint(ae, l) == JK_TRUE) {
+ if (! buf) {
+ jk_log(l, JK_LOG_ERROR, "Error ajp14:discovery - can't alloc buf\n");
+ return JK_FALSE;
+ }
- /* connection stage passed - try to get context info
- * this is the long awaited autoconf feature :)
- */
+ for (i = 0; i < c->size; i++) {
+ ci = c->contexts[i];
+ for (j = 0; j < ci->size; j++) {
- ajp_close_endpoint(ae, l);
- }
+#ifndef USE_SPRINTF
+ snprintf(buf, MAX_URI_SIZE - 1, "/%s/%s", ci->cbase, ci->uris[j]);
+#else
+ sprintf(buf, "/%s/%s", ci->cbase, ci->uris[j]);
+#endif
- return JK_TRUE;
-}
-
+ jk_log(l, JK_LOG_INFO, "Into ajp14:discovery - worker %s will handle
uri %s in context %s [%s]\n",
+ ae->worker->name, ci->uris[j], ci->cbase, buf);
-static int JK_METHOD destroy(jk_worker_t **pThis,
- jk_logger_t *l)
-{
- ajp_worker_t *aw = (*pThis)->worker_private;
+ uri_worker_map_add(we->uri_to_worker, buf, ae->worker->name, l);
+ }
+ }
- if (aw->login) {
+ free(buf);
+ context_free(&c);
- if (aw->login->web_server_name) {
- free(aw->login->web_server_name);
- aw->login->web_server_name = NULL;
- }
+#else
- if (aw->login->secret_key) {
- free(aw->login->secret_key);
- aw->login->secret_key = NULL;
- }
+ uri_worker_map_add(we->uri_to_worker, "/examples/servlet/*", ae->worker->name,
l);
+ uri_worker_map_add(we->uri_to_worker, "/examples/*.jsp", ae->worker->name, l);
+ uri_worker_map_add(we->uri_to_worker, "/examples/*.gif", ae->worker->name, l);
- free(aw->login);
- aw->login = NULL;
- }
+#endif
- return (ajp_destroy(pThis, l, AJP14_PROTO));
+ return JK_TRUE;
}
/*
@@ -237,11 +225,6 @@
return JK_FALSE;
}
-/*
- * AJP14 - Login Handler - we'll have a more secure
- * login support in AJP14
- */
-
static int logon(ajp_endpoint_t *ae,
jk_logger_t *l)
{
@@ -260,6 +243,130 @@
return rc;
}
+static int discovery(ajp_endpoint_t *ae,
+ jk_worker_env_t *we,
+ jk_logger_t *l)
+{
+ jk_pool_t *p = &ae->pool;
+ jk_msg_buf_t *msg;
+ int rc;
+
+ jk_log(l, JK_LOG_DEBUG, "Into ajp14:discovery\n");
+
+ msg = jk_b_new(p);
+ jk_b_set_buffer_size(msg, DEF_BUFFER_SZ);
+
+ if ((rc = handle_discovery(ae, we, msg, l)) == JK_FALSE)
+ ajp_close_endpoint(ae, l);
+
+ return rc;
+}
+
+/* -------------------- Method -------------------- */
+static int JK_METHOD validate(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we,
+ jk_logger_t *l)
+{
+ ajp_worker_t *aw;
+ char * secret_key;
+
+ if (ajp_validate(pThis, props, we, l, AJP14_PROTO) == JK_FALSE)
+ return JK_FALSE;
+
+ aw = pThis->worker_private;
+
+ secret_key = jk_get_worker_secret_key(props, aw->name);
+
+ if ((!secret_key) || (!strlen(secret_key))) {
+ jk_log(l, JK_LOG_ERROR, "validate error, empty or missing
secretkey\n");
+ return JK_FALSE;
+ }
+
+ /* jk_log(l, JK_LOG_DEBUG, "Into ajp14:validate - secret_key=%s\n",
secret_key); */
+ return JK_TRUE;
+}
+
+static int JK_METHOD get_endpoint(jk_worker_t *pThis,
+ jk_endpoint_t **pend,
+ jk_logger_t *l)
+{
+ return (ajp_get_endpoint(pThis, pend, l, AJP14_PROTO));
+}
+
+static int JK_METHOD init(jk_worker_t *pThis,
+ jk_map_t *props,
+ jk_worker_env_t *we,
+ jk_logger_t *l)
+{
+ ajp_worker_t *aw;
+ ajp_endpoint_t *ae;
+ jk_endpoint_t *je;
+ int rc;
+
+ if (ajp_init(pThis, props, we, l, AJP14_PROTO) == JK_FALSE)
+ return JK_FALSE;
+
+ aw = pThis->worker_private;
+
+ /* Set Secret Key (used at logon time) */
+ aw->login->secret_key = strdup(jk_get_worker_secret_key(props, aw->name));
+
+ if (aw->login->secret_key == NULL) {
+ jk_log(l, JK_LOG_ERROR, "can't malloc secret_key\n");
+ return JK_FALSE;
+ }
+
+ /* Set WebServerName (used at logon time) */
+ aw->login->web_server_name = strdup(we->server_name);
+
+ if (aw->login->web_server_name == NULL) {
+ jk_log(l, JK_LOG_ERROR, "can't malloc web_server_name\n");
+ return JK_FALSE;
+ }
+
+ if (get_endpoint(pThis, &je, l) == JK_FALSE)
+ return JK_FALSE;
+
+ ae = je->endpoint_private;
+
+ if (ajp_connect_to_endpoint(ae, l) == JK_TRUE) {
+
+ /* connection stage passed - try to get context info
+ * this is the long awaited autoconf feature :)
+ */
+ rc = discovery(ae, we, l);
+ ajp_close_endpoint(ae, l);
+ return rc;
+ }
+
+ return JK_TRUE;
+}
+
+
+static int JK_METHOD destroy(jk_worker_t **pThis,
+ jk_logger_t *l)
+{
+ ajp_worker_t *aw = (*pThis)->worker_private;
+
+ if (aw->login) {
+
+ if (aw->login->web_server_name) {
+ free(aw->login->web_server_name);
+ aw->login->web_server_name = NULL;
+ }
+
+ if (aw->login->secret_key) {
+ free(aw->login->secret_key);
+ aw->login->secret_key = NULL;
+ }
+
+ free(aw->login);
+ aw->login = NULL;
+ }
+
+ return (ajp_destroy(pThis, l, AJP14_PROTO));
+}
int JK_METHOD ajp14_worker_factory(jk_worker_t **w,
const char *name,