mod_proxy.h revision 8b503609014fb840b3c0e3bc8444de27d3dc6711
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina/* ====================================================================
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * The Apache Software License, Version 1.1
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * Copyright (c) 2000 The Apache Software Foundation. All rights
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * Redistribution and use in source and binary forms, with or without
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * modification, are permitted provided that the following conditions
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * 1. Redistributions of source code must retain the above copyright
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * notice, this list of conditions and the following disclaimer.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * 2. Redistributions in binary form must reproduce the above copyright
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * notice, this list of conditions and the following disclaimer in
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * the documentation and/or other materials provided with the
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * distribution.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * 3. The end-user documentation included with the redistribution,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * if any, must include the following acknowledgment:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * "This product includes software developed by the
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * Apache Software Foundation (http://www.apache.org/)."
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * Alternately, this acknowledgment may appear in the software itself,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * if and wherever such third-party acknowledgments normally appear.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * 4. The names "Apache" and "Apache Software Foundation" must
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * not be used to endorse or promote products derived from this
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * software without prior written permission. For written
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * permission, please contact apache@apache.org.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * 5. Products derived from this software may not be called "Apache",
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * nor may "Apache" appear in their name, without prior written
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * permission of the Apache Software Foundation.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
beee2afce4eb18aca7f1268e0184c6c428e817a7Dan Lavu * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
beee2afce4eb18aca7f1268e0184c6c428e817a7Dan Lavu * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
beee2afce4eb18aca7f1268e0184c6c428e817a7Dan Lavu * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
beee2afce4eb18aca7f1268e0184c6c428e817a7Dan Lavu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
beee2afce4eb18aca7f1268e0184c6c428e817a7Dan Lavu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
beee2afce4eb18aca7f1268e0184c6c428e817a7Dan Lavu * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
beee2afce4eb18aca7f1268e0184c6c428e817a7Dan Lavu * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
beee2afce4eb18aca7f1268e0184c6c428e817a7Dan Lavu * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
beee2afce4eb18aca7f1268e0184c6c428e817a7Dan Lavu * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * SUCH DAMAGE.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * ====================================================================
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * This software consists of voluntary contributions made by many
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * individuals on behalf of the Apache Software Foundation. For more
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * information on the Apache Software Foundation, please see
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * Portions of this software are based upon public domain software
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * originally written at the National Center for Supercomputing Applications,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * University of Illinois, Urbana-Champaign.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * Main include file for the Apache proxy
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose Note that the Explain() stuff is not yet complete.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina Also note numerous FIXMEs and CHECKMEs which should be eliminated.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina If TESTING is set, then garbage collection doesn't delete ... probably a good
26cac569adbae18a11af7f9845340ec9fc49685bPavel Reichl idea when hacking.
26cac569adbae18a11af7f9845340ec9fc49685bPavel Reichl This code is still experimental!
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina Things to do:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina 1. Make it garbage collect in the background, not while someone is waiting for
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina 2. Check the logic thoroughly.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina 3. Empty directories are only removed the next time round (but this does avoid
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina two passes). Consider doing them the first time round.
bbe74392605808f6c7f1fda6e8c3c66fbfb035f4Pavel Reichl Ben Laurie <ben@algroup.co.uk> 30 Mar 96
bbe74392605808f6c7f1fda6e8c3c66fbfb035f4Pavel Reichl More things to do:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina 0. Code cleanup (ongoing)
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina 1. add 230 response output for ftp now that it works
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina 2. Make the ftp proxy transparent, also same with (future) gopher & wais
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina 3. Use protocol handler struct a la Apache module handlers (Dirk van Gulik)
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina 4. Use a cache expiry database for more efficient GC (Jeremy Wohl)
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina 5. Bulletproof GC against SIGALRM
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina Chuck Murcko <chuck@topsail.org> 15 April 1997
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinaextern module AP_MODULE_DECLARE_DATA proxy_module;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina/* for proxy_canonenc() */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina enc_path, enc_search, enc_user, enc_fpath, enc_parm
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#define HDR_APP (0) /* append header, for proxy_add_header() */
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose#define HDR_REP (1) /* replace header, for proxy_add_header() */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#else /*CHARSET_EBCDIC*/
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#endif /*CHARSET_EBCDIC*/
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#define DEFAULT_PROSPERO_PORT 1525 /* WARNING: conflict w/Oracle */
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina/* Some WWW schemes and their default ports; this is basically /etc/services */
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina/* static information about a remote proxy */
26cac569adbae18a11af7f9845340ec9fc49685bPavel Reichl const char *scheme; /* the schemes handled by this proxy, or '*' */
26cac569adbae18a11af7f9845340ec9fc49685bPavel Reichl const char *protocol; /* the scheme used to talk to this proxy */
26cac569adbae18a11af7f9845340ec9fc49685bPavel Reichl const char *hostname; /* the hostname of this proxy */
bbe74392605808f6c7f1fda6e8c3c66fbfb035f4Pavel Reichl int (*matcher) (struct dirconn_entry * This, request_rec *r);
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březinatypedef struct {
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina const char *domain; /* domain name to use in absence of a domain name in the request */
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina int req; /* true if proxy requests are enabled */
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina float cache_completion; /* Force cache completion after this point */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina } viaopt; /* how to deal with proxy Via: headers */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinatypedef struct {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina float cache_completion; /* completion percentage */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina int content_length; /* length of the content */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina/* Function prototypes */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinaint ap_proxy_connect_handler(request_rec *r, ap_cache_el *c, char *url,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinaint ap_proxy_ftp_canon(request_rec *r, char *url);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinaint ap_proxy_ftp_handler(request_rec *r, ap_cache_el *c, char *url);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinaint ap_proxy_http_canon(request_rec *r, char *url, const char *scheme,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinaint ap_proxy_http_handler(request_rec *r, ap_cache_el *c, char *url,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinaint ap_proxy_hex2c(const char *x);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinachar *ap_proxy_canonenc(apr_pool_t *p, const char *x, int len, enum enctype t,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinachar *ap_proxy_canon_netloc(apr_pool_t *p, char **const urlp, char **userp,
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinaconst char *ap_proxy_date_canon(apr_pool_t *p, const char *x);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinaapr_table_t *ap_proxy_read_headers(request_rec *r, char *buffer, int size, BUFF *f);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinalong int ap_proxy_send_fb(proxy_completion *, apr_socket_t *f, request_rec *r, ap_cache_el *c);
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březinavoid ap_proxy_send_headers(request_rec *r, const char *respline, apr_table_t *hdrs);
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březinaint ap_proxy_liststr(const char *list, const char *val);
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březinavoid ap_proxy_hash(const char *it, char *val, int ndepth, int nlength);
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březinaint ap_proxy_hex2sec(const char *x);
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březinavoid ap_proxy_sec2hex(int t, char *y);
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březinaconst char *ap_proxy_host2addr(const char *host, struct hostent *reqhp);
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březinaint ap_proxy_cache_send(request_rec *r, ap_cache_el *c);
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březinaint ap_proxy_cache_should_cache(request_rec *r, apr_table_t *resp_hdrs,
11540d9efb85b9ed0341e8a1fc97fc078c6ce418Pavel Březinaint ap_proxyerror(request_rec *r, int statuscode, const char *message);
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březinaint ap_proxy_is_ipaddr(struct dirconn_entry *This, apr_pool_t *p);
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březinaint ap_proxy_is_domainname(struct dirconn_entry *This, apr_pool_t *p);
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březinaint ap_proxy_is_hostname(struct dirconn_entry *This, apr_pool_t *p);
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březinaint ap_proxy_is_word(struct dirconn_entry *This, apr_pool_t *p);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinaint ap_proxy_doconnect(apr_socket_t *sock, char *host, apr_uint32_t port, request_rec *r);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinaint ap_proxy_garbage_init(server_rec *, apr_pool_t *);
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina/* This function is called by ap_table_do() for all header lines */
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinaint ap_proxy_send_hdr_line(void *p, const char *key, const char *value);