mod_proxy.h revision 8b503609014fb840b3c0e3bc8444de27d3dc6711
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina/* ====================================================================
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * The Apache Software License, Version 1.1
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina *
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * Copyright (c) 2000 The Apache Software Foundation. All rights
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * reserved.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina *
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 * are met:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina *
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 *
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 *
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 *
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 *
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 *
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 *
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 * <http://www.apache.org/>.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina *
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 */
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina#ifndef MOD_PROXY_H
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina#define MOD_PROXY_H
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina/*
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina * Main include file for the Apache proxy
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina */
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina/*
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose
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
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina If TESTING is set, then garbage collection doesn't delete ... probably a good
26cac569adbae18a11af7f9845340ec9fc49685bPavel Reichl idea when hacking.
26cac569adbae18a11af7f9845340ec9fc49685bPavel Reichl
26cac569adbae18a11af7f9845340ec9fc49685bPavel Reichl This code is still experimental!
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina Things to do:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina 1. Make it garbage collect in the background, not while someone is waiting for
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina a response!
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina 2. Check the logic thoroughly.
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
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
bbe74392605808f6c7f1fda6e8c3c66fbfb035f4Pavel Reichl Ben Laurie <ben@algroup.co.uk> 30 Mar 96
bbe74392605808f6c7f1fda6e8c3c66fbfb035f4Pavel Reichl
bbe74392605808f6c7f1fda6e8c3c66fbfb035f4Pavel Reichl More things to do:
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina 0. Code cleanup (ongoing)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina 1. add 230 response output for ftp now that it works
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina 2. Make the ftp proxy transparent, also same with (future) gopher & wais
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina 3. Use protocol handler struct a la Apache module handlers (Dirk van Gulik)
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina 4. Use a cache expiry database for more efficient GC (Jeremy Wohl)
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina 5. Bulletproof GC against SIGALRM
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina Chuck Murcko <chuck@topsail.org> 15 April 1997
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina
1b45fed9f629d47fefc3feaba01810ca2200fed3Pavel Březina */
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina#define TESTING 0
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina#undef EXPLAIN
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina#include "httpd.h"
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina#include "http_config.h"
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina#include "http_protocol.h"
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina#include "ap_cache.h"
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina#include "buff.h"
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina
53d05f6a88b52b8f7acc15a803c1ef439fa30244Pavel Březina#include "apr_compat.h"
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#include "apr_strings.h"
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#ifdef HAVE_NETDB_H
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#include <netdb.h>
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#endif
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#ifdef HAVE_SYS_SOCKET_H
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#include <sys/socket.h>
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#endif
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#ifdef HAVE_NETINET_IN_H
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#include <netinet/in.h>
2f90ec2e16f0c14c789d9ed20e008e3103337210Sumit Bose#endif
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#ifdef HAVE_ARPA_INET_H
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#include <arpa/inet.h>
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#endif
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinaextern module AP_MODULE_DECLARE_DATA proxy_module;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina/* for proxy_canonenc() */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinaenum enctype {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina enc_path, enc_search, enc_user, enc_fpath, enc_parm
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina};
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
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
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#ifdef CHARSET_EBCDIC
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#define CRLF "\r\n"
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#else /*CHARSET_EBCDIC*/
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#define CRLF "\015\012"
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#endif /*CHARSET_EBCDIC*/
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#define DEFAULT_FTP_DATA_PORT 20
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#define DEFAULT_FTP_PORT 21
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#define DEFAULT_GOPHER_PORT 70
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#define DEFAULT_NNTP_PORT 119
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#define DEFAULT_WAIS_PORT 210
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#define DEFAULT_HTTPS_PORT 443
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#define DEFAULT_SNEWS_PORT 563
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina#define DEFAULT_PROSPERO_PORT 1525 /* WARNING: conflict w/Oracle */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina#define DEFAULT_CACHE_COMPLETION (0.9)
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina/* Some WWW schemes and their default ports; this is basically /etc/services */
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastruct proxy_services {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *scheme;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina int port;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina};
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina/* static information about a remote proxy */
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastruct proxy_remote {
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 */
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina int port; /* the port for this proxy */
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina};
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastruct proxy_alias {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *real;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *fake;
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina};
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastruct dirconn_entry {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina char *name;
bbe74392605808f6c7f1fda6e8c3c66fbfb035f4Pavel Reichl struct in_addr addr, mask;
bbe74392605808f6c7f1fda6e8c3c66fbfb035f4Pavel Reichl struct hostent *hostentry;
bbe74392605808f6c7f1fda6e8c3c66fbfb035f4Pavel Reichl int (*matcher) (struct dirconn_entry * This, request_rec *r);
bbe74392605808f6c7f1fda6e8c3c66fbfb035f4Pavel Reichl};
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březinastruct noproxy_entry {
b69cb1787209e85cc246eb9a944242689bfe0c46Pavel Březina const char *name;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina struct in_addr addr;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina};
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březinastruct nocache_entry {
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina const char *name;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina struct in_addr addr;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina};
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březinatypedef struct {
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina apr_array_header_t *proxies;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina apr_array_header_t *aliases;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina apr_array_header_t *raliases;
6d0a69431a87a24dac04a9d77fbda5a6e24ac0ddPavel Březina apr_array_header_t *noproxies;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina apr_array_header_t *dirconn;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina apr_array_header_t *nocaches;
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina apr_array_header_t *allowed_connect_ports;
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 */
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina enum {
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina via_off,
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina via_on,
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina via_block,
55345aa1aaf1df23e5dfe8d584663f9fe6c4aeb9Pavel Březina via_full
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina } viaopt; /* how to deal with proxy Via: headers */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina size_t recv_buffer_size;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina ap_cache_handle_t *cache;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina} proxy_server_conf;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinastruct per_thread_data {
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina struct hostent hpbuf;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina u_long ipaddr;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina char *charpbuf[2];
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina};
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
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} proxy_completion;
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina/* Function prototypes */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina/* proxy_connect.c */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinaint ap_proxy_connect_handler(request_rec *r, ap_cache_el *c, char *url,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina const char *proxyhost, int proxyport);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina/* proxy_ftp.c */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
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řezina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina/* proxy_http.c */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinaint ap_proxy_http_canon(request_rec *r, char *url, const char *scheme,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina int def_port);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinaint ap_proxy_http_handler(request_rec *r, ap_cache_el *c, char *url,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina const char *proxyhost, int proxyport);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina/* proxy_util.c */
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinaint ap_proxy_hex2c(const char *x);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinavoid ap_proxy_c2hex(int ch, char *x);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinachar *ap_proxy_canonenc(apr_pool_t *p, const char *x, int len, enum enctype t,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina int isenc);
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březinachar *ap_proxy_canon_netloc(apr_pool_t *p, char **const urlp, char **userp,
23fb01bf67a6058fb508da6d81515e8b18634bebPavel Březina char **passwordp, char **hostp, int *port);
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,
8ca1a503cf82fe2c9ed6af9d5903a158496be122Pavel Březina const int is_HTTP1);
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březinaint ap_proxy_cache_update(ap_cache_el *c);
5e2ffb69dcdd157ea422c6aec256111653e4206bPavel Březinavoid ap_proxy_cache_error(ap_cache_el **r);
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);
unsigned ap_proxy_bputs2(const char *data, apr_socket_t *client, ap_cache_el *cache);
#endif /*MOD_PROXY_H*/