costin 01/12/13 11:05:31 Modified: jk/native2/server/apache2 jk_logger_apache2.c jk_pool_apr.c jk_service_apache2.c mod_jk.c Log: Renamed jk_service->finalize to afterRequest ( finalize is too overloaded ). Updates, make it compile again :-) Revision Changes Path 1.7 +2 -0 jakarta-tomcat-connectors/jk/native2/server/apache2/jk_logger_apache2.c Index: jk_logger_apache2.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/apache2/jk_logger_apache2.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- jk_logger_apache2.c 2001/12/12 23:36:01 1.6 +++ jk_logger_apache2.c 2001/12/13 19:05:31 1.7 @@ -83,6 +83,8 @@ #include "httpd.h" #include "http_log.h" +#include "jk_apache2.h" + #define HUGE_BUFFER_SIZE (8*1024) int JK_METHOD jk_logger_apache2_factory(jk_env_t *env, jk_pool_t *pool, 1.4 +5 -3 jakarta-tomcat-connectors/jk/native2/server/apache2/jk_pool_apr.c Index: jk_pool_apr.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/apache2/jk_pool_apr.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- jk_pool_apr.c 2001/12/06 22:50:25 1.3 +++ jk_pool_apr.c 2001/12/13 19:05:31 1.4 @@ -66,6 +66,8 @@ #include "apr_pools.h" #include "apr_strings.h" +#include "jk_apache2.h" + int jk_pool_apr_create( jk_pool_t **newPool, jk_pool_t *parent, apr_pool_t *aprPool ); int JK_METHOD jk_pool_apr_factory(jk_env_t *env, @@ -163,9 +165,9 @@ } /* Not used yet */ -int JK_METHOD jk_pool_apr_factory(jk_env_t *env, jk_pool_t *pool, - void **result, - char *type, char *name) +int jk_pool_apr_factory(jk_env_t *env, jk_pool_t *pool, + void **result, + char *type, char *name) { jk_pool_t *_this=(jk_pool_t *)calloc( 1, sizeof(jk_pool_t)); 1.2 +6 -7 jakarta-tomcat-connectors/jk/native2/server/apache2/jk_service_apache2.c Index: jk_service_apache2.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/apache2/jk_service_apache2.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- jk_service_apache2.c 2001/12/13 18:50:33 1.1 +++ jk_service_apache2.c 2001/12/13 19:05:31 1.2 @@ -59,7 +59,7 @@ * Description: Apache 2 plugin for Jakarta/Tomcat * Author: Gal Shachor <[EMAIL PROTECTED]> * Henri Gomez <[EMAIL PROTECTED]> - * Version: $Revision: 1.1 $ + * Version: $Revision: 1.2 $ */ #include "apu_compat.h" @@ -276,11 +276,10 @@ jk_endpoint_t *e, void *serverObj) { - request_rec *r=s->ws_private; - jk_logger_t *l=workerEnv->l; apr_port_t port; char *ssl_temp = NULL; jk_workerEnv_t *workerEnv=e->worker->workerEnv; + jk_logger_t *l=workerEnv->l; request_rec *r=serverObj; /* Common initialization */ @@ -495,7 +494,7 @@ * jk shouldn't do it instead, and the user should get the * error message ! */ -static int jk_service_apache2_finalize(jk_ws_service_t *s ) +static void jk_service_apache2_afterRequest(jk_ws_service_t *s ) { if (s->content_read < s->content_length || @@ -521,10 +520,10 @@ { jk_ws_service_t *s = *result; if( s==NULL ) { - s=(jk_ws_service_t *)pool->calloc(pool, sizeof(jk_service_t)); + s=(jk_ws_service_t *)pool->calloc(pool, sizeof(jk_ws_service_t)); } - if(l==NULL ) { + if(s==NULL ) { return JK_FALSE; } @@ -532,7 +531,7 @@ s->read = ws_read; s->write = ws_write; s->init = init_ws_service; - s->finalize = jk_service_apache2_finalize; + s->afterRequest = jk_service_apache2_afterRequest; *result=(void *)s; 1.10 +47 -455 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.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- mod_jk.c 2001/12/12 22:07:25 1.9 +++ mod_jk.c 2001/12/13 19:05:31 1.10 @@ -59,7 +59,7 @@ * Description: Apache 2 plugin for Jakarta/Tomcat * * Author: Gal Shachor <[EMAIL PROTECTED]> * * Henri Gomez <[EMAIL PROTECTED]> * - * Version: $Revision: 1.9 $ * + * Version: $Revision: 1.10 $ * ***************************************************************************/ /* @@ -93,422 +93,16 @@ #include "jk_uriMap.h" #include "jk_requtil.h" +#include "jk_apache2.h" + #define JK_HANDLER ("jakarta-servlet") +#define JK_CTL_HANDLER ("jakarta-ctl") #define JK_MAGIC_TYPE ("application/x-jakarta-servlet") -#define NULL_FOR_EMPTY(x) ((x && !strlen(x)) ? NULL : x) - module AP_MODULE_DECLARE_DATA jk_module; - -static int JK_METHOD ws_start_response(jk_ws_service_t *s, - int status, - const char *reason, - const char * const *header_names, - const char * const *header_values, - unsigned num_of_headers); - -static int JK_METHOD ws_read(jk_ws_service_t *s, - void *b, - unsigned len, - unsigned *actually_read); - -static void init_jk( apr_pool_t *pconf,jk_workerEnv_t *workerEnv, server_rec *s ); - -static int JK_METHOD ws_write(jk_ws_service_t *s, - const void *b, - unsigned l); - - -/* ========================================================================= */ -/* JK Service step callbacks */ -/* ========================================================================= */ - -static int JK_METHOD ws_start_response(jk_ws_service_t *s, - int status, - const char *reason, - const char * const *header_names, - const char * const *header_values, - unsigned num_of_headers) -{ - if(s && s->ws_private) { - unsigned h; - request_rec *r = (request_rec *)s->ws_private; - - if(!reason) { - reason = ""; - } - r->status = status; - r->status_line = apr_psprintf(r->pool, "%d %s", status, reason); - - for(h = 0 ; h < num_of_headers ; h++) { - if(!strcasecmp(header_names[h], "Content-type")) { - char *tmp = apr_pstrdup(r->pool, header_values[h]); - ap_content_type_tolower(tmp); - r->content_type = tmp; - } else if(!strcasecmp(header_names[h], "Location")) { - apr_table_set(r->headers_out, - header_names[h], header_values[h]); - } else if(!strcasecmp(header_names[h], "Content-Length")) { - apr_table_set(r->headers_out, - header_names[h], header_values[h]); - } else if(!strcasecmp(header_names[h], "Transfer-Encoding")) { - apr_table_set(r->headers_out, - header_names[h], header_values[h]); - } else if(!strcasecmp(header_names[h], "Last-Modified")) { - /* - * If the script gave us a Last-Modified header, we can't just - * pass it on blindly because of restrictions on future values. - */ - ap_update_mtime(r, ap_parseHTTPdate(header_values[h])); - ap_set_last_modified(r); - } else { - apr_table_add(r->headers_out, - header_names[h], header_values[h]); - } - } - - /* this NOP function was removed in apache 2.0 alpha14 */ - /* ap_send_http_header(r); */ - s->response_started = JK_TRUE; - - return JK_TRUE; - } - return JK_FALSE; -} - -/* - * Read a chunk of the request body into a buffer. Attempt to read len - * bytes into the buffer. Write the number of bytes actually read into - * actually_read. - * - * Think of this function as a method of the apache1.3-specific subclass of - * the jk_ws_service class. Think of the *s param as a "this" or "self" - * pointer. - */ -static int JK_METHOD ws_read(jk_ws_service_t *s, - void *b, - unsigned len, - unsigned *actually_read) -{ - if(s && s->ws_private && b && actually_read) { - if(!s->read_body_started) { - if(ap_should_client_block(s->ws_private)) { - s->read_body_started = JK_TRUE; - } - } - - if(s->read_body_started) { - long rv; - if ((rv = ap_get_client_block(s->ws_private, b, len)) < 0) { - *actually_read = 0; - } else { - *actually_read = (unsigned) rv; - } - return JK_TRUE; - } - } - return JK_FALSE; -} - -/* - * Write a chunk of response data back to the browser. If the headers - * haven't yet been sent over, send over default header values (Status = - * 200, basically). - * - * Write len bytes from buffer b. - * - * Think of this function as a method of the apache1.3-specific subclass of - * the jk_ws_service class. Think of the *s param as a "this" or "self" - * pointer. - */ -/* Works with 4096, fails with 8192 */ -#ifndef CHUNK_SIZE -#define CHUNK_SIZE 4096 -#endif - -static int JK_METHOD ws_write(jk_ws_service_t *s, - const void *b, - unsigned len) -{ - jk_logger_t *l=s->workerEnv->l; - - if(s && s->ws_private && b) { - if(l) { - /* BUFF *bf = p->r->connection->client; */ - size_t w = (size_t)l; - size_t r = 0; - long ll=len; - char *bb=(char *)b; - - 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)) { - return JK_FALSE; - } - } - - /* 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, s->ws_private ); - l->jkLog(l, JK_LOG_DEBUG, - "writing %ld (%ld) out of %ld \n",toSend, r, ll ); - ll-=CHUNK_SIZE; - bb+=CHUNK_SIZE; - - if(toSend != r) { - return JK_FALSE; - } - - } - - /* - * To allow server push. After writing full buffers - */ - 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; - } - - } - - return JK_TRUE; - } - return JK_FALSE; -} - -/* ========================================================================= */ -/* Utility functions */ -/* ========================================================================= */ - -static int get_content_length(request_rec *r) -{ - if(r->clength > 0) { - return r->clength; - } else { - char *lenp = (char *)apr_table_get(r->headers_in, "Content-Length"); - - if(lenp) { - int rc = atoi(lenp); - if(rc > 0) { - return rc; - } - } - } - - return 0; -} - -static int init_ws_service(jk_ws_service_t *s, - jk_workerEnv_t *workerEnv) -{ - 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) */ - s->start_response = ws_start_response; - s->read = ws_read; - s->write = ws_write; - - s->auth_type = NULL_FOR_EMPTY(r->ap_auth_type); - s->remote_user = NULL_FOR_EMPTY(r->user); - - s->protocol = r->protocol; - s->remote_host = (char *)ap_get_remote_host(r->connection, - r->per_dir_config, - REMOTE_HOST, NULL); - s->remote_host = NULL_FOR_EMPTY(s->remote_host); - s->remote_addr = NULL_FOR_EMPTY(r->connection->remote_ip); - - /* get server name */ - s->server_name= (char *)(r->hostname ? r->hostname : - r->server->server_hostname); - - /* get the real port (otherwise redirect failed) */ - apr_sockaddr_port_get(&port,r->connection->local_addr); - s->server_port = port; - - s->server_software = (char *)ap_get_server_version(); - - s->method = (char *)r->method; - s->content_length = get_content_length(r); - s->is_chunked = r->read_chunked; - s->no_more_chunks = 0; - s->query_string = r->args; - - /* - * The 2.2 servlet spec errata says the uri from - * HttpServletRequest.getRequestURI() should remain encoded. - * [http://java.sun.com/products/servlet/errata_042700.html] - * - * We use JkOptions to determine which method to be used - * - * ap_escape_uri is the latest recommanded but require - * some java decoding (in TC 3.3 rc2) - * - * unparsed_uri is used for strict compliance with spec and - * old Tomcat (3.2.3 for example) - * - * uri is use for compatibilty with mod_rewrite with old Tomcats - */ - - switch (workerEnv->options & JK_OPT_FWDURIMASK) { - - case JK_OPT_FWDURICOMPATUNPARSED : - s->req_uri = r->unparsed_uri; - if (s->req_uri != NULL) { - char *query_str = strchr(s->req_uri, '?'); - if (query_str != NULL) { - *query_str = 0; - } - } - - break; - - case JK_OPT_FWDURICOMPAT : - s->req_uri = r->uri; - break; - - case JK_OPT_FWDURIESCAPED : - s->req_uri = ap_escape_uri(r->pool, r->uri); - break; - - default : - return JK_FALSE; - } - - s->is_ssl = JK_FALSE; - s->ssl_cert = NULL; - s->ssl_cert_len = 0; - s->ssl_cipher = NULL; /* required by Servlet 2.3 Api, - allready in original ajp13 */ - s->ssl_session = NULL; - s->ssl_key_size = -1; /* required by Servlet 2.3 Api, added in jtc */ - - if(workerEnv->ssl_enable || workerEnv->envvars_in_use) { - ap_add_common_vars(r); - - if(workerEnv->ssl_enable) { - ssl_temp = - (char *)apr_table_get(r->subprocess_env, - workerEnv->https_indicator); - if(ssl_temp && !strcasecmp(ssl_temp, "on")) { - s->is_ssl = JK_TRUE; - s->ssl_cert = - (char *)apr_table_get(r->subprocess_env, - workerEnv->certs_indicator); - if(s->ssl_cert) { - s->ssl_cert_len = strlen(s->ssl_cert); - } - /* Servlet 2.3 API */ - s->ssl_cipher = - (char *)apr_table_get(r->subprocess_env, - workerEnv->cipher_indicator); - s->ssl_session = - (char *)apr_table_get(r->subprocess_env, - workerEnv->session_indicator); - - if (workerEnv->options & JK_OPT_FWDKEYSIZE) { - /* Servlet 2.3 API */ - ssl_temp = (char *)apr_table_get(r->subprocess_env, - workerEnv->key_size_indicator); - if (ssl_temp) - s->ssl_key_size = atoi(ssl_temp); - } - } - } - - if(workerEnv->envvars_in_use) { - const apr_array_header_t *t = apr_table_elts(workerEnv->envvars); - if(t && t->nelts) { - int i; - apr_table_entry_t *elts = (apr_table_entry_t *)t->elts; - s->attributes_names = apr_palloc(r->pool, - sizeof(char *) * t->nelts); - s->attributes_values = apr_palloc(r->pool, - sizeof(char *) * t->nelts); - - for(i = 0 ; i < t->nelts ; i++) { - s->attributes_names[i] = elts[i].key; - s->attributes_values[i] = - (char *)apr_table_get(r->subprocess_env, elts[i].key); - if(!s->attributes_values[i]) { - s->attributes_values[i] = elts[i].val; - } - } - - s->num_attributes = t->nelts; - } - } - } - - s->headers_names = NULL; - s->headers_values = NULL; - s->num_headers = 0; - if(r->headers_in && apr_table_elts(r->headers_in)) { - int need_content_length_header = (!s->is_chunked && s->content_length == 0) ? JK_TRUE : JK_FALSE; - const apr_array_header_t *t = apr_table_elts(r->headers_in); - if(t && t->nelts) { - int i; - apr_table_entry_t *elts = (apr_table_entry_t *)t->elts; - s->num_headers = t->nelts; - /* allocate an extra header slot in case we need to add a content-length header */ - s->headers_names = apr_palloc(r->pool, sizeof(char *) * (t->nelts + 1)); - s->headers_values = apr_palloc(r->pool, sizeof(char *) * (t->nelts + 1)); - if(!s->headers_names || !s->headers_values) - return JK_FALSE; - for(i = 0 ; i < t->nelts ; i++) { - char *hname = apr_pstrdup(r->pool, elts[i].key); - s->headers_values[i] = apr_pstrdup(r->pool, elts[i].val); - s->headers_names[i] = hname; - while(*hname) { - *hname = tolower(*hname); - hname++; - } - if(need_content_length_header && - !strncmp(s->headers_values[i],"content-length",14)) { - need_content_length_header = JK_FALSE; - } - } - /* Add a content-length = 0 header if needed. - * Ajp13 assumes an absent content-length header means an unknown, - * but non-zero length body. - */ - if(need_content_length_header) { - s->headers_names[s->num_headers] = "content-length"; - s->headers_values[s->num_headers] = "0"; - s->num_headers++; - } - } - /* Add a content-length = 0 header if needed.*/ - else if (need_content_length_header) { - s->headers_names = apr_palloc(r->pool, sizeof(char *)); - s->headers_values = apr_palloc(r->pool, sizeof(char *)); - if(!s->headers_names || !s->headers_values) - return JK_FALSE; - s->headers_names[0] = "content-length"; - s->headers_values[0] = "0"; - s->num_headers++; - } - } - - return JK_TRUE; -} - - -/* */ /* ==================== Options setters ==================== */ - - /* * The JK module command processors * @@ -1021,11 +615,16 @@ /* * Options to tune mod_jk configuration * for now we understand : - * +ForwardSSLKeySize => Forward SSL Key Size, to follow 2.3 specs but may broke old TC 3.2 - * -ForwardSSLKeySize => Don't Forward SSL Key Size, will make mod_jk works with all TC release - * ForwardURICompat => Forward URI normally, less spec compliant but mod_rewrite compatible (old TC) - * ForwardURICompatUnparsed => Forward URI as unparsed, spec compliant but broke mod_rewrite (old TC) - * ForwardURIEscaped => Forward URI escaped and Tomcat (3.3 rc2) stuff will do the decoding part + * +ForwardSSLKeySize => Forward SSL Key Size, to follow 2.3 + specs but may broke old TC 3.2 + * -ForwardSSLKeySize => Don't Forward SSL Key Size, will make + mod_jk works with all TC release + * ForwardURICompat => Forward URI normally, less spec compliant + but mod_rewrite compatible (old TC) + * ForwardURICompatUnparsed => Forward URI as unparsed, spec compliant + but broke mod_rewrite (old TC) + * ForwardURIEscaped => Forward URI escaped and Tomcat (3.3 rc2) + stuff will do the decoding part */ AP_INIT_RAW_ARGS( "JkOptions", jk_set_options, NULL, RSRC_CONF, @@ -1064,12 +663,6 @@ return add; } -int jk_logger_apache2_factory(jk_env_t *env, - jk_pool_t *pool, - void **result, - char *type, - char *name); - /** Create default jk_config. XXX This is mostly server-independent, all servers are using something similar - should go to common. @@ -1298,17 +891,41 @@ return 0; } +/** handler for 'ctl' requests. + */ +static int jk_ctl_handler(request_rec *r) +{ + jk_workerEnv_t *workerEnv; + jk_logger_t *l; + + if( strcmp( r->handler, JK_CTL_HANDLER ) != 0 ) + return DECLINED; + + workerEnv=(jk_workerEnv_t *)ap_get_module_config(r->server->module_config, + &jk_module); + l = workerEnv->l; + + /* Find what 'ctl' request we have */ + + + /* 'Ping' clt - update the status for all workers, send ping + message. This will update 'up/down' state and give tomcat + an option to update the mapping tables. The ctl handler + will output an xhtml status page */ + + return DECLINED; +} /** Main service method, called to forward a request to tomcat */ static int jk_handler(request_rec *r) { const char *worker_name; - jk_logger_t *l; - jk_workerEnv_t *workerEnv; + jk_logger_t *l=NULL; int rc; jk_worker_t *worker=NULL; jk_endpoint_t *end = NULL; jk_uriEnv_t *uriEnv; + jk_workerEnv_t *workerEnv; uriEnv=ap_get_module_config( r->request_config, &jk_module ); @@ -1322,8 +939,8 @@ return HTTP_INTERNAL_SERVER_ERROR; } - workerEnv = (jk_workerEnv_t *)ap_get_module_config(r->server->module_config, - &jk_module); + workerEnv=(jk_workerEnv_t *)ap_get_module_config(r->server->module_config, + &jk_module); l = workerEnv->l; /* Set up r->read_chunked flags for chunked encoding, if present */ @@ -1356,40 +973,15 @@ jk_ws_service_t sOnStack; jk_ws_service_t *s=&sOnStack; int is_recoverable_error = JK_FALSE; - - jk_requtil_initRequest(s); - s->workerEnv=workerEnv; - s->response_started = JK_FALSE; - s->read_body_started = JK_FALSE; - s->ws_private = r; - s->pool=end->cPool; + jk_service_apache2_factory( workerEnv->env, end->cPool, &s, + "service", "apache2"); - rc=init_ws_service(s, workerEnv); + s->init( s, end, r ); rc = end->service(end, s, l, &is_recoverable_error); - - if (s->content_read < s->content_length || - (s->is_chunked && ! s->no_more_chunks)) { - - /* - * If the servlet engine didn't consume all of the - * request data, consume and discard all further - * characters left to read from client - * - * XXX Is it the right thing to do ????? Why spend the - * bandwith, the servlet decided not to read the POST then - * jk shouldn't do it instead, and the user should get the - * error message ! - */ - char *buff = apr_palloc(r->pool, 2048); - if (buff != NULL) { - int rd; - while ((rd = ap_get_client_block(r, buff, 2048)) > 0) { - s->content_read += rd; - } - } - } + + s->afterRequest(s); } end->done(&end, l);
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>