1 /* Copyright 1999-2004 The Apache Software Foundation
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
20 * Main include file for the Apache proxy
25 Also note numerous FIXMEs and CHECKMEs which should be eliminated.
27 This code is once again experimental!
31 1. Make it completely work (for FTP too)
35 Chuck Murcko <chuck@topsail.org> 02-06-01
41 #include "apr_hooks.h"
44 #include "apr_strings.h"
45 #include "apr_buckets.h"
47 #include "apr_network_io.h"
48 #include "apr_pools.h"
49 #include "apr_strings.h"
52 #include "apr_strmatch.h"
53 #include "apr_fnmatch.h"
54 #define APR_WANT_STRFUNC
58 #include "http_config.h"
59 #include "ap_config.h"
60 #include "http_core.h"
61 #include "http_protocol.h"
62 #include "http_request.h"
63 #include "http_vhost.h"
64 #include "http_main.h"
66 #include "http_connection.h"
67 #include "util_filter.h"
68 #include "util_ebcdic.h"
70 #if APR_HAVE_NETINET_IN_H
71 #include <netinet/in.h>
73 #if APR_HAVE_ARPA_INET_H
74 #include <arpa/inet.h>
77 /* for proxy_canonenc() */
79 enc_path, enc_search, enc_user, enc_fpath, enc_parm
82 #if APR_CHARSET_EBCDIC
84 #else /*APR_CHARSET_EBCDIC*/
85 #define CRLF "\015\012"
86 #endif /*APR_CHARSET_EBCDIC*/
88 /* default Max-Forwards header setting */
89 #define DEFAULT_MAX_FORWARDS 10
91 /* static information about a remote proxy */
93 const char *scheme; /* the schemes handled by this proxy, or '*' */
94 const char *protocol; /* the scheme used to talk to this proxy */
95 const char *hostname; /* the hostname of this proxy */
96 apr_port_t port; /* the port for this proxy */
97 regex_t *regexp; /* compiled regex (if any) for the remote */
98 int use_regex; /* simple boolean. True if we have a regex pattern */
106 struct dirconn_entry {
108 struct in_addr addr, mask;
109 struct apr_sockaddr_t *hostaddr;
110 int (*matcher) (struct dirconn_entry * This, request_rec *r);
113 struct noproxy_entry {
115 struct apr_sockaddr_t *addr;
119 apr_array_header_t *proxies;
120 apr_array_header_t *sec_proxy;
121 apr_array_header_t *aliases;
122 apr_array_header_t *raliases;
123 apr_array_header_t *noproxies;
124 apr_array_header_t *dirconn;
125 apr_array_header_t *allowed_connect_ports;
126 const char *domain; /* domain name to use in absence of a domain name in the request */
127 int req; /* true if proxy requests are enabled */
134 } viaopt; /* how to deal with proxy Via: headers */
136 apr_size_t recv_buffer_size;
137 char recv_buffer_size_set;
138 apr_size_t io_buffer_size;
139 char io_buffer_size_set;
143 * the following setting masks the error page
144 * returned from the 'proxied server' and just
145 * forwards the status code upwards.
146 * This allows the main server (us) to generate
147 * the error page, (so it will look like a error
148 * returned from the rest of the system
151 int error_override_set;
153 int preserve_host_set;
154 apr_interval_time_t timeout;
155 apr_interval_time_t timeout_set;
160 } badopt; /* how to deal with bad headers */
162 /* putting new stuff on the end maximises binary back-compatibility.
163 * the strmatch_patterns are really a const just to have a
164 * case-independent strstr.
166 apr_array_header_t* cookie_paths;
167 apr_array_header_t* cookie_domains;
168 const apr_strmatch_pattern* cookie_path_str;
169 const apr_strmatch_pattern* cookie_domain_str;
174 const char *p; /* The path */
175 int p_is_fnmatch; /* Is this path an fnmatch candidate? */
176 regex_t *r; /* Is this a regex? */
180 conn_rec *connection;
187 float cache_completion; /* completion percentage */
188 int content_length; /* length of the content */
194 /* Create a set of PROXY_DECLARE(type), PROXY_DECLARE_NONSTD(type) and
195 * PROXY_DECLARE_DATA with appropriate export and import tags for the platform
198 #define PROXY_DECLARE(type) type
199 #define PROXY_DECLARE_NONSTD(type) type
200 #define PROXY_DECLARE_DATA
201 #elif defined(PROXY_DECLARE_STATIC)
202 #define PROXY_DECLARE(type) type __stdcall
203 #define PROXY_DECLARE_NONSTD(type) type
204 #define PROXY_DECLARE_DATA
205 #elif defined(PROXY_DECLARE_EXPORT)
206 #define PROXY_DECLARE(type) __declspec(dllexport) type __stdcall
207 #define PROXY_DECLARE_NONSTD(type) __declspec(dllexport) type
208 #define PROXY_DECLARE_DATA __declspec(dllexport)
210 #define PROXY_DECLARE(type) __declspec(dllimport) type __stdcall
211 #define PROXY_DECLARE_NONSTD(type) __declspec(dllimport) type
212 #define PROXY_DECLARE_DATA __declspec(dllimport)
216 * Hook an optional proxy hook. Unlike static hooks, this uses a macro
217 * instead of a function.
219 #define PROXY_OPTIONAL_HOOK(name,fn,pre,succ,order) \
220 APR_OPTIONAL_HOOK(proxy,name,fn,pre,succ,order)
222 APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, scheme_handler, (request_rec *r,
223 proxy_server_conf *conf, char *url,
224 const char *proxyhost, apr_port_t proxyport))
225 APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, canon_handler, (request_rec *r,
228 APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, create_req, (request_rec *r, request_rec *pr))
229 APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, fixups, (request_rec *r))
233 PROXY_DECLARE(request_rec *)ap_proxy_make_fake_req(conn_rec *c, request_rec *r);
234 PROXY_DECLARE(int) ap_proxy_hex2c(const char *x);
235 PROXY_DECLARE(void) ap_proxy_c2hex(int ch, char *x);
236 PROXY_DECLARE(char *)ap_proxy_canonenc(apr_pool_t *p, const char *x, int len, enum enctype t,
238 PROXY_DECLARE(char *)ap_proxy_canon_netloc(apr_pool_t *p, char **const urlp, char **userp,
239 char **passwordp, char **hostp, apr_port_t *port);
240 PROXY_DECLARE(const char *)ap_proxy_date_canon(apr_pool_t *p, const char *x);
241 PROXY_DECLARE(int) ap_proxy_liststr(const char *list, const char *val);
242 PROXY_DECLARE(char *)ap_proxy_removestr(apr_pool_t *pool, const char *list, const char *val);
243 PROXY_DECLARE(int) ap_proxy_hex2sec(const char *x);
244 PROXY_DECLARE(void) ap_proxy_sec2hex(int t, char *y);
245 PROXY_DECLARE(int) ap_proxyerror(request_rec *r, int statuscode, const char *message);
246 PROXY_DECLARE(int) ap_proxy_is_ipaddr(struct dirconn_entry *This, apr_pool_t *p);
247 PROXY_DECLARE(int) ap_proxy_is_domainname(struct dirconn_entry *This, apr_pool_t *p);
248 PROXY_DECLARE(int) ap_proxy_is_hostname(struct dirconn_entry *This, apr_pool_t *p);
249 PROXY_DECLARE(int) ap_proxy_is_word(struct dirconn_entry *This, apr_pool_t *p);
250 PROXY_DECLARE(int) ap_proxy_checkproxyblock(request_rec *r, proxy_server_conf *conf, apr_sockaddr_t *uri_addr);
251 PROXY_DECLARE(int) ap_proxy_pre_http_request(conn_rec *c, request_rec *r);
252 PROXY_DECLARE(apr_status_t) ap_proxy_string_read(conn_rec *c, apr_bucket_brigade *bb, char *buff, size_t bufflen, int *eos);
253 PROXY_DECLARE(void) ap_proxy_table_unmerge(apr_pool_t *p, apr_table_t *t, char *key);
254 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 *);
255 PROXY_DECLARE(int) ap_proxy_ssl_enable(conn_rec *c);
256 PROXY_DECLARE(int) ap_proxy_ssl_disable(conn_rec *c);
259 extern module AP_MODULE_DECLARE_DATA proxy_module;
261 #endif /*MOD_PROXY_H*/