mod_proxy.h revision 081acc071cb29d1264c46684b0c608901f34eb91
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* Copyright 1999-2004 The Apache Software Foundation
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek *
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 *
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * http://www.apache.org/licenses/LICENSE-2.0
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek *
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 */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#ifndef MOD_PROXY_H
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define MOD_PROXY_H
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/*
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Main include file for the Apache proxy
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/*
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek Also note numerous FIXMEs and CHECKMEs which should be eliminated.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek This code is once again experimental!
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek Things to do:
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek 1. Make it completely work (for FTP too)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek 2. HTTP/1.1
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek Chuck Murcko <chuck@topsail.org> 02-06-01
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define CORE_PRIVATE
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "apr_hooks.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "apr.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "apr_lib.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "apr_strings.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "apr_buckets.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "apr_md5.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "apr_network_io.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "apr_pools.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "apr_strings.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "apr_uri.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "apr_date.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "apr_strmatch.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "apr_fnmatch.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "apr_reslist.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define APR_WANT_STRFUNC
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "apr_want.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "httpd.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "http_config.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "ap_config.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "http_core.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "http_protocol.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "http_request.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "http_vhost.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "http_main.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "http_log.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "http_connection.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "util_filter.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include "util_ebcdic.h"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#if APR_HAVE_NETINET_IN_H
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include <netinet/in.h>
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#endif
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#if APR_HAVE_ARPA_INET_H
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#include <arpa/inet.h>
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#endif
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* for proxy_canonenc() */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekenum enctype {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek enc_path, enc_search, enc_user, enc_fpath, enc_parm
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek};
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#if APR_CHARSET_EBCDIC
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define CRLF "\r\n"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#else /*APR_CHARSET_EBCDIC*/
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define CRLF "\015\012"
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#endif /*APR_CHARSET_EBCDIC*/
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* default Max-Forwards header setting */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define DEFAULT_MAX_FORWARDS 10
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* static information about a remote proxy */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstruct proxy_remote {
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 apr_port_t port; /* the port for 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};
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstruct proxy_alias {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *real;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *fake;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek};
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstruct dirconn_entry {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char *name;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct in_addr addr, mask;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct apr_sockaddr_t *hostaddr;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int (*matcher) (struct dirconn_entry * This, request_rec *r);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek};
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstruct noproxy_entry {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *name;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek struct apr_sockaddr_t *addr;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek};
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozektypedef struct proxy_balancer proxy_balancer;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozektypedef struct proxy_worker proxy_worker;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozektypedef struct proxy_conn_pool proxy_conn_pool;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozektypedef struct {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_array_header_t *proxies;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_array_header_t *sec_proxy;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_array_header_t *aliases;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_array_header_t *raliases;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_array_header_t *noproxies;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_array_header_t *dirconn;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_array_header_t *allowed_connect_ports;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_array_header_t *workers;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_array_header_t *balancers;
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 char req_set;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek enum {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek via_off,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek via_on,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek via_block,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek via_full
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek } viaopt; /* how to deal with proxy Via: headers */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char viaopt_set;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_size_t recv_buffer_size;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char recv_buffer_size_set;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_size_t io_buffer_size;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char io_buffer_size_set;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek long maxfwd;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char maxfwd_set;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek /**
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 */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int error_override;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int error_override_set;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int preserve_host;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int preserve_host_set;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_interval_time_t timeout;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char timeout_set;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek enum {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek bad_error,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek bad_ignore,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek bad_body
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek } badopt; /* how to deal with bad headers */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char badopt_set;
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 */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_array_header_t* cookie_paths;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_array_header_t* cookie_domains;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const apr_strmatch_pattern* cookie_path_str;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const apr_strmatch_pattern* cookie_domain_str;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek enum {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek status_off,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek status_on,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek status_full
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek } proxy_status; /* Status display options */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char proxy_status_set;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_pool_t *pool; /* Pool used for allocating this struct */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek} proxy_server_conf;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozektypedef struct {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *p; /* The path */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int p_is_fnmatch; /* Is this path an fnmatch candidate? */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek regex_t *r; /* Is this a regex? */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek} proxy_dir_conf;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozektypedef struct {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek conn_rec *connection;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *hostname;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_port_t port;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int is_ssl;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_pool_t *pool; /* Subpool used for creating socket */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_socket_t *sock; /* Connection socket */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_sockaddr_t *addr; /* Preparsed remote address info */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek apr_uint32_t flags; /* Conection flags */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek int close; /* Close 'this' connection */
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 Hrozek void *data; /* per scheme connection data */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek} proxy_conn_rec;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozektypedef struct {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek float cache_completion; /* completion percentage */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek int content_length; /* length of the content */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek} proxy_completion;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* Connection pool */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstruct proxy_conn_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#if APR_HAS_THREADS
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_reslist_t *res; /* Connection resource list */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#endif
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_conn_rec *conn; /* Single connection for prefork mpm's */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek};
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* woker status flags */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_WORKER_INITIALIZED 0x0001
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_WORKER_IGNORE_ERRORS 0x0002
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_WORKER_IN_SHUTDOWN 0x0010
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_WORKER_DISABLED 0x0020
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_WORKER_IN_ERROR 0x0040
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#define PROXY_WORKER_IS_USABLE(f) (!((f)->s->status & 0x00F0))
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek/* default worker retry timeout in seconds */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_WORKER_DEFAULT_RETRY 60
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#define PROXY_WORKER_MAX_ROUTE_SIZ 63
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* Runtime worker status informations. Shared in scoreboard */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozektypedef struct {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int status;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_time_t error_time; /* time of the last error */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int retries; /* number of retries on this worker */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int lbstatus; /* Current lbstatus */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int lbfactor; /* dynamic lbfactor */
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 char route[PROXY_WORKER_MAX_ROUTE_SIZ+1];
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char redirect[PROXY_WORKER_MAX_ROUTE_SIZ+1];
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek} proxy_worker_stat;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* Worker configuration */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekstruct proxy_worker {
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int id; /* scoreboard id */
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 *route; /* balancing route */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *redirect; /* temporary balancing redirection route */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_port_t port;
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 char timeout_set;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek apr_interval_time_t acquire; /* acquire timeout when the maximum number of connections is exceeded */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek char acquire_set;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_size_t recv_buffer_size;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char recv_buffer_size_set;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek apr_size_t io_buffer_size;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char io_buffer_size_set;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char keepalive;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char keepalive_set;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_conn_pool *cp; /* Connection pool to use */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_worker_stat *s; /* Shared data */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek void *opaque; /* per scheme worker data */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int is_address_reusable;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#if APR_HAS_THREADS
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_thread_mutex_t *mutex; /* Thread lock for updating address cache */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#endif
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek};
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozekstruct proxy_balancer {
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 char max_attempts_set;
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
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 */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#if APR_HAS_THREADS
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek apr_thread_mutex_t *mutex; /* Thread lock for updating lb params */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#endif
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek};
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#if APR_HAS_THREADS
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#else
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#define PROXY_THREAD_LOCK(x) APR_SUCCESS
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#define PROXY_THREAD_UNLOCK(x) APR_SUCCESS
2f3ee3f49019f5b60adbe073070f31e6e2d7c7abStephen Gallagher#endif
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek/* hooks */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
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
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#if !defined(WIN32)
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#define PROXY_DECLARE(type) type
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#define PROXY_DECLARE_NONSTD(type) type
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_DECLARE_DATA
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#elif defined(PROXY_DECLARE_STATIC)
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_DECLARE(type) type __stdcall
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_DECLARE_NONSTD(type) type
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_DECLARE_DATA
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#elif defined(PROXY_DECLARE_EXPORT)
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)
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#else
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#endif
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Hook an optional proxy hook. Unlike static hooks, this uses a macro
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * instead of a function.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek#define PROXY_OPTIONAL_HOOK(name,fn,pre,succ,order) \
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek APR_OPTIONAL_HOOK(proxy,name,fn,pre,succ,order)
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
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 Hrozek const char *proxyhost, apr_port_t proxyport))
7f5de490e24f1389501b939b742a9e5675f1c41dJakub HrozekAPR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, canon_handler, (request_rec *r,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek char *url))
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek
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
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek/**
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 Hrozek *
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub HrozekAPR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, pre_request, (proxy_worker **worker,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek proxy_balancer **balancer,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek request_rec *r,
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek proxy_server_conf *conf, char **url))
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek/**
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek * post request hook.
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek * It is called after request for updating runtime balancer status.
7f5de490e24f1389501b939b742a9e5675f1c41dJakub Hrozek */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub HrozekAPR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, post_request, (proxy_worker *worker,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_balancer *balancer, request_rec *r,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_server_conf *conf))
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* proxy_util.c */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
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 Hrozek int isenc);
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
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* Connection pool API */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
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 Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(proxy_worker *) ap_proxy_get_worker(apr_pool_t *p,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_server_conf *conf,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *url);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
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 Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(const char *) ap_proxy_add_worker(proxy_worker **worker,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_pool_t *p,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_server_conf *conf,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *url);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Create new worker
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @param p memory pool to allocate worker from
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return new worker
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(proxy_worker *) ap_proxy_create_worker(apr_pool_t *p);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
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 Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(void) ap_proxy_initialize_worker_share(proxy_server_conf *conf,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_worker *worker,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek server_rec *s);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
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 Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(apr_status_t) ap_proxy_initialize_worker(proxy_worker *worker,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek server_rec *s);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
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 Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(proxy_balancer *) ap_proxy_get_balancer(apr_pool_t *p,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_server_conf *conf,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *url);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
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 Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(const char *) ap_proxy_add_balancer(proxy_balancer **balancer,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_pool_t *p,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_server_conf *conf,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *url);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
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 Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(void) ap_proxy_add_worker_to_balancer(apr_pool_t *pool,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_balancer *balancer,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_worker *worker);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
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
2f3ee3f49019f5b60adbe073070f31e6e2d7c7abStephen Gallagher */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_pre_request(proxy_worker **worker,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_balancer **balancer,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek request_rec *r,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_server_conf *conf,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char **url);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
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 Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_post_request(proxy_worker *worker,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_balancer *balancer,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek request_rec *r,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_server_conf *conf);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
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 Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_determine_connection(apr_pool_t *p, request_rec *r,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_server_conf *conf,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_worker *worker,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_conn_rec *conn,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_uri_t *uri,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char **url,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek const char *proxyname,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek apr_port_t proxyport,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek char *server_portstr,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek int server_portstr_size);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
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.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek */
7f5de490e24f1389501b939b742a9e5675f1c41dJakub HrozekPROXY_DECLARE(int) ap_proxy_retry_worker(const char *proxy_function,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_worker *worker,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek server_rec *s);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
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 Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_acquire_connection(const char *proxy_function,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_conn_rec **conn,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_worker *worker,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek server_rec *s);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
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 Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_release_connection(const char *proxy_function,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_conn_rec *conn,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek server_rec *s);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
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 Hrozek * status.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_conn_rec *conn,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_worker *worker,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek server_rec *s);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
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 Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub HrozekPROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek proxy_conn_rec *conn,
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek conn_rec *c, server_rec *s);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* Scoreboard */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#if MODULE_MAGIC_NUMBER_MAJOR > 20020903
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_HAS_SCOREBOARD 1
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#else
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_HAS_SCOREBOARD 0
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#endif
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
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 */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#define PROXY_DYNAMIC_BALANCER_LIMIT 16
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/**
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * Calculate number of maximum number of workers in scoreboard.
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek * @return number of workers to allocate in the scoreboard
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekint ap_proxy_lb_workers(void);
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek/* For proxy_util */
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekextern module PROXY_DECLARE_DATA proxy_module;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozekextern int PROXY_DECLARE_DATA proxy_lb_workers;
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek#endif /*MOD_PROXY_H*/
cc84fd46f356c4a36a721ab135a33ec77c93e34dJakub Hrozek