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"
99 #include "http_config.h"
100 #include "ap_config.h"
101 #include "http_core.h"
102 #include "http_protocol.h"
103 #include "http_request.h"
104 #include "http_vhost.h"
105 #include "http_main.h"
106 #include "http_log.h"
107 #include "http_connection.h"
108 #include "util_filter.h"
109 #include "mod_core.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 */
146 struct dirconn_entry {
148 struct in_addr addr, mask;
149 struct apr_sockaddr_t *hostaddr;
150 int (*matcher) (struct dirconn_entry * This, request_rec *r);
153 struct noproxy_entry {
155 struct apr_sockaddr_t *addr;
159 apr_array_header_t *proxies;
160 apr_array_header_t *sec_proxy;
161 apr_array_header_t *aliases;
162 apr_array_header_t *raliases;
163 apr_array_header_t *noproxies;
164 apr_array_header_t *dirconn;
165 apr_array_header_t *allowed_connect_ports;
166 const char *domain; /* domain name to use in absence of a domain name in the request */
167 int req; /* true if proxy requests are enabled */
174 } viaopt; /* how to deal with proxy Via: headers */
176 size_t recv_buffer_size;
177 char recv_buffer_size_set;
183 const char *p; /* The path */
184 int p_is_fnmatch; /* Is this path an fnmatch candidate? */
185 regex_t *r; /* Is this a regex? */
189 conn_rec *connection;
195 float cache_completion; /* completion percentage */
196 int content_length; /* length of the content */
202 /* Create a set of PROXY_DECLARE(type), PROXY_DECLARE_NONSTD(type) and
203 * PROXY_DECLARE_DATA with appropriate export and import tags for the platform
206 #define PROXY_DECLARE(type) type
207 #define PROXY_DECLARE_NONSTD(type) type
208 #define PROXY_DECLARE_DATA
209 #elif defined(PROXY_DECLARE_STATIC)
210 #define PROXY_DECLARE(type) type __stdcall
211 #define PROXY_DECLARE_NONSTD(type) type
212 #define PROXY_DECLARE_DATA
213 #elif defined(PROXY_DECLARE_EXPORT)
214 #define PROXY_DECLARE(type) __declspec(dllexport) type __stdcall
215 #define PROXY_DECLARE_NONSTD(type) __declspec(dllexport) type
216 #define PROXY_DECLARE_DATA __declspec(dllexport)
218 #define PROXY_DECLARE(type) __declspec(dllimport) type __stdcall
219 #define PROXY_DECLARE_NONSTD(type) __declspec(dllimport) type
220 #define PROXY_DECLARE_DATA __declspec(dllimport)
223 APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, scheme_handler, (request_rec *r,
224 proxy_server_conf *conf, char *url,
225 const char *proxyhost, apr_port_t proxyport))
226 APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, canon_handler, (request_rec *r,
231 PROXY_DECLARE(request_rec *)ap_proxy_make_fake_req(conn_rec *c, request_rec *r);
232 PROXY_DECLARE(int) ap_proxy_hex2c(const char *x);
233 PROXY_DECLARE(void) ap_proxy_c2hex(int ch, char *x);
234 PROXY_DECLARE(char *)ap_proxy_canonenc(apr_pool_t *p, const char *x, int len, enum enctype t,
236 PROXY_DECLARE(char *)ap_proxy_canon_netloc(apr_pool_t *p, char **const urlp, char **userp,
237 char **passwordp, char **hostp, apr_port_t *port);
238 PROXY_DECLARE(const char *)ap_proxy_date_canon(apr_pool_t *p, const char *x);
239 PROXY_DECLARE(apr_table_t *)ap_proxy_read_headers(request_rec *r, request_rec *rp, char *buffer, int size, conn_rec *c);
240 PROXY_DECLARE(int) ap_proxy_liststr(const char *list, const char *val);
241 PROXY_DECLARE(char *)ap_proxy_removestr(apr_pool_t *pool, const char *list, const char *val);
242 PROXY_DECLARE(int) ap_proxy_hex2sec(const char *x);
243 PROXY_DECLARE(void) ap_proxy_sec2hex(int t, char *y);
244 PROXY_DECLARE(int) ap_proxyerror(request_rec *r, int statuscode, const char *message);
245 PROXY_DECLARE(int) ap_proxy_is_ipaddr(struct dirconn_entry *This, apr_pool_t *p);
246 PROXY_DECLARE(int) ap_proxy_is_domainname(struct dirconn_entry *This, apr_pool_t *p);
247 PROXY_DECLARE(int) ap_proxy_is_hostname(struct dirconn_entry *This, apr_pool_t *p);
248 PROXY_DECLARE(int) ap_proxy_is_word(struct dirconn_entry *This, apr_pool_t *p);
249 PROXY_DECLARE(int) ap_proxy_checkproxyblock(request_rec *r, proxy_server_conf *conf, apr_sockaddr_t *uri_addr);
250 PROXY_DECLARE(int) ap_proxy_pre_http_connection(conn_rec *c, request_rec *r);
251 PROXY_DECLARE(apr_status_t) ap_proxy_string_read(conn_rec *c, apr_bucket_brigade *bb, char *buff, size_t bufflen, int *eos);
252 PROXY_DECLARE(void) ap_proxy_reset_output_filters(conn_rec *c);
255 #endif /*MOD_PROXY_H*/