mod_proxy.h
来自「apache服务器源代码(版本号:2.2.2)」· C头文件 代码 · 共 723 行 · 第 1/2 页
H
723 行
/* Copyright 1999-2005 The Apache Software Foundation or its licensors, as * applicable. * * Licensed 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. */#ifndef MOD_PROXY_H#define MOD_PROXY_H /** * @file mod_proxy.h * @brief Proxy Extension Module for Apache * * @defgroup MOD_PROXY mod_proxy * @ingroup APACHE_MODS * @{ *//* Also note numerous FIXMEs and CHECKMEs which should be eliminated. This code is once again experimental! Things to do: 1. Make it completely work (for FTP too) 2. HTTP/1.1 Chuck Murcko <chuck@topsail.org> 02-06-01 */#define CORE_PRIVATE#include "apr_hooks.h"#include "apr.h"#include "apr_lib.h"#include "apr_strings.h"#include "apr_buckets.h"#include "apr_md5.h"#include "apr_network_io.h"#include "apr_pools.h"#include "apr_strings.h"#include "apr_uri.h"#include "apr_date.h"#include "apr_strmatch.h"#include "apr_fnmatch.h"#include "apr_reslist.h"#define APR_WANT_STRFUNC#include "apr_want.h"#include "httpd.h"#include "http_config.h"#include "ap_config.h"#include "http_core.h"#include "http_protocol.h"#include "http_request.h"#include "http_vhost.h"#include "http_main.h"#include "http_log.h"#include "http_connection.h"#include "util_filter.h"#include "util_ebcdic.h"#include "ap_provider.h"#if APR_HAVE_NETINET_IN_H#include <netinet/in.h>#endif#if APR_HAVE_ARPA_INET_H#include <arpa/inet.h>#endif/* for proxy_canonenc() */enum enctype { enc_path, enc_search, enc_user, enc_fpath, enc_parm};#if APR_CHARSET_EBCDIC#define CRLF "\r\n"#else /*APR_CHARSET_EBCDIC*/#define CRLF "\015\012"#endif /*APR_CHARSET_EBCDIC*//* default Max-Forwards header setting */#define DEFAULT_MAX_FORWARDS 10/* static information about a remote proxy */struct proxy_remote { const char *scheme; /* the schemes handled by this proxy, or '*' */ const char *protocol; /* the scheme used to talk to this proxy */ const char *hostname; /* the hostname of this proxy */ apr_port_t port; /* the port for this proxy */ ap_regex_t *regexp; /* compiled regex (if any) for the remote */ int use_regex; /* simple boolean. True if we have a regex pattern */};struct proxy_alias { const char *real; const char *fake;};struct dirconn_entry { char *name; struct in_addr addr, mask; struct apr_sockaddr_t *hostaddr; int (*matcher) (struct dirconn_entry * This, request_rec *r);};struct noproxy_entry { const char *name; struct apr_sockaddr_t *addr;};typedef struct proxy_balancer proxy_balancer;typedef struct proxy_worker proxy_worker;typedef struct proxy_conn_pool proxy_conn_pool;typedef struct proxy_balancer_method proxy_balancer_method;typedef struct { apr_array_header_t *proxies; apr_array_header_t *sec_proxy; apr_array_header_t *aliases; apr_array_header_t *noproxies; apr_array_header_t *dirconn; apr_array_header_t *allowed_connect_ports; apr_array_header_t *workers; apr_array_header_t *balancers; proxy_worker *forward; /* forward proxy worker */ proxy_worker *reverse; /* reverse "module-driven" proxy worker */ const char *domain; /* domain name to use in absence of a domain name in the request */ int req; /* true if proxy requests are enabled */ char req_set; enum { via_off, via_on, via_block, via_full } viaopt; /* how to deal with proxy Via: headers */ char viaopt_set; apr_size_t recv_buffer_size; char recv_buffer_size_set; apr_size_t io_buffer_size; char io_buffer_size_set; long maxfwd; char maxfwd_set; /** * the following setting masks the error page * returned from the 'proxied server' and just * forwards the status code upwards. * This allows the main server (us) to generate * the error page, (so it will look like a error * returned from the rest of the system */ int error_override; int error_override_set; int preserve_host; int preserve_host_set; apr_interval_time_t timeout; char timeout_set; enum { bad_error, bad_ignore, bad_body } badopt; /* how to deal with bad headers */ char badopt_set;/* putting new stuff on the end maximises binary back-compatibility. * the strmatch_patterns are really a const just to have a * case-independent strstr. */ enum { status_off, status_on, status_full } proxy_status; /* Status display options */ char proxy_status_set; apr_pool_t *pool; /* Pool used for allocating this struct */} proxy_server_conf;typedef struct { const char *p; /* The path */ int p_is_fnmatch; /* Is this path an fnmatch candidate? */ ap_regex_t *r; /* Is this a regex? *//* ProxyPassReverse and friends are documented as working inside * <Location>. But in fact they never have done in the case of * more than one <Location>, because the server_conf can't see it. * We need to move them to the per-dir config. * Discussed in February: * http://marc.theaimsgroup.com/?l=apache-httpd-dev&m=110726027118798&w=2 */ apr_array_header_t *raliases; apr_array_header_t* cookie_paths; apr_array_header_t* cookie_domains; const apr_strmatch_pattern* cookie_path_str; const apr_strmatch_pattern* cookie_domain_str;} proxy_dir_conf;typedef struct { conn_rec *connection; const char *hostname; apr_port_t port; int is_ssl; apr_pool_t *pool; /* Subpool used for creating socket */ apr_socket_t *sock; /* Connection socket */ apr_sockaddr_t *addr; /* Preparsed remote address info */ apr_uint32_t flags; /* Conection flags */ int close; /* Close 'this' connection */ int close_on_recycle; /* Close the connection when returning to pool */ proxy_worker *worker; /* Connection pool this connection belogns to */ void *data; /* per scheme connection data */#if APR_HAS_THREADS int inreslist; /* connection in apr_reslist? */#endif} proxy_conn_rec;typedef struct { float cache_completion; /* completion percentage */ int content_length; /* length of the content */} proxy_completion;/* Connection pool */struct proxy_conn_pool { apr_pool_t *pool; /* The pool used in constructor and destructor calls */ apr_sockaddr_t *addr; /* Preparsed remote address info */#if APR_HAS_THREADS apr_reslist_t *res; /* Connection resource list */#endif proxy_conn_rec *conn; /* Single connection for prefork mpm's */};/* woker status flags */#define PROXY_WORKER_INITIALIZED 0x0001#define PROXY_WORKER_IGNORE_ERRORS 0x0002#define PROXY_WORKER_IN_SHUTDOWN 0x0010#define PROXY_WORKER_DISABLED 0x0020#define PROXY_WORKER_STOPPED 0x0040#define PROXY_WORKER_IN_ERROR 0x0080#define PROXY_WORKER_IS_USABLE(f) (!((f)->s->status & 0x00F0))/* default worker retry timeout in seconds */#define PROXY_WORKER_DEFAULT_RETRY 60#define PROXY_WORKER_MAX_ROUTE_SIZ 63/* Runtime worker status informations. Shared in scoreboard */typedef struct { int status; apr_time_t error_time; /* time of the last error */ int retries; /* number of retries on this worker */ int lbstatus; /* Current lbstatus */ int lbfactor; /* dynamic lbfactor */ apr_off_t transferred;/* Number of bytes transferred to remote */ apr_off_t read; /* Number of bytes read from remote */ apr_size_t elected; /* Number of times the worker was elected */ char route[PROXY_WORKER_MAX_ROUTE_SIZ+1]; char redirect[PROXY_WORKER_MAX_ROUTE_SIZ+1]; void *context; /* general purpose storage */} proxy_worker_stat;/* Worker configuration */struct proxy_worker { int id; /* scoreboard id */ apr_interval_time_t retry; /* retry interval */ int lbfactor; /* initial load balancing factor */ const char *name; const char *scheme; /* scheme to use ajp|http|https */ const char *hostname; /* remote backend address */ const char *route; /* balancing route */ const char *redirect; /* temporary balancing redirection route */ int status; /* temporary worker status */ apr_port_t port; int min; /* Desired minimum number of available connections */ int smax; /* Soft maximum on the total number of connections */ int hmax; /* Hard maximum on the total number of connections */ apr_interval_time_t ttl; /* maximum amount of time in seconds a connection * may be available while exceeding the soft limit */ apr_interval_time_t timeout; /* connection timeout */ char timeout_set; apr_interval_time_t acquire; /* acquire timeout when the maximum number of connections is exceeded */ char acquire_set; apr_size_t recv_buffer_size; char recv_buffer_size_set; apr_size_t io_buffer_size; char io_buffer_size_set; char keepalive; char keepalive_set; proxy_conn_pool *cp; /* Connection pool to use */ proxy_worker_stat *s; /* Shared data */ void *opaque; /* per scheme worker data */ int is_address_reusable;#if APR_HAS_THREADS apr_thread_mutex_t *mutex; /* Thread lock for updating address cache */#endif void *context; /* general purpose storage */ enum { flush_off, flush_on, flush_auto } flush_packets; /* control AJP flushing */ int flush_wait; /* poll wait time in microseconds if flush_auto */};/* * Wait 10000 microseconds to find out if more data is currently * available at the backend. Just an arbitrary choose. */#define PROXY_FLUSH_WAIT 10000struct proxy_balancer { apr_array_header_t *workers; /* array of proxy_workers */ const char *name; /* name of the load balancer */ const char *sticky; /* sticky session identifier */ int sticky_force; /* Disable failover for sticky sessions */ apr_interval_time_t timeout; /* Timeout for waiting on free connection */ int max_attempts; /* Number of attempts before failing */ char max_attempts_set; proxy_balancer_method *lbmethod; /* XXX: Perhaps we will need the proc mutex too. * Altrough we are only using arithmetic operations * it may lead to a incorrect calculations. * For now use only the thread mutex. */#if APR_HAS_THREADS apr_thread_mutex_t *mutex; /* Thread lock for updating lb params */#endif void *context; /* general purpose storage */};struct proxy_balancer_method { const char *name; /* name of the load balancer method*/ proxy_worker *(*finder)(proxy_balancer *balancer, request_rec *r); void *context; /* general purpose storage */};#if APR_HAS_THREADS#define PROXY_THREAD_LOCK(x) apr_thread_mutex_lock((x)->mutex)#define PROXY_THREAD_UNLOCK(x) apr_thread_mutex_unlock((x)->mutex)#else#define PROXY_THREAD_LOCK(x) APR_SUCCESS#define PROXY_THREAD_UNLOCK(x) APR_SUCCESS#endif/* hooks *//* Create a set of PROXY_DECLARE(type), PROXY_DECLARE_NONSTD(type) and * PROXY_DECLARE_DATA with appropriate export and import tags for the platform */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?