ajp.h revision 40825ba1ecb5b29bae4351e84372fde4ad2205db
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/* Licensed to the Apache Software Foundation (ASF) under one or more
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * contributor license agreements. See the NOTICE file distributed with
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * this work for additional information regarding copyright ownership.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * The ASF licenses this file to You under the Apache License, Version 2.0
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * (the "License"); you may not use this file except in compliance with
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * the License. You may obtain a copy of the License at
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Unless required by applicable law or agreed to in writing, software
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * distributed under the License is distributed on an "AS IS" BASIS,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * See the License for the specific language governing permissions and
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * limitations under the License.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @brief Apache Jserv Protocol
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @defgroup AJP_defines AJP definitions
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @ingroup MOD_PROXY
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#define AJP13_DEF_PORT 9009 /* default to 9009 since 8009 is used by OS */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/* The following environment variables match mod_ssl! */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#define AJP13_SSL_CLIENT_CERT_INDICATOR "SSL_CLIENT_CERT"
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#define AJP13_SSL_SESSION_INDICATOR "SSL_SESSION_ID"
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#define AJP13_SSL_KEY_SIZE_INDICATOR "SSL_CIPHER_USEKEYSIZE"
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** AJP Specific error codes
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Buffer overflow exception */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Destination Buffer is to small */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Invalid input parameters */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Bad message signature */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#define AJP_EBAD_SIGNATURE (APR_OS_START_USERERR + 4)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Incoming message too bg */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Missing message header */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#define AJP_ENO_HEADER (APR_OS_START_USERERR + 6)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Bad message header */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#define AJP_EBAD_HEADER (APR_OS_START_USERERR + 7)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Bad message */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#define AJP_EBAD_MESSAGE (APR_OS_START_USERERR + 8)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Cant log via AJP14 */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Bad request method */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#define AJP_EBAD_METHOD (APR_OS_START_USERERR + 10)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** A structure that represents ajp message */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** A structure that represents ajp message */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /** The buffer holding a AJP message */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /** The length of AJP message header (defaults to AJP_HEADER_LEN) */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /** The length of AJP message */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /** The current read position */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /** Flag indicating the origing of the message */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /** The size of the buffer */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Signature for the messages sent from Apache to tomcat
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#define AJP13_MAX_SEND_BODY_SZ (AJP_MAX_BUFFER_SZ - AJP_HEADER_SZ)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Send a request from web server to container*/
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#define CMD_AJP13_FORWARD_REQUEST (unsigned char)2
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Write a body chunk from the servlet container to the web server */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#define CMD_AJP13_SEND_BODY_CHUNK (unsigned char)3
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Send response headers from the servlet container to the web server. */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Marks the end of response. */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Get further data from the web server if it hasn't all been transferred yet. */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#define CMD_AJP13_GET_BODY_CHUNK (unsigned char)6
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** The web server asks the container to shut itself down. */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Webserver ask container to take control (logon phase) */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Container response to cping request */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross/** Webserver check if container is alive, since container should respond by cpong */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @defgroup AJP_api AJP API functions
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @ingroup MOD_PROXY
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Check a new AJP Message by looking at signature and return its size
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to check
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param len Pointer to returned len
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_check_header(ajp_msg_t *msg, apr_size_t *len);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Reset an AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to reset
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Reuse an AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to reuse
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Mark the end of an AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to end
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Add an unsigned 32bits value to AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to get value from
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param value value to add to AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_append_uint32(ajp_msg_t *msg, apr_uint32_t value);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Add an unsigned 16bits value to AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to get value from
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param value value to add to AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_append_uint16(ajp_msg_t *msg, apr_uint16_t value);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Add an unsigned 8bits value to AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to get value from
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param value value to add to AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_append_uint8(ajp_msg_t *msg, apr_byte_t value);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Add a String in AJP message, and transform the String in ASCII
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * if convert is set and we're on an EBCDIC machine
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to get value from
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param value Pointer to String
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param convert When set told to convert String to ASCII
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_append_string_ex(ajp_msg_t *msg, const char *value,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Add a String in AJP message, and transform
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * the String in ASCII if we're on an EBCDIC machine
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#define ajp_msg_append_string(m, v) ajp_msg_append_string_ex(m, v, 1)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Add a String in AJP message.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#define ajp_msg_append_string_ascii(m, v) ajp_msg_append_string_ex(m, v, 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Add a Byte array to AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to get value from
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param value Pointer to Byte array
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param valuelen Byte array len
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_append_bytes(ajp_msg_t *msg, const apr_byte_t *value,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Get a 32bits unsigned value from AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to get value from
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param rvalue Pointer where value will be returned
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_get_uint32(ajp_msg_t *msg, apr_uint32_t *rvalue);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Get a 16bits unsigned value from AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to get value from
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param rvalue Pointer where value will be returned
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_get_uint16(ajp_msg_t *msg, apr_uint16_t *rvalue);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Peek a 16bits unsigned value from AJP Message, position in message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * is not updated
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to get value from
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param rvalue Pointer where value will be returned
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_peek_uint16(ajp_msg_t *msg, apr_uint16_t *rvalue);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Get a 8bits unsigned value from AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to get value from
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param rvalue Pointer where value will be returned
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_get_uint8(ajp_msg_t *msg, apr_byte_t *rvalue);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Peek a 8bits unsigned value from AJP Message, position in message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * is not updated
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to get value from
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param rvalue Pointer where value will be returned
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_peek_uint8(ajp_msg_t *msg, apr_byte_t *rvalue);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Get a String value from AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to get value from
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param rvalue Pointer where value will be returned
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_get_string(ajp_msg_t *msg, const char **rvalue);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Get a Byte array from AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to get value from
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param rvalue Pointer where value will be returned
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param rvalueLen Pointer where Byte array len will be returned
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_get_bytes(ajp_msg_t *msg, apr_byte_t **rvalue,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Create an AJP Message from pool
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param pool memory pool to allocate AJP message from
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param size size of the buffer to create
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param rmsg Pointer to newly created AJP message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_create(apr_pool_t *pool, apr_size_t size, ajp_msg_t **rmsg);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Recopy an AJP Message to another
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param smsg source AJP message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param dmsg destination AJP message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_copy(ajp_msg_t *smsg, ajp_msg_t *dmsg);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Serialize in an AJP Message a PING command
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * +-----------------------+
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * | PING CMD (1 byte) |
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * +-----------------------+
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param smsg AJP message to put serialized message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_serialize_ping(ajp_msg_t *msg);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Serialize in an AJP Message a CPING command
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * +-----------------------+
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * | CPING CMD (1 byte) |
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * +-----------------------+
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param smsg AJP message to put serialized message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_msg_serialize_cping(ajp_msg_t *msg);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Dump up to the first 1024 bytes on an AJP Message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param pool pool to allocate from
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP Message to dump
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param err error string to display
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return dump message
12b65585e720714b31036daaa2b30eb76014048eGordon Rosschar * ajp_msg_dump(apr_pool_t *pool, ajp_msg_t *msg, char *err);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Send an AJP message to backend
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param soct backend socket
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param smsg AJP message to put serialized message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_ilink_send(apr_socket_t *sock, ajp_msg_t *msg);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Receive an AJP message from backend
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param sock backend socket
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param smsg AJP message to put serialized message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_ilink_receive(apr_socket_t *sock, ajp_msg_t *msg);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Build the ajp header message and send it
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param sock backend socket
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param r current request
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param buffsize max size of the AJP packet.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @uri uri requested uri
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_send_header(apr_socket_t *sock, request_rec *r,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Read the ajp message and return the type of the message.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param sock backend socket
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param r current request
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param buffsize size of the buffer.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg returned AJP message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Allocate a msg to send data
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param pool pool to allocate from
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param ptr data buffer
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param len the length of allocated data buffer
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg returned AJP message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_alloc_data_msg(apr_pool_t *pool, char **ptr,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Send the data message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param sock backend socket
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP message to send
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param len AJP message length
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_send_data_msg(apr_socket_t *sock,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Parse the message type
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param r current request
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return AJP message type.
12b65585e720714b31036daaa2b30eb76014048eGordon Rossint ajp_parse_type(request_rec *r, ajp_msg_t *msg);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Parse the header message from container
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param r current request
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_parse_header(request_rec *r, proxy_dir_conf *conf,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Parse the message body and return data address and length
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param r current request
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param msg AJP message
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param len returned AJP message length
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param ptr returned data
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_parse_data(request_rec *r, ajp_msg_t *msg,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Handle the CPING/CPONG messages
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param sock backend socket
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param r current request
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @param timeout time window for receiving cpong reply
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * @return APR_SUCCESS or error
12b65585e720714b31036daaa2b30eb76014048eGordon Rossapr_status_t ajp_handle_cping_cpong(apr_socket_t *sock,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross#endif /* AJP_H */