native/common/jk_ajp_common.h (241 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/***************************************************************************
* Description: common stuff for bi-directional protocol ajp13/ajp14. *
* Author: Gal Shachor <shachor@il.ibm.com> *
* Author: Henri Gomez <hgomez@apache.org> *
***************************************************************************/
#ifndef JK_AJP_COMMON_H
#define JK_AJP_COMMON_H
#include "jk_service.h"
#include "jk_msg_buff.h"
#include "jk_shm.h"
#include "jk_mt.h"
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
#define JK_AJP_STATE_IDLE (0)
#define JK_AJP_STATE_OK (1)
#define JK_AJP_STATE_ERROR (2)
#define JK_AJP_STATE_PROBE (3)
#define JK_AJP_STATE_DEF (JK_AJP_STATE_IDLE)
#define JK_AJP_STATE_TEXT_IDLE ("OK/IDLE")
#define JK_AJP_STATE_TEXT_OK ("OK")
#define JK_AJP_STATE_TEXT_ERROR ("ERR")
#define JK_AJP_STATE_TEXT_PROBE ("ERR/PRB")
#define JK_AJP_STATE_TEXT_MAX (JK_AJP_STATE_PROBE)
#define JK_AJP_STATE_TEXT_DEF (JK_AJP_STATE_TEXT_IDLE)
/*
* 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_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_SSL_KEY_SIZE (unsigned char)11 /* only in if JkOptions +ForwardKeySize */
#define SC_A_SECRET (unsigned char)12
#define SC_A_STORED_METHOD (unsigned char)13
#define SC_A_ARE_DONE (unsigned char)0xFF
/*
* AJP private request attributes
*/
/*
* The following request attribute is recognized by Tomcat
* to contain the name of the ssl protocol used
*/
#define SC_A_SSL_PROTOCOL ("AJP_SSL_PROTOCOL")
/*
* The following request attribute is recognized by Tomcat
* to contain the forwarded remote port.
*/
#define SC_A_REQ_REMOTE_PORT ("AJP_REMOTE_PORT")
/*
* The following request attribute is recognized by Tomcat
* to contain the forwarded local ip address.
*/
#define SC_A_REQ_LOCAL_ADDR ("AJP_LOCAL_ADDR")
/*
* JK public request attributes
*
* Activation state of the worker in the load balancer.
* Can be any of the JK_LB_ACTIVATION_TEXT_* strings
* from jk_lb_worker.h.
*/
#define SC_A_JK_LB_ACTIVATION ("JK_LB_ACTIVATION")
/*
* Request methods, coded as numbers instead of strings.
* The list of methods was taken from Section 5.1.1 of RFC 2616,
* RFC 2518, the ACL IETF draft, and the DeltaV IESG Proposed Standard.
* Method = "OPTIONS"
* | "GET"
* | "HEAD"
* | "POST"
* | "PUT"
* | "DELETE"
* | "TRACE"
* | "PROPFIND"
* | "PROPPATCH"
* | "MKCOL"
* | "COPY"
* | "MOVE"
* | "LOCK"
* | "UNLOCK"
* | "ACL"
* | "REPORT"
* | "VERSION-CONTROL"
* | "CHECKIN"
* | "CHECKOUT"
* | "UNCHECKOUT"
* | "SEARCH"
* | "MKWORKSPACE"
* | "UPDATE"
* | "LABEL"
* | "MERGE"
* | "BASELINE-CONTROL"
* | "MKACTIVITY"
*
*/
#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
#define SC_M_REPORT (unsigned char)16
#define SC_M_VERSION_CONTROL (unsigned char)17
#define SC_M_CHECKIN (unsigned char)18
#define SC_M_CHECKOUT (unsigned char)19
#define SC_M_UNCHECKOUT (unsigned char)20
#define SC_M_SEARCH (unsigned char)21
#define SC_M_MKWORKSPACE (unsigned char)22
#define SC_M_UPDATE (unsigned char)23
#define SC_M_LABEL (unsigned char)24
#define SC_M_MERGE (unsigned char)25
#define SC_M_BASELINE_CONTROL (unsigned char)26
#define SC_M_MKACTIVITY (unsigned char)27
#define SC_M_JK_STORED (unsigned char)0xFF
/*
* 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
/*
* AJP13/AJP14 use same message structure
*/
#define AJP_DEF_RETRY_ATTEMPTS (1)
#define AJP_HEADER_LEN (4)
#define AJP_HEADER_SZ_LEN (2)
#define CHUNK_BUFFER_PAD (12)
#define AJP_DEF_CACHE_TIMEOUT (0)
#define AJP_DEF_CONNECT_TIMEOUT (0) /* NO CONNECTION TIMEOUT => NO CPING/CPONG */
#define AJP_DEF_REPLY_TIMEOUT (0) /* NO REPLY TIMEOUT */
#define AJP_DEF_PREPOST_TIMEOUT (0) /* NO PREPOST TIMEOUT => NO CPING/CPONG */
#define AJP_DEF_RECOVERY_OPTS (0) /* NO RECOVERY / NO */
#define AJP_DEF_SOCKET_TIMEOUT (0) /* No timeout */
#define AJP_DEF_PING_TIMEOUT (10000) /* Default CPING/CPONG timeout (10 seconds) */
#define AJP_CPING_NONE (0) /* Do not send cping packets */
#define AJP_CPING_CONNECT (1) /* Send cping on fresh connection */
#define AJP_CPING_PREPOST (2) /* Send cping before sending request */
#define AJP_CPING_INTERVAL (4) /* Send cping on regular intervals */
#define AJP_CPING_MAX (AJP_CPING_INTERVAL)
#define AJP_CPING_CONNECT_TEXT ('C') /* Send cping on fresh connection */
#define AJP_CPING_PREPOST_TEXT ('P') /* Send cping before sending request */
#define AJP_CPING_INTERVAL_TEXT ('I') /* Send cping on regular intervals */
#define AJP_CPING_ALL_TEXT ('A') /* Send cping on regular intervals */
#define RECOVER_ABORT_IF_TCGETREQUEST 0x0001 /* DON'T RECOVER IF TOMCAT FAILS AFTER RECEIVING REQUEST */
#define RECOVER_ABORT_IF_TCSENDHEADER 0x0002 /* DON'T RECOVER IF TOMCAT FAILS AFTER SENDING HEADERS */
#define RECOVER_ABORT_IF_CLIENTERROR 0x0004 /* CLOSE THE SOCKET IN CASE OF CLIENT ERROR */
#define RECOVER_ALWAYS_HTTP_HEAD 0x0008 /* RECOVER HTTP HEAD REQUESTS, EVEN IF ABORT OPTIONS ARE SET */
#define RECOVER_ALWAYS_HTTP_GET 0x0010 /* RECOVER HTTP GET REQUESTS, EVEN IF ABORT OPTIONS ARE SET */
struct jk_res_data
{
int status;
#ifdef AS400
char *msg;
#else
const char *msg;
#endif
unsigned num_headers;
char **header_names;
char **header_values;
};
typedef struct jk_res_data jk_res_data_t;
#include "jk_ajp14.h"
struct ajp_operation;
typedef struct ajp_operation ajp_operation_t;
struct ajp_endpoint;
typedef struct ajp_endpoint ajp_endpoint_t;
struct ajp_worker;
typedef struct ajp_worker ajp_worker_t;
struct ajp_worker
{
jk_worker_t worker;
/* Shared memory worker data */
jk_shm_ajp_worker_t *s;
shm_str name;
/* Sequence counter starting at 0 and increasing
* every time we change the config
*/
volatile unsigned int sequence;
jk_pool_t p;
jk_pool_atom_t buf[TINY_POOL_SIZE];
JK_CRIT_SEC cs;
jk_sockaddr_t worker_inet_addr; /* Contains host and port */
jk_sockaddr_t worker_source_inet_addr; /* Contains source ip */
unsigned connect_retry_attempts;
shm_str host;
int port;
shm_str source;
int addr_sequence; /* Whether the address is resolved */
int maintain_time;
int prefer_ipv6;
/*
* Open connections cache...
*
* 1. Critical section object to protect the cache.
* 2. Cache size.
* 3. An array of "open" endpoints.
*/
unsigned int ep_cache_sz;
unsigned int ep_mincache_sz;
unsigned int ep_maxcache_sz;
int cache_acquire_timeout;
ajp_endpoint_t **ep_cache;
int proto; /* PROTOCOL USED AJP13/AJP14 */
jk_login_service_t *login;
/* Weak secret similar with ajp12, used in ajp13 */
const char *secret;
/*
* Post physical connect handler.
* AJP14 will set here its login handler
*/
int (*logon) (ajp_endpoint_t * ae, jk_log_context_t *log_ctx);
/*
* Handle Socket Timeouts
*/
int socket_timeout;
int socket_connect_timeout;
int keepalive;
int socket_buf;
/*
* Handle Cache Timeouts
*/
int cache_timeout;
/*
* Handle Connection/Reply Timeouts
*/
int connect_timeout; /* connect cping/cpong delay in ms (0 means disabled) */
int reply_timeout; /* reply timeout delay in ms (0 means disabled) */
int prepost_timeout; /* before sending a request cping/cpong timeout delay in ms (0 means disabled) */
int conn_ping_interval; /* interval for sending keepalive cping packets on
* unused connection */
int ping_timeout; /* generic cping/cpong timeout. Used for keepalive packets or
* as default for boolean valued connect and prepost timeouts.
*/
unsigned int ping_mode; /* Ping mode flags (which types of cpings should be used) */
/*
* Recovery options
*/
unsigned int recovery_opts;
/*
* Public property to enable the number of retry attempts
* on this worker.
*/
int retries;
/*
* Public property used in load balancer workers, meaning
* the maximum number of failover attempts between ajp
* workers of cluster.
*/
int lb_retries;
unsigned int max_packet_size; /* Maximum AJP Packet size */
int retry_interval; /* Number of milliseconds to sleep before doing a retry */
int busy_limit; /* Maximum allowed number of concurrent requests (if > 0) */
/*
* HTTP status that will cause failover (0 means disabled)
*/
unsigned int http_status_fail_num;
int *http_status_fail;
};
/*
* endpoint, the remote connector which does the work
*/
struct ajp_endpoint
{
ajp_worker_t *worker;
jk_pool_t pool;
jk_pool_atom_t buf[BIG_POOL_SIZE];
int proto; /* PROTOCOL USED AJP13/AJP14 */
jk_sock_t sd;
int reuse;
int avail; /* Set to non-zero if cache slot is available */
/* Used with RECOVER_ABORT_IF_CLIENTERROR to hard abort
write of AJP response on client write errors */
int hard_close;
jk_endpoint_t endpoint;
jk_uint64_t left_bytes_to_send;
/* time of the last request
handled by this endpoint */
time_t last_access;
int last_errno;
/* Last operation performed via this endpoint */
int last_op;
int addr_sequence; /* Whether the address is resolved */
};
/*
* little struct to avoid multiples ptr passing
* this struct is ready to hold upload file fd
* to add upload persistant storage
*/
struct ajp_operation
{
jk_msg_buf_t *request; /* original request storage */
jk_msg_buf_t *reply; /* reply storage (chuncked by ajp13 */
jk_msg_buf_t *post; /* small post data storage area */
int uploadfd; /* future persistant storage id */
int recoverable; /* if exchange could be conducted on another TC */
};
/*
* Functions
*/
const char *jk_ajp_get_state(ajp_worker_t *aw, jk_log_context_t *log_ctx);
int jk_ajp_get_state_code(const char *v);
int ajp_validate(jk_worker_t *pThis,
jk_map_t *props,
jk_worker_env_t *we, jk_log_context_t *log_ctx, int proto);
int ajp_init(jk_worker_t *pThis,
jk_map_t *props,
jk_worker_env_t *we, jk_log_context_t *log_ctx, int proto);
int JK_METHOD ajp_worker_factory(jk_worker_t **w,
const char *name, jk_log_context_t *log_ctx);
int ajp_destroy(jk_worker_t **pThis, jk_log_context_t *log_ctx, int proto);
int JK_METHOD ajp_done(jk_endpoint_t **e, jk_log_context_t *log_ctx);
int ajp_get_endpoint(jk_worker_t *pThis,
jk_endpoint_t **pend, jk_log_context_t *log_ctx, int proto);
int ajp_connect_to_endpoint(ajp_endpoint_t * ae, jk_log_context_t *log_ctx);
void ajp_close_endpoint(ajp_endpoint_t * ae, jk_log_context_t *log_ctx);
void jk_ajp_pull(ajp_worker_t * aw, int locked, jk_log_context_t *log_ctx);
void jk_ajp_push(ajp_worker_t * aw, int locked, jk_log_context_t *log_ctx);
int ajp_connection_tcp_send_message(ajp_endpoint_t * ae,
jk_msg_buf_t *msg, jk_log_context_t *log_ctx);
int ajp_connection_tcp_get_message(ajp_endpoint_t * ae,
jk_msg_buf_t *msg, jk_log_context_t *log_ctx);
int JK_METHOD ajp_maintain(jk_worker_t *pThis, time_t now, int global, jk_log_context_t *log_ctx);
int JK_METHOD ajp_shutdown(jk_worker_t *pThis, jk_log_context_t *log_ctx);
void jk_ajp_get_cping_text(int mode, char *buf);
int jk_ajp_get_cping_mode(const char *m, int def);
int ajp_has_endpoint(jk_worker_t *pThis, jk_log_context_t *log_ctx);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* JK_AJP_COMMON_H */