mod_proxy.h revision 081acc071cb29d1264c46684b0c608901f34eb91
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* Copyright 1999-2004 The Apache Software Foundation
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Licensed under the Apache License, Version 2.0 (the "License");
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * you may not use this file except in compliance with the License.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * You may obtain a copy of the License at
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Unless required by applicable law or agreed to in writing, software
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * distributed under the License is distributed on an "AS IS" BASIS,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * See the License for the specific language governing permissions and
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * limitations under the License.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Main include file for the Apache proxy
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek Also note numerous FIXMEs and CHECKMEs which should be eliminated.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek This code is once again experimental!
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek Things to do:
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek 1. Make it completely work (for FTP too)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek Chuck Murcko <chuck@topsail.org> 02-06-01
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* for proxy_canonenc() */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek enc_path, enc_search, enc_user, enc_fpath, enc_parm
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#else /*APR_CHARSET_EBCDIC*/
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#endif /*APR_CHARSET_EBCDIC*/
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* default Max-Forwards header setting */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* static information about a remote proxy */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *scheme; /* the schemes handled by this proxy, or '*' */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *protocol; /* the scheme used to talk to this proxy */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *hostname; /* the hostname of this proxy */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek regex_t *regexp; /* compiled regex (if any) for the remote */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int use_regex; /* simple boolean. True if we have a regex pattern */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *real;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *fake;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int (*matcher) (struct dirconn_entry * This, request_rec *r);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *name;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozektypedef struct {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_worker *forward; /* forward proxy worker */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_worker *reverse; /* reverse "module-driven" proxy worker */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *domain; /* domain name to use in absence of a domain name in the request */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int req; /* true if proxy requests are enabled */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek } viaopt; /* how to deal with proxy Via: headers */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * the following setting masks the error page
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * returned from the 'proxied server' and just
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * forwards the status code upwards.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * This allows the main server (us) to generate
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * the error page, (so it will look like a error
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * returned from the rest of the system
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* putting new stuff on the end maximises binary back-compatibility.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * the strmatch_patterns are really a const just to have a
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * case-independent strstr.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_pool_t *pool; /* Pool used for allocating this struct */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozektypedef struct {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *p; /* The path */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int p_is_fnmatch; /* Is this path an fnmatch candidate? */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozektypedef struct {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_pool_t *pool; /* Subpool used for creating socket */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_sockaddr_t *addr; /* Preparsed remote address info */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int close_on_recycle; /* Close the connection when returning to pool */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_worker *worker; /* Connection pool this connection belogns to */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozektypedef struct {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek float cache_completion; /* completion percentage */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek int content_length; /* length of the content */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* Connection pool */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_pool_t *pool; /* The pool used in constructor and destructor calls */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_sockaddr_t *addr; /* Preparsed remote address info */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_reslist_t *res; /* Connection resource list */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_conn_rec *conn; /* Single connection for prefork mpm's */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* woker status flags */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#define PROXY_WORKER_IS_USABLE(f) (!((f)->s->status & 0x00F0))
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek/* default worker retry timeout in seconds */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* Runtime worker status informations. Shared in scoreboard */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozektypedef struct {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_time_t error_time; /* time of the last error */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int retries; /* number of retries on this worker */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_off_t transfered; /* Number of bytes transfered to remote */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_off_t readed; /* Number of bytes readed from remote */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_size_t elected; /* Number of times the worker was elected */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* Worker configuration */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_interval_time_t retry; /* retry interval */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int lbfactor; /* initial load balancing factor */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *name;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *scheme; /* scheme to use ajp|http|https */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek const char *hostname; /* remote backend address */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *redirect; /* temporary balancing redirection route */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int min; /* Desired minimum number of available connections */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int smax; /* Soft maximum on the total number of connections */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int hmax; /* Hard maximum on the total number of connections */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek apr_interval_time_t ttl; /* maximum amount of time in seconds a connection
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * may be available while exceeding the soft limit */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek apr_interval_time_t timeout; /* connection timeout */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek apr_interval_time_t acquire; /* acquire timeout when the maximum number of connections is exceeded */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_conn_pool *cp; /* Connection pool to use */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_thread_mutex_t *mutex; /* Thread lock for updating address cache */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek apr_array_header_t *workers; /* array of proxy_workers */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek const char *name; /* name of the load balancer */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek const char *sticky; /* sticky session identifier */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek int sticky_force; /* Disable failover for sticky sessions */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek apr_interval_time_t timeout; /* Timeout for waiting on free connection */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek int max_attempts; /* Number of attempts before failing */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek /* XXX: Perhaps we will need the proc mutex too.
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek * Altrough we are only using arithmetic operations
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek * it may lead to a incorrect calculations.
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek * For now use only the thread mutex.
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek apr_thread_mutex_t *mutex; /* Thread lock for updating lb params */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#define PROXY_THREAD_LOCK(x) apr_thread_mutex_lock((x)->mutex)
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#define PROXY_THREAD_UNLOCK(x) apr_thread_mutex_unlock((x)->mutex)
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek/* Create a set of PROXY_DECLARE(type), PROXY_DECLARE_NONSTD(type) and
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek * PROXY_DECLARE_DATA with appropriate export and import tags for the platform
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_DECLARE(type) __declspec(dllexport) type __stdcall
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_DECLARE_NONSTD(type) __declspec(dllexport) type
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#define PROXY_DECLARE_DATA __declspec(dllexport)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_DECLARE(type) __declspec(dllimport) type __stdcall
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_DECLARE_NONSTD(type) __declspec(dllimport) type
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#define PROXY_DECLARE_DATA __declspec(dllimport)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Hook an optional proxy hook. Unlike static hooks, this uses a macro
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * instead of a function.
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#define PROXY_OPTIONAL_HOOK(name,fn,pre,succ,order) \
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek APR_OPTIONAL_HOOK(proxy,name,fn,pre,succ,order)
7f5de490e24f1389501b939b742a9e5675f1c41dJakub HrozekAPR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, scheme_handler, (request_rec *r,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek proxy_worker *worker, proxy_server_conf *conf, char *url,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub HrozekAPR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, canon_handler, (request_rec *r,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub HrozekAPR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, create_req, (request_rec *r, request_rec *pr))
7f5de490e24f1389501b939b742a9e5675f1c41dJakub HrozekAPR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, fixups, (request_rec *r))
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek * pre request hook.
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek * It will return the most suitable worker at the moment
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek * and coresponding balancer.
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek * The url is rewritten from balancer://cluster/uri to scheme://host:port/uri
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek * and then the scheme_handler is called.
7f5de490e24f1389501b939b742a9e5675f1c41dJakub HrozekAPR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, pre_request, (proxy_worker **worker,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek * post request hook.
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek * It is called after request for updating runtime balancer status.
7f5de490e24f1389501b939b742a9e5675f1c41dJakub HrozekAPR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, post_request, (proxy_worker *worker,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(request_rec *)ap_proxy_make_fake_req(conn_rec *c, request_rec *r);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_hex2c(const char *x);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(void) ap_proxy_c2hex(int ch, char *x);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(char *)ap_proxy_canonenc(apr_pool_t *p, const char *x, int len, enum enctype t,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(char *)ap_proxy_canon_netloc(apr_pool_t *p, char **const urlp, char **userp,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char **passwordp, char **hostp, apr_port_t *port);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(const char *)ap_proxy_date_canon(apr_pool_t *p, const char *x);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_liststr(const char *list, const char *val);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(char *)ap_proxy_removestr(apr_pool_t *pool, const char *list, const char *val);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_hex2sec(const char *x);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(void) ap_proxy_sec2hex(int t, char *y);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxyerror(request_rec *r, int statuscode, const char *message);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_is_ipaddr(struct dirconn_entry *This, apr_pool_t *p);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_is_domainname(struct dirconn_entry *This, apr_pool_t *p);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_is_hostname(struct dirconn_entry *This, apr_pool_t *p);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_is_word(struct dirconn_entry *This, apr_pool_t *p);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_checkproxyblock(request_rec *r, proxy_server_conf *conf, apr_sockaddr_t *uri_addr);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_pre_http_request(conn_rec *c, request_rec *r);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(apr_status_t) ap_proxy_string_read(conn_rec *c, apr_bucket_brigade *bb, char *buff, size_t bufflen, int *eos);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(void) ap_proxy_table_unmerge(apr_pool_t *p, apr_table_t *t, char *key);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* DEPRECATED (will be replaced with ap_proxy_connect_backend */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_connect_to_backend(apr_socket_t **, const char *, apr_sockaddr_t *, const char *, proxy_server_conf *, server_rec *, apr_pool_t *);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_ssl_enable(conn_rec *c);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_ssl_disable(conn_rec *c);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* Connection pool API */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Get the worker from proxy configuration
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param p memory pool used for finding worker
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param conf current proxy server configuration
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param url url to find the worker from
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return proxy_worker or NULL if not found
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(proxy_worker *) ap_proxy_get_worker(apr_pool_t *p,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *url);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Add the worker to proxy configuration
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param worker the new worker
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param p memory pool to allocate worker from
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param conf current proxy server configuration
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param url url containing worker name
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return error message or NULL if successfull
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(const char *) ap_proxy_add_worker(proxy_worker **worker,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *url);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Create new worker
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param p memory pool to allocate worker from
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return new worker
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(proxy_worker *) ap_proxy_create_worker(apr_pool_t *p);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Initize the worker's shared data
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param conf current proxy server configuration
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param worker worker to initialize
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param s current server record
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param worker worker to initialize
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(void) ap_proxy_initialize_worker_share(proxy_server_conf *conf,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Initize the worker
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param worker worker to initialize
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param s current server record
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return APR_SUCCESS or error code
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(apr_status_t) ap_proxy_initialize_worker(proxy_worker *worker,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Get the balancer from proxy configuration
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param p memory pool used for finding balancer
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param conf current proxy server configuration
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param url url to find the worker from. Has to have balancer:// prefix
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return proxy_balancer or NULL if not found
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(proxy_balancer *) ap_proxy_get_balancer(apr_pool_t *p,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *url);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Add the balancer to proxy configuration
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param balancer the new balancer
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param p memory pool to allocate balancer from
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param conf current proxy server configuration
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param url url containing balancer name
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return error message or NULL if successfull
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(const char *) ap_proxy_add_balancer(proxy_balancer **balancer,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *url);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Add the worker to the balancer
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param pool memory pool for adding worker
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param balancer balancer to add to
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param balancer worker to add
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @note Single worker can be added to multiple balancers.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(void) ap_proxy_add_worker_to_balancer(apr_pool_t *pool,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Get the most suitable worker and(or) balancer for the request
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param worker worker used for processing request
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param balancer balancer used for processing request
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param r current request
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param conf current proxy server configuration
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param url request url that balancer can rewrite.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return OK or HTTP_XXX error
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @note It calls balancer pre_request hook if the url starts with balancer://
2f3ee3f49019f5b60adbe073070f31e6e2d7c7abStephen Gallagher * The balancer then rewrites the url to particular worker, like http://host:port
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_pre_request(proxy_worker **worker,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Post request worker and balancer cleanup
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param worker worker used for processing request
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param balancer balancer used for processing request
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param r current request
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param conf current proxy server configuration
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return OK or HTTP_XXX error
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @note When ever the pre_request is called, the post_request has to be
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * called too.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_post_request(proxy_worker *worker,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Deternime backend hostname and port
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param p memory pool used for processing
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param r current request
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param conf current proxy server configuration
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param worker worker used for processing request
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param conn proxy connection struct
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param uri processed uri
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param url request url
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param proxyname are we connecting directly or via s proxy
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param proxyport proxy host port
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param server_portstr Via headers server port
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param server_portstr_size size of the server_portstr buffer
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return OK or HTTP_XXX error
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_determine_connection(apr_pool_t *p, request_rec *r,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Mark a worker for retry
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param proxy_function calling proxy scheme (http, ajp, ...)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param conf current proxy server configuration
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param worker worker used for retrying
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param s current server record
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return OK if marked for retry, DECLINED otherwise
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @note Worker will be marker for retry if the time of the last retry
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * has been ellapsed. In case there is no retry option set, defaults to
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * number_of_retries seconds.
7f5de490e24f1389501b939b742a9e5675f1c41dJakub HrozekPROXY_DECLARE(int) ap_proxy_retry_worker(const char *proxy_function,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Acquire a connection from workers connection pool
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param proxy_function calling proxy scheme (http, ajp, ...)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param conn acquired connection
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param worker worker used for obtaining connection
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param s current server record
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return OK or HTTP_XXX error
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @note If the number of connections is exhaused the function will
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * block untill the timeout is reached.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_acquire_connection(const char *proxy_function,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Release a connection back to worker connection pool
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param proxy_function calling proxy scheme (http, ajp, ...)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param conn acquired connection
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param s current server record
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return OK or HTTP_XXX error
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @note The connection will be closed if conn->close_on_release is set
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_release_connection(const char *proxy_function,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Make a connection to the backend
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param proxy_function calling proxy scheme (http, ajp, ...)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param conn acquired connection
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param worker connection worker
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param s current server record
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return OK or HTTP_XXX error
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @note In case the socket already exists for conn, just check the link
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Make a connection record for backend connection
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param proxy_function calling proxy scheme (http, ajp, ...)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param conn acquired connection
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param c client connection record
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param s current server record
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return OK or HTTP_XXX error
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* Scoreboard */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* The number of dynamic workers that can be added when reconfiguring.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * If this limit is reached you must stop and restart the server.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Calculate number of maximum number of workers in scoreboard.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return number of workers to allocate in the scoreboard
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* For proxy_util */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#endif /*MOD_PROXY_H*/