hgomez 01/06/07 07:31:24 Modified: jk/src/native/common jk_ajp13.c jk_ajp13.h Log: 'Diet' ajp13 source code. All of it's code is now in ajp_common and shared with ajp14 Revision Changes Path 1.3 +2 -518 jakarta-tomcat-connectors/jk/src/native/common/jk_ajp13.c Index: jk_ajp13.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/src/native/common/jk_ajp13.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- jk_ajp13.c 2001/06/01 10:00:17 1.2 +++ jk_ajp13.c 2001/06/07 14:31:16 1.3 @@ -56,530 +56,14 @@ /*************************************************************************** * Description: Experimental bi-directionl protocol handler. * * Author: Gal Shachor <[EMAIL PROTECTED]> * - * Version: $Revision: 1.2 $ * + * Version: $Revision: 1.3 $ * ***************************************************************************/ #include "jk_global.h" #include "jk_util.h" +#include "jk_ajp_common.h" #include "jk_ajp13.h" - -/* - * Conditional request attributes - * - */ -#define SC_A_CONTEXT (unsigned char)1 -#define SC_A_SERVLET_PATH (unsigned char)2 -#define SC_A_REMOTE_USER (unsigned char)3 -#define SC_A_AUTH_TYPE (unsigned char)4 -#define SC_A_QUERY_STRING (unsigned char)5 -#define SC_A_JVM_ROUTE (unsigned char)6 -#define SC_A_SSL_CERT (unsigned char)7 -#define SC_A_SSL_CIPHER (unsigned char)8 -#define SC_A_SSL_SESSION (unsigned char)9 -#define SC_A_REQ_ATTRIBUTE (unsigned char)10 -#define SC_A_ARE_DONE (unsigned char)0xFF - -/* - * Request methods, coded as numbers instead of strings. - * The list of methods was taken from Section 5.1.1 of RFC 2616, - * RFC 2518, and the ACL IETF draft. - * Method = "OPTIONS" - * | "GET" - * | "HEAD" - * | "POST" - * | "PUT" - * | "DELETE" - * | "TRACE" - * | "PROPFIND" - * | "PROPPATCH" - * | "MKCOL" - * | "COPY" - * | "MOVE" - * | "LOCK" - * | "UNLOCK" - * | "ACL" - * - */ -#define SC_M_OPTIONS (unsigned char)1 -#define SC_M_GET (unsigned char)2 -#define SC_M_HEAD (unsigned char)3 -#define SC_M_POST (unsigned char)4 -#define SC_M_PUT (unsigned char)5 -#define SC_M_DELETE (unsigned char)6 -#define SC_M_TRACE (unsigned char)7 -#define SC_M_PROPFIND (unsigned char)8 -#define SC_M_PROPPATCH (unsigned char)9 -#define SC_M_MKCOL (unsigned char)10 -#define SC_M_COPY (unsigned char)11 -#define SC_M_MOVE (unsigned char)12 -#define SC_M_LOCK (unsigned char)13 -#define SC_M_UNLOCK (unsigned char)14 -#define SC_M_ACL (unsigned char)15 - - -/* - * Frequent request headers, these headers are coded as numbers - * instead of strings. - * - * Accept - * Accept-Charset - * Accept-Encoding - * Accept-Language - * Authorization - * Connection - * Content-Type - * Content-Length - * Cookie - * Cookie2 - * Host - * Pragma - * Referer - * User-Agent - * - */ - -#define SC_ACCEPT (unsigned short)0xA001 -#define SC_ACCEPT_CHARSET (unsigned short)0xA002 -#define SC_ACCEPT_ENCODING (unsigned short)0xA003 -#define SC_ACCEPT_LANGUAGE (unsigned short)0xA004 -#define SC_AUTHORIZATION (unsigned short)0xA005 -#define SC_CONNECTION (unsigned short)0xA006 -#define SC_CONTENT_TYPE (unsigned short)0xA007 -#define SC_CONTENT_LENGTH (unsigned short)0xA008 -#define SC_COOKIE (unsigned short)0xA009 -#define SC_COOKIE2 (unsigned short)0xA00A -#define SC_HOST (unsigned short)0xA00B -#define SC_PRAGMA (unsigned short)0xA00C -#define SC_REFERER (unsigned short)0xA00D -#define SC_USER_AGENT (unsigned short)0xA00E - -/* - * Frequent response headers, these headers are coded as numbers - * instead of strings. - * - * Content-Type - * Content-Language - * Content-Length - * Date - * Last-Modified - * Location - * Set-Cookie - * Servlet-Engine - * Status - * WWW-Authenticate - * - */ - -#define SC_RESP_CONTENT_TYPE (unsigned short)0xA001 -#define SC_RESP_CONTENT_LANGUAGE (unsigned short)0xA002 -#define SC_RESP_CONTENT_LENGTH (unsigned short)0xA003 -#define SC_RESP_DATE (unsigned short)0xA004 -#define SC_RESP_LAST_MODIFIED (unsigned short)0xA005 -#define SC_RESP_LOCATION (unsigned short)0xA006 -#define SC_RESP_SET_COOKIE (unsigned short)0xA007 -#define SC_RESP_SET_COOKIE2 (unsigned short)0xA008 -#define SC_RESP_SERVLET_ENGINE (unsigned short)0xA009 -#define SC_RESP_STATUS (unsigned short)0xA00A -#define SC_RESP_WWW_AUTHENTICATE (unsigned short)0xA00B -#define SC_RES_HEADERS_NUM 11 - -const char *response_trans_headers[] = { - "Content-Type", - "Content-Language", - "Content-Length", - "Date", - "Last-Modified", - "Location", - "Set-Cookie", - "Set-Cookie2", - "Servlet-Engine", - "Status", - "WWW-Authenticate" -}; - -const char *long_res_header_for_sc(int sc) -{ - const char *rc = NULL; - if(sc <= SC_RES_HEADERS_NUM && sc > 0) { - rc = response_trans_headers[sc - 1]; - } - - return rc; -} - - -int sc_for_req_method(const char *method, - unsigned char *sc) -{ - int rc = JK_TRUE; - if(0 == strcmp(method, "GET")) { - *sc = SC_M_GET; - } else if(0 == strcmp(method, "POST")) { - *sc = SC_M_POST; - } else if(0 == strcmp(method, "HEAD")) { - *sc = SC_M_HEAD; - } else if(0 == strcmp(method, "PUT")) { - *sc = SC_M_PUT; - } else if(0 == strcmp(method, "DELETE")) { - *sc = SC_M_DELETE; - } else if(0 == strcmp(method, "OPTIONS")) { - *sc = SC_M_OPTIONS; - } else if(0 == strcmp(method, "TRACE")) { - *sc = SC_M_TRACE; - } else if(0 == strcmp(method, "PROPFIND")) { - *sc = SC_M_PROPFIND; - } else if(0 == strcmp(method, "PROPPATCH")) { - *sc = SC_M_PROPPATCH; - } else if(0 == strcmp(method, "MKCOL")) { - *sc = SC_M_MKCOL; - } else if(0 == strcmp(method, "COPY")) { - *sc = SC_M_COPY; - } else if(0 == strcmp(method, "MOVE")) { - *sc = SC_M_MOVE; - } else if(0 == strcmp(method, "LOCK")) { - *sc = SC_M_LOCK; - } else if(0 == strcmp(method, "UNLOCK")) { - *sc = SC_M_UNLOCK; - } else if(0 == strcmp(method, "ACL")) { - *sc = SC_M_ACL; - } else { - rc = JK_FALSE; - } - - return rc; -} - -int sc_for_req_header(const char *header_name, - unsigned short *sc) -{ - switch(header_name[0]) { - case 'a': - if('c' ==header_name[1] && - 'c' ==header_name[2] && - 'e' ==header_name[3] && - 'p' ==header_name[4] && - 't' ==header_name[5]) { - if ('-' == header_name[6]) { - if(!strcmp(header_name + 7, "charset")) { - *sc = SC_ACCEPT_CHARSET; - } else if(!strcmp(header_name + 7, "encoding")) { - *sc = SC_ACCEPT_ENCODING; - } else if(!strcmp(header_name + 7, "language")) { - *sc = SC_ACCEPT_LANGUAGE; - } else { - return JK_FALSE; - } - } else if ('\0' == header_name[6]) { - *sc = SC_ACCEPT; - } else { - return JK_FALSE; - } - } else if (!strcmp(header_name, "authorization")) { - *sc = SC_AUTHORIZATION; - } else { - return JK_FALSE; - } - break; - - case 'c': - if(!strcmp(header_name, "cookie")) { - *sc = SC_COOKIE; - } else if(!strcmp(header_name, "connection")) { - *sc = SC_CONNECTION; - } else if(!strcmp(header_name, "content-type")) { - *sc = SC_CONTENT_TYPE; - } else if(!strcmp(header_name, "content-length")) { - *sc = SC_CONTENT_LENGTH; - } else if(!strcmp(header_name, "cookie2")) { - *sc = SC_COOKIE2; - } else { - return JK_FALSE; - } - break; - - case 'h': - if(!strcmp(header_name, "host")) { - *sc = SC_HOST; - } else { - return JK_FALSE; - } - break; - - case 'p': - if(!strcmp(header_name, "pragma")) { - *sc = SC_PRAGMA; - } else { - return JK_FALSE; - } - break; - - case 'r': - if(!strcmp(header_name, "referer")) { - *sc = SC_REFERER; - } else { - return JK_FALSE; - } - break; - - case 'u': - if(!strcmp(header_name, "user-agent")) { - *sc = SC_USER_AGENT; - } else { - return JK_FALSE; - } - break; - - default: - return JK_FALSE; - } - - return JK_TRUE; -} - - -/* - * Message structure - * - * -AJPV13_REQUEST:= - request_prefix (1) (byte) - method (byte) - protocol (string) - req_uri (string) - remote_addr (string) - remote_host (string) - server_name (string) - server_port (short) - is_ssl (boolean) - num_headers (short) - num_headers*(req_header_name header_value) - - ?context (byte)(string) - ?servlet_path (byte)(string) - ?remote_user (byte)(string) - ?auth_type (byte)(string) - ?query_string (byte)(string) - ?jvm_route (byte)(string) - ?ssl_cert (byte)(string) - ?ssl_cipher (byte)(string) - ?ssl_session (byte)(string) - request_terminator (byte) - ?body content_length*(var binary) - - */ - -int ajp13_marshal_into_msgb(jk_msg_buf_t *msg, - jk_ws_service_t *s, - jk_logger_t *l) -{ - unsigned char method; - unsigned i; - - jk_log(l, JK_LOG_DEBUG, "Into ajp13_marshal_into_msgb\n"); - - if (!sc_for_req_method(s->method, &method)) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_marshal_into_msgb - No such method %s\n", s->method); - return JK_FALSE; - } - - if (jk_b_append_byte(msg, JK_AJP13_FORWARD_REQUEST) || - jk_b_append_byte(msg, method) || - jk_b_append_string(msg, s->protocol) || - jk_b_append_string(msg, s->req_uri) || - jk_b_append_string(msg, s->remote_addr) || - jk_b_append_string(msg, s->remote_host) || - jk_b_append_string(msg, s->server_name) || - jk_b_append_int(msg, (unsigned short)s->server_port) || - jk_b_append_byte(msg, (unsigned char)(s->is_ssl)) || - jk_b_append_int(msg, (unsigned short)(s->num_headers))) { - - jk_log(l, JK_LOG_ERROR, "Error ajp13_marshal_into_msgb - Error appending the message begining\n"); - return JK_FALSE; - } - - for (i = 0 ; i < s->num_headers ; i++) { - unsigned short sc; - - if (sc_for_req_header(s->headers_names[i], &sc)) { - if (jk_b_append_int(msg, sc)) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_marshal_into_msgb - Error appending the header name\n"); - return JK_FALSE; - } - } else { - if (jk_b_append_string(msg, s->headers_names[i])) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_marshal_into_msgb - Error appending the header name\n"); - return JK_FALSE; - } - } - - if (jk_b_append_string(msg, s->headers_values[i])) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_marshal_into_msgb - Error appending the header value\n"); - return JK_FALSE; - } - } - - if (s->remote_user) { - if (jk_b_append_byte(msg, SC_A_REMOTE_USER) || - jk_b_append_string(msg, s->remote_user)) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_marshal_into_msgb - Error appending the remote user\n"); - return JK_FALSE; - } - } - if (s->auth_type) { - if (jk_b_append_byte(msg, SC_A_AUTH_TYPE) || - jk_b_append_string(msg, s->auth_type)) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_marshal_into_msgb - Error appending the auth type\n"); - return JK_FALSE; - } - } - if (s->query_string) { - if (jk_b_append_byte(msg, SC_A_QUERY_STRING) || - jk_b_append_string(msg, s->query_string)) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_marshal_into_msgb - Error appending the query string\n"); - return JK_FALSE; - } - } - if (s->jvm_route) { - if (jk_b_append_byte(msg, SC_A_JVM_ROUTE) || - jk_b_append_string(msg, s->jvm_route)) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_marshal_into_msgb - Error appending the jvm route\n"); - return JK_FALSE; - } - } - if (s->ssl_cert_len) { - if (jk_b_append_byte(msg, SC_A_SSL_CERT) || - jk_b_append_string(msg, s->ssl_cert)) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_marshal_into_msgb - Error appending the SSL certificates\n"); - return JK_FALSE; - } - } - - if (s->ssl_cipher) { - if (jk_b_append_byte(msg, SC_A_SSL_CIPHER) || - jk_b_append_string(msg, s->ssl_cipher)) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_marshal_into_msgb - Error appending the SSL ciphers\n"); - return JK_FALSE; - } - } - if (s->ssl_session) { - if (jk_b_append_byte(msg, SC_A_SSL_SESSION) || - jk_b_append_string(msg, s->ssl_session)) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_marshal_into_msgb - Error appending the SSL session\n"); - return JK_FALSE; - } - } - - if (s->num_attributes > 0) { - for (i = 0 ; i < s->num_attributes ; i++) { - if (jk_b_append_byte(msg, SC_A_REQ_ATTRIBUTE) || - jk_b_append_string(msg, s->attributes_names[i]) || - jk_b_append_string(msg, s->attributes_values[i])) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_marshal_into_msgb - Error appending attribute %s=%s\n", - s->attributes_names[i], s->attributes_values[i]); - return JK_FALSE; - } - } - } - - if (jk_b_append_byte(msg, SC_A_ARE_DONE)) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_marshal_into_msgb - Error appending the message end\n"); - return JK_FALSE; - } - - jk_log(l, JK_LOG_DEBUG, "ajp13_marshal_into_msgb - Done\n"); - return JK_TRUE; -} - -/* -AJPV13_RESPONSE:= - response_prefix (2) - status (short) - status_msg (short) - num_headers (short) - num_headers*(res_header_name header_value) - *body_chunk - terminator boolean <! -- recycle connection or not --> - -req_header_name := - sc_req_header_name | (string) - -res_header_name := - sc_res_header_name | (string) - -header_value := - (string) - -body_chunk := - length (short) - body length*(var binary) - - */ - - -int ajp13_unmarshal_response(jk_msg_buf_t *msg, - jk_res_data_t *d, - jk_pool_t *p, - jk_logger_t *l) -{ - d->status = jk_b_get_int(msg); - - if (!d->status) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_unmarshal_response - Null status\n"); - return JK_FALSE; - } - - d->msg = (char *)jk_b_get_string(msg); - - jk_log(l, JK_LOG_DEBUG, "ajp13_unmarshal_response: status = %d\n", d->status); - - d->num_headers = jk_b_get_int(msg); - d->header_names = d->header_values = NULL; - - jk_log(l, JK_LOG_DEBUG, "ajp13_unmarshal_response: Number of headers is = %d\n", d->num_headers); - - if (d->num_headers) { - d->header_names = jk_pool_alloc(p, sizeof(char *) * d->num_headers); - d->header_values = jk_pool_alloc(p, sizeof(char *) * d->num_headers); - - if (d->header_names && d->header_values) { - unsigned i; - for(i = 0 ; i < d->num_headers ; i++) { - unsigned short name = jk_b_pget_int(msg, jk_b_get_pos(msg)) ; - - if ((name & 0XFF00) == 0XA000) { - jk_b_get_int(msg); - name = name & 0X00FF; - if (name <= SC_RES_HEADERS_NUM) { - d->header_names[i] = (char *)long_res_header_for_sc(name); - } else { - jk_log(l, JK_LOG_ERROR, "Error ajp13_unmarshal_response - No such sc (%d)\n", name); - return JK_FALSE; - } - } else { - d->header_names[i] = (char *)jk_b_get_string(msg); - if (!d->header_names[i]) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_unmarshal_response - Null header name\n"); - return JK_FALSE; - } - } - - d->header_values[i] = (char *)jk_b_get_string(msg); - if (!d->header_values[i]) { - jk_log(l, JK_LOG_ERROR, "Error ajp13_unmarshal_response - Null header value\n"); - return JK_FALSE; - } - - jk_log(l, JK_LOG_DEBUG, "ajp13_unmarshal_response: Header[%d] [%s] = [%s]\n", - i, - d->header_names[i], - d->header_values[i]); - } - } - } - - return JK_TRUE; -} int ajp13_marshal_shutdown_into_msgb(jk_msg_buf_t *msg, jk_pool_t *p, 1.3 +7 -27 jakarta-tomcat-connectors/jk/src/native/common/jk_ajp13.h Index: jk_ajp13.h =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/src/native/common/jk_ajp13.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- jk_ajp13.h 2001/05/18 16:45:03 1.2 +++ jk_ajp13.h 2001/06/07 14:31:18 1.3 @@ -56,29 +56,27 @@ /*************************************************************************** * Description: Experimental bi-directionl protocol handler. * * Author: Gal Shachor <[EMAIL PROTECTED]> * - * Version: $Revision: 1.2 $ * + * Version: $Revision: 1.3 $ * ***************************************************************************/ #ifndef JK_AJP13_H #define JK_AJP13_H +#include "jk_ajp_common.h" -#include "jk_service.h" -#include "jk_msg_buff.h" -#include "jk_mt.h" - #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ +#define AJP13_PROTO 13 +#define AJP13_WS_HEADER 0x1234 +#define AJP13_SW_HEADER 0x4142 /* 'AB' */ + #define AJP13_DEF_HOST ("localhost") -#define AJP13_DEF_PORT (8008) +#define AJP13_DEF_PORT (8009) #define AJP13_READ_BUF_SIZE (8*1024) -#define AJP13_DEF_RETRY_ATTEMPTS (1) #define AJP13_DEF_CACHE_SZ (1) #define JK_INTERNAL_ERROR (-2) #define AJP13_MAX_SEND_BODY_SZ (DEF_BUFFER_SZ - 6) -#define AJP13_HEADER_LEN (4) -#define AJP13_HEADER_SZ_LEN (2) /* * Message does not have a response (for example, JK_AJP13_END_RESPONSE) @@ -123,27 +121,9 @@ */ #define JK_AJP13_SHUTDOWN (unsigned char)7 -struct jk_res_data { - int status; - const char *msg; - unsigned num_headers; - char **header_names; - char **header_values; -}; -typedef struct jk_res_data jk_res_data_t; - /* * Functions */ -int ajp13_marshal_into_msgb(jk_msg_buf_t *msg, - jk_ws_service_t *s, - jk_logger_t *l); - -int ajp13_unmarshal_response(jk_msg_buf_t *msg, - jk_res_data_t *d, - jk_pool_t *p, - jk_logger_t *l); - int ajp13_marshal_shutdown_into_msgb(jk_msg_buf_t *msg, jk_pool_t *p,