You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by hg...@apache.org on 2001/06/07 16:31:25 UTC

cvs commit: jakarta-tomcat-connectors/jk/src/native/common jk_ajp13.c jk_ajp13.h

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 <sh...@il.ibm.com>                           *
  - * 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 <sh...@il.ibm.com>                           *
  - * 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,