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 + -
显示快捷键?