ajp.h revision 9d129b55f5a43abf43865c6b0eb6dd19bc22aba8
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/* Copyright 1999-2005 The Apache Software Foundation or its licensors, as
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * applicable.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Licensed under the Apache License, Version 2.0 (the "License");
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * you may not use this file except in compliance with the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * You may obtain a copy of the License at
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * http://www.apache.org/licenses/LICENSE-2.0
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Unless required by applicable law or agreed to in writing, software
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * distributed under the License is distributed on an "AS IS" BASIS,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * See the License for the specific language governing permissions and
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * limitations under the License.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @file ajp.h
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @brief Apache Jserv Protocol
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @defgroup AJP_defines AJP definitions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @ingroup MOD_PROXY
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @{
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#ifndef AJP_H
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#define AJP_H
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "apr_version.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "apr.h"
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden#include "apr_hooks.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "apr_lib.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "apr_strings.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "apr_buckets.h"
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden#include "apr_md5.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "apr_network_io.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "apr_pools.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "apr_strings.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "apr_uri.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "apr_date.h"
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden#include "apr_fnmatch.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define APR_WANT_STRFUNC
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden#include "apr_want.h"
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas#if APR_HAVE_NETINET_IN_H
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#include <netinet/in.h>
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#endif
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas#if APR_HAVE_ARPA_INET_H
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#include <arpa/inet.h>
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#endif
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#define AJP13_DEF_HOST "127.0.0.1"
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#ifdef NETWARE
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#define AJP13_DEF_PORT 9009 /* default to 9009 since 8009 is used by OS */
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#else
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#define AJP13_DEF_PORT 8009
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#endif
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden/* The following environment variables match mod_ssl! */
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington#define AJP13_HTTPS_INDICATOR "HTTPS"
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden#define AJP13_SSL_CLIENT_CERT_INDICATOR "SSL_CLIENT_CERT"
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden#define AJP13_SSL_CIPHER_INDICATOR "SSL_CIPHER"
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden#define AJP13_SSL_SESSION_INDICATOR "SSL_SESSION_ID"
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden#define AJP13_SSL_KEY_SIZE_INDICATOR "SSL_CIPHER_USEKEYSIZE"
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden#if APR_CHARSET_EBCDIC
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major#define USE_CHARSET_EBCDIC
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define ajp_xlate_to_ascii(b, l) ap_xlate_proto_to_ascii(b, l)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define ajp_xlate_from_ascii(b, l) ap_xlate_proto_from_ascii(b, l)
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden#else /* APR_CHARSET_EBCDIC */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define ajp_xlate_to_ascii(b, l)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define ajp_xlate_from_ascii(b, l)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#endif
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#ifdef AJP_USE_HTTPD_WRAP
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "httpd_wrap.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#else
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "httpd.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "http_config.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "http_request.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "http_core.h"
4709b991352c6de69ba02928ed6cbf373ca62ed5jeff.schenk#include "http_protocol.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "http_main.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "http_log.h"
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#endif
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#include "mod_proxy.h"
4709b991352c6de69ba02928ed6cbf373ca62ed5jeff.schenk
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** AJP Specific error codes
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Buffer overflow exception */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define AJP_EOVERFLOW (APR_OS_START_USERERR + 1)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Destination Buffer is to small */
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas#define AJP_ETOSMALL (APR_OS_START_USERERR + 2)
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major/** Invalid input parameters */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major#define AJP_EINVAL (APR_OS_START_USERERR + 3)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Bad message signature */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define AJP_EBAD_SIGNATURE (APR_OS_START_USERERR + 4)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Incoming message too bg */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define AJP_ETOBIG (APR_OS_START_USERERR + 5)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Missing message header */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define AJP_ENO_HEADER (APR_OS_START_USERERR + 6)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Bad message header */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define AJP_EBAD_HEADER (APR_OS_START_USERERR + 7)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Bad message */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define AJP_EBAD_MESSAGE (APR_OS_START_USERERR + 8)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Cant log via AJP14 */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define AJP_ELOGFAIL (APR_OS_START_USERERR + 9)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Bad request method */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define AJP_EBAD_METHOD (APR_OS_START_USERERR + 10)
9913a2563ad530aac80f7b02db085fb3c6e05cedPeter Major
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** A structure that represents ajp message */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fostertypedef struct ajp_msg ajp_msg_t;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
9913a2563ad530aac80f7b02db085fb3c6e05cedPeter Major/** A structure that represents ajp message */
9913a2563ad530aac80f7b02db085fb3c6e05cedPeter Majorstruct ajp_msg
9913a2563ad530aac80f7b02db085fb3c6e05cedPeter Major{
9913a2563ad530aac80f7b02db085fb3c6e05cedPeter Major /** The buffer holding a AJP message */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster apr_byte_t *buf;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /** The length of AJP message header (defaults to AJP_HEADER_LEN) */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster apr_size_t header_len;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /** The length of AJP message */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major apr_size_t len;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /** The current read position */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster apr_size_t pos;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster /** Flag indicating the origing of the message */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster int server_side;
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster};
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Signature for the messages sent from Apache to tomcat
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define AJP13_WS_HEADER 0x1234
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define AJP_HEADER_LEN 4
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define AJP_HEADER_SZ_LEN 2
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define AJP_MSG_BUFFER_SZ (8*1024)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define AJP13_MAX_SEND_BODY_SZ (AJP_MSG_BUFFER_SZ - 6)
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Send a request from web server to container*/
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define CMD_AJP13_FORWARD_REQUEST (unsigned char)2
4709b991352c6de69ba02928ed6cbf373ca62ed5jeff.schenk/** Write a body chunk from the servlet container to the web server */
4709b991352c6de69ba02928ed6cbf373ca62ed5jeff.schenk#define CMD_AJP13_SEND_BODY_CHUNK (unsigned char)3
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Send response headers from the servlet container to the web server. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define CMD_AJP13_SEND_HEADERS (unsigned char)4
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Marks the end of response. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define CMD_AJP13_END_RESPONSE (unsigned char)5
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Get further data from the web server if it hasn't all been transferred yet. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define CMD_AJP13_GET_BODY_CHUNK (unsigned char)6
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** The web server asks the container to shut itself down. */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define CMD_AJP13_SHUTDOWN (unsigned char)7
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Webserver ask container to take control (logon phase) */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define CMD_AJP13_PING (unsigned char)8
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Container response to cping request */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define CMD_AJP13_CPONG (unsigned char)9
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** Webserver check if container is alive, since container should respond by cpong */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define CMD_AJP13_CPING (unsigned char)10
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/** @} */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @defgroup AJP_api AJP API functions
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @ingroup MOD_PROXY
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @{
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Check a new AJP Message by looking at signature and return its size
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param msg AJP Message to check
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param len Pointer to returned len
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return APR_SUCCESS or error
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterapr_status_t ajp_msg_check_header(ajp_msg_t *msg, apr_size_t *len);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Reset an AJP Message
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param msg AJP Message to reset
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return APR_SUCCESS or error
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterapr_status_t ajp_msg_reset(ajp_msg_t *msg);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Mark the end of an AJP Message
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param msg AJP Message to end
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return APR_SUCCESS or error
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterapr_status_t ajp_msg_end(ajp_msg_t *msg);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Add an unsigned 32bits value to AJP Message
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param msg AJP Message to get value from
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param value value to add to AJP Message
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return APR_SUCCESS or error
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Majorapr_status_t ajp_msg_append_uint32(ajp_msg_t *msg, apr_uint32_t value);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Add an unsigned 16bits value to AJP Message
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param msg AJP Message to get value from
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param value value to add to AJP Message
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return APR_SUCCESS or error
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterapr_status_t ajp_msg_append_uint16(ajp_msg_t *msg, apr_uint16_t value);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Add an unsigned 8bits value to AJP Message
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param msg AJP Message to get value from
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param value value to add to AJP Message
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return APR_SUCCESS or error
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterapr_status_t ajp_msg_append_uint8(ajp_msg_t *msg, apr_byte_t value);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Add a String in AJP message, and transform the String in ASCII
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * if convert is set and we're on an EBCDIC machine
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param msg AJP Message to get value from
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param value Pointer to String
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param convert When set told to convert String to ASCII
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return APR_SUCCESS or error
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Majorapr_status_t ajp_msg_append_string_ex(ajp_msg_t *msg, const char *value,
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major int convert);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Add a String in AJP message, and transform
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * the String in ASCII if we're on an EBCDIC machine
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major#define ajp_msg_append_string(m, v) ajp_msg_append_string_ex(m, v, 1)
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Add a String in AJP message.
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster#define ajp_msg_append_string_ascii(m, v) ajp_msg_append_string_ex(m, v, 0)
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Add a Byte array to AJP Message
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param msg AJP Message to get value from
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param value Pointer to Byte array
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param valuelen Byte array len
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return APR_SUCCESS or error
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterapr_status_t ajp_msg_append_bytes(ajp_msg_t *msg, const apr_byte_t *value,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster apr_size_t valuelen);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * Get a 32bits unsigned value from AJP Message
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington *
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * @param msg AJP Message to get value from
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param rvalue Pointer where value will be returned
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return APR_SUCCESS or error
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterapr_status_t ajp_msg_get_uint32(ajp_msg_t *msg, apr_uint32_t *rvalue);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Get a 16bits unsigned value from AJP Message
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param msg AJP Message to get value from
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param rvalue Pointer where value will be returned
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return APR_SUCCESS or error
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterapr_status_t ajp_msg_get_uint16(ajp_msg_t *msg, apr_uint16_t *rvalue);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Peek a 16bits unsigned value from AJP Message, position in message
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * is not updated
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param msg AJP Message to get value from
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param rvalue Pointer where value will be returned
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return APR_SUCCESS or error
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterapr_status_t ajp_msg_peek_uint16(ajp_msg_t *msg, apr_uint16_t *rvalue);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Get a 8bits unsigned value from AJP Message
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param msg AJP Message to get value from
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * @param rvalue Pointer where value will be returned
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * @return APR_SUCCESS or error
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterapr_status_t ajp_msg_get_uint8(ajp_msg_t *msg, apr_byte_t *rvalue);
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Peek a 8bits unsigned value from AJP Message, position in message
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * is not updated
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param msg AJP Message to get value from
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param rvalue Pointer where value will be returned
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return APR_SUCCESS or error
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterapr_status_t ajp_msg_peek_uint8(ajp_msg_t *msg, apr_byte_t *rvalue);
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Get a String value from AJP Message
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * @param msg AJP Message to get value from
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * @param rvalue Pointer where value will be returned
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * @return APR_SUCCESS or error
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterapr_status_t ajp_msg_get_string(ajp_msg_t *msg, const char **rvalue);
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Get a Byte array from AJP Message
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param msg AJP Message to get value from
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param rvalue Pointer where value will be returned
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param rvalueLen Pointer where Byte array len will be returned
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return APR_SUCCESS or error
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterapr_status_t ajp_msg_get_bytes(ajp_msg_t *msg, apr_byte_t **rvalue,
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster apr_size_t *rvalue_len);
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden * Create an AJP Message from pool
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden *
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden * @param pool memory pool to allocate AJP message from
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington * @param rmsg Pointer to newly created AJP message
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden * @return APR_SUCCESS or error
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunnington */
bee2440354b4bc8796e1de0b6cbd60e1f68deba0Phill Cunningtonapr_status_t ajp_msg_create(apr_pool_t *pool, ajp_msg_t **rmsg);
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas/**
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas * Recopy an AJP Message to another
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas *
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas * @param smsg source AJP message
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas * @param dmsg destination AJP message
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas * @return APR_SUCCESS or error
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas */
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomasapr_status_t ajp_msg_copy(ajp_msg_t *smsg, ajp_msg_t *dmsg);
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas/**
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas * Serialize in an AJP Message a PING command
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * +-----------------------+
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * | PING CMD (1 byte) |
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * +-----------------------+
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden *
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas * @param smsg AJP message to put serialized message
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas * @return APR_SUCCESS or error
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas */
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomasapr_status_t ajp_msg_serialize_ping(ajp_msg_t *msg);
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * Serialize in an AJP Message a CPING command
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas *
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas * +-----------------------+
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas * | CPING CMD (1 byte) |
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas * +-----------------------+
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas *
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @param smsg AJP message to put serialized message
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster * @return APR_SUCCESS or error
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden */
8af80418ba1ec431c8027fa9668e5678658d3611Allan Fosterapr_status_t ajp_msg_serialize_cping(ajp_msg_t *msg);
ce4d3fddc8fe2eddd68a20af9570b3cc63ece5abNeil Madden
8af80418ba1ec431c8027fa9668e5678658d3611Allan Foster/**
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * Dump up to the first 1024 bytes on an AJP Message
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major *
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param pool pool to allocate from
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param msg AJP Message to dump
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param err error string to display
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @return dump message
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Majorchar * ajp_msg_dump(apr_pool_t *pool, ajp_msg_t *msg, char *err);
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major/**
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * Send an AJP message to backend
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major *
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param soct backend socket
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param smsg AJP message to put serialized message
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @return APR_SUCCESS or error
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Majorapr_status_t ajp_ilink_send(apr_socket_t *sock, ajp_msg_t *msg);
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major/**
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * Receive an AJP message from backend
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major *
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param sock backend socket
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param smsg AJP message to put serialized message
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @return APR_SUCCESS or error
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Majorapr_status_t ajp_ilink_receive(apr_socket_t *sock, ajp_msg_t *msg);
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major/**
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * Build the ajp header message and send it
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param sock backend socket
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param r current request
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @uri uri requested uri
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @return APR_SUCCESS or error
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Majorapr_status_t ajp_send_header(apr_socket_t *sock, request_rec *r,
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major apr_uri_t *uri);
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major/**
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * Read the ajp message and return the type of the message.
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param sock backend socket
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param r current request
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param msg returned AJP message
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @return APR_SUCCESS or error
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Majorapr_status_t ajp_read_header(apr_socket_t *sock,
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major request_rec *r,
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major ajp_msg_t **msg);
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major/**
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * Allocate a msg to send data
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param pool pool to allocate from
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param ptr data buffer
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param len the length of allocated data buffer
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param msg returned AJP message
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @return APR_SUCCESS or error
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Majorapr_status_t ajp_alloc_data_msg(apr_pool_t *pool, char **ptr,
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major apr_size_t *len, ajp_msg_t **msg);
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major/**
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * Send the data message
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param sock backend socket
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param msg AJP message to send
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param len AJP message length
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @return APR_SUCCESS or error
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Majorapr_status_t ajp_send_data_msg(apr_socket_t *sock,
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major ajp_msg_t *msg, apr_size_t len);
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major/**
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * Parse the message type
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param r current request
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param msg AJP message
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @return AJP message type.
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Majorint ajp_parse_type(request_rec *r, ajp_msg_t *msg);
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major/**
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * Parse the header message from container
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param r current request
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param msg AJP message
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @return APR_SUCCESS or error
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Majorapr_status_t ajp_parse_header(request_rec *r, proxy_dir_conf *conf,
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major ajp_msg_t *msg);
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major/**
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * Parse the message body and return data address and length
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param r current request
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param msg AJP message
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param len returned AJP message length
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @param ptr returned data
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major * @return APR_SUCCESS or error
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Majorapr_status_t ajp_parse_data(request_rec *r, ajp_msg_t *msg,
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major apr_uint16_t *len, char **ptr);
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major/** @} */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major#endif /* AJP_H */
133bed8ec2ccc857a62d6301f67c3ef3d36aa333Peter Major
bbec070a4bc76848d53237c966398af99ee93f02Jon Thomas