1 /* ====================================================================
2 * The Apache Software License, Version 1.1
4 * Copyright (c) 2000-2001 The Apache Software Foundation. All rights
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
19 * 3. The end-user documentation included with the redistribution,
20 * if any, must include the following acknowledgment:
21 * "This product includes software developed by the
22 * Apache Software Foundation (http://www.apache.org/)."
23 * Alternately, this acknowledgment may appear in the software itself,
24 * if and wherever such third-party acknowledgments normally appear.
26 * 4. The names "Apache" and "Apache Software Foundation" must
27 * not be used to endorse or promote products derived from this
28 * software without prior written permission. For written
29 * permission, please contact apache@apache.org.
31 * 5. Products derived from this software may not be called "Apache",
32 * nor may "Apache" appear in their name, without prior written
33 * permission of the Apache Software Foundation.
35 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
47 * ====================================================================
49 * This software consists of voluntary contributions made by many
50 * individuals on behalf of the Apache Software Foundation. For more
51 * information on the Apache Software Foundation, please see
52 * <http://www.apache.org/>.
54 * Portions of this software are based upon public domain software
55 * originally written at the National Center for Supercomputing Applications,
56 * University of Illinois, Urbana-Champaign.
63 * Main include file for the Apache proxy
68 Also note numerous FIXMEs and CHECKMEs which should be eliminated.
70 This code is once again experimental!
74 1. Make it completely work (for FTP too)
78 Chuck Murcko <chuck@topsail.org> 02-06-01
84 #include "apr_hooks.h"
86 #include "apr_compat.h"
88 #include "apr_strings.h"
89 #include "apr_buckets.h"
91 #include "apr_network_io.h"
92 #include "apr_pools.h"
93 #include "apr_strings.h"
96 #include "apr_fnmatch.h"
97 #define APR_WANT_STRFUNC
101 #include "http_config.h"
102 #include "ap_config.h"
103 #include "http_core.h"
104 #include "http_protocol.h"
105 #include "http_request.h"
106 #include "http_vhost.h"
107 #include "http_main.h"
108 #include "http_log.h"
109 #include "http_connection.h"
110 #include "util_filter.h"
112 #if APR_HAVE_NETINET_IN_H
113 #include <netinet/in.h>
115 #if APR_HAVE_ARPA_INET_H
116 #include <arpa/inet.h>
119 /* for proxy_canonenc() */
121 enc_path, enc_search, enc_user, enc_fpath, enc_parm
124 #if APR_CHARSET_EBCDIC
126 #else /*APR_CHARSET_EBCDIC*/
127 #define CRLF "\015\012"
128 #endif /*APR_CHARSET_EBCDIC*/
130 /* default Max-Forwards header setting */
131 #define DEFAULT_MAX_FORWARDS 10
133 /* static information about a remote proxy */
134 struct proxy_remote {
135 const char *scheme; /* the schemes handled by this proxy, or '*' */
136 const char *protocol; /* the scheme used to talk to this proxy */
137 const char *hostname; /* the hostname of this proxy */
138 apr_port_t port; /* the port for this proxy */
139 regex_t *regexp; /* compiled regex (if any) for the remote */
140 int use_regex; /* simple boolean. True if we have a regex pattern */
148 struct dirconn_entry {
150 struct in_addr addr, mask;
151 struct apr_sockaddr_t *hostaddr;
152 int (*matcher) (struct dirconn_entry * This, request_rec *r);
155 struct noproxy_entry {
157 struct apr_sockaddr_t *addr;
161 apr_array_header_t *proxies;
162 apr_array_header_t *sec_proxy;
163 apr_array_header_t *aliases;
164 apr_array_header_t *raliases;
165 apr_array_header_t *noproxies;
166 apr_array_header_t *dirconn;
167 apr_array_header_t *allowed_connect_ports;
168 const char *domain; /* domain name to use in absence of a domain name in the request */
169 int req; /* true if proxy requests are enabled */
176 } viaopt; /* how to deal with proxy Via: headers */
178 apr_size_t recv_buffer_size;
179 char recv_buffer_size_set;
180 apr_size_t io_buffer_size;
181 char io_buffer_size_set;
185 * the following setting masks the error page
186 * returned from the 'proxied server' and just
187 * forwards the status code upwards.
188 * This allows the main server (us) to generate
189 * the error page, (so it will look like a error
190 * returned from the rest of the system
193 int error_override_set;
195 int preserve_host_set;
202 const char *p; /* The path */
203 int p_is_fnmatch; /* Is this path an fnmatch candidate? */
204 regex_t *r; /* Is this a regex? */
208 conn_rec *connection;
214 float cache_completion; /* completion percentage */
215 int content_length; /* length of the content */
221 /* Create a set of PROXY_DECLARE(type), PROXY_DECLARE_NONSTD(type) and
222 * PROXY_DECLARE_DATA with appropriate export and import tags for the platform
225 #define PROXY_DECLARE(type) type
226 #define PROXY_DECLARE_NONSTD(type) type
227 #define PROXY_DECLARE_DATA
228 #elif defined(PROXY_DECLARE_STATIC)
229 #define PROXY_DECLARE(type) type __stdcall
230 #define PROXY_DECLARE_NONSTD(type) type
231 #define PROXY_DECLARE_DATA
232 #elif defined(PROXY_DECLARE_EXPORT)
233 #define PROXY_DECLARE(type) __declspec(dllexport) type __stdcall
234 #define PROXY_DECLARE_NONSTD(type) __declspec(dllexport) type
235 #define PROXY_DECLARE_DATA __declspec(dllexport)
237 #define PROXY_DECLARE(type) __declspec(dllimport) type __stdcall
238 #define PROXY_DECLARE_NONSTD(type) __declspec(dllimport) type
239 #define PROXY_DECLARE_DATA __declspec(dllimport)
242 APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, scheme_handler, (request_rec *r,
243 proxy_server_conf *conf, char *url,
244 const char *proxyhost, apr_port_t proxyport))
245 APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, canon_handler, (request_rec *r,
248 APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, create_req, (request_rec *r, request_rec *pr))
252 PROXY_DECLARE(request_rec *)ap_proxy_make_fake_req(conn_rec *c, request_rec *r);
253 PROXY_DECLARE(int) ap_proxy_hex2c(const char *x);
254 PROXY_DECLARE(void) ap_proxy_c2hex(int ch, char *x);
255 PROXY_DECLARE(char *)ap_proxy_canonenc(apr_pool_t *p, const char *x, int len, enum enctype t,
257 PROXY_DECLARE(char *)ap_proxy_canon_netloc(apr_pool_t *p, char **const urlp, char **userp,
258 char **passwordp, char **hostp, apr_port_t *port);
259 PROXY_DECLARE(const char *)ap_proxy_date_canon(apr_pool_t *p, const char *x);
260 PROXY_DECLARE(apr_table_t *)ap_proxy_read_headers(request_rec *r, request_rec *rp, char *buffer, int size, conn_rec *c);
261 PROXY_DECLARE(int) ap_proxy_liststr(const char *list, const char *val);
262 PROXY_DECLARE(char *)ap_proxy_removestr(apr_pool_t *pool, const char *list, const char *val);
263 PROXY_DECLARE(int) ap_proxy_hex2sec(const char *x);
264 PROXY_DECLARE(void) ap_proxy_sec2hex(int t, char *y);
265 PROXY_DECLARE(int) ap_proxyerror(request_rec *r, int statuscode, const char *message);
266 PROXY_DECLARE(int) ap_proxy_is_ipaddr(struct dirconn_entry *This, apr_pool_t *p);
267 PROXY_DECLARE(int) ap_proxy_is_domainname(struct dirconn_entry *This, apr_pool_t *p);
268 PROXY_DECLARE(int) ap_proxy_is_hostname(struct dirconn_entry *This, apr_pool_t *p);
269 PROXY_DECLARE(int) ap_proxy_is_word(struct dirconn_entry *This, apr_pool_t *p);
270 PROXY_DECLARE(int) ap_proxy_checkproxyblock(request_rec *r, proxy_server_conf *conf, apr_sockaddr_t *uri_addr);
271 PROXY_DECLARE(int) ap_proxy_pre_http_request(conn_rec *c, request_rec *r);
272 PROXY_DECLARE(apr_status_t) ap_proxy_string_read(conn_rec *c, apr_bucket_brigade *bb, char *buff, size_t bufflen, int *eos);
273 PROXY_DECLARE(void) ap_proxy_reset_output_filters(conn_rec *c);
274 PROXY_DECLARE(void) ap_proxy_table_unmerge(apr_pool_t *p, apr_table_t *t, char *key);
275 PROXY_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 *);
277 #endif /*MOD_PROXY_H*/