1 /* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 * Main include file for the Apache proxy
26 Also note numerous FIXMEs and CHECKMEs which should be eliminated.
28 This code is once again experimental!
32 1. Make it completely work (for FTP too)
36 Chuck Murcko <chuck@topsail.org> 02-06-01
42 #include "apr_hooks.h"
45 #include "apr_strings.h"
46 #include "apr_buckets.h"
48 #include "apr_network_io.h"
49 #include "apr_pools.h"
50 #include "apr_strings.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 */
166 const char *p; /* The path */
167 int p_is_fnmatch; /* Is this path an fnmatch candidate? */
168 regex_t *r; /* Is this a regex? */
169 const char *ftp_directory_charset;
173 conn_rec *connection;
180 float cache_completion; /* completion percentage */
181 int content_length; /* length of the content */
187 /* Create a set of PROXY_DECLARE(type), PROXY_DECLARE_NONSTD(type) and
188 * PROXY_DECLARE_DATA with appropriate export and import tags for the platform
191 #define PROXY_DECLARE(type) type
192 #define PROXY_DECLARE_NONSTD(type) type
193 #define PROXY_DECLARE_DATA
194 #elif defined(PROXY_DECLARE_STATIC)
195 #define PROXY_DECLARE(type) type __stdcall
196 #define PROXY_DECLARE_NONSTD(type) type
197 #define PROXY_DECLARE_DATA
198 #elif defined(PROXY_DECLARE_EXPORT)
199 #define PROXY_DECLARE(type) __declspec(dllexport) type __stdcall
200 #define PROXY_DECLARE_NONSTD(type) __declspec(dllexport) type
201 #define PROXY_DECLARE_DATA __declspec(dllexport)
203 #define PROXY_DECLARE(type) __declspec(dllimport) type __stdcall
204 #define PROXY_DECLARE_NONSTD(type) __declspec(dllimport) type
205 #define PROXY_DECLARE_DATA __declspec(dllimport)
209 * Hook an optional proxy hook. Unlike static hooks, this uses a macro
210 * instead of a function.
212 #define PROXY_OPTIONAL_HOOK(name,fn,pre,succ,order) \
213 APR_OPTIONAL_HOOK(proxy,name,fn,pre,succ,order)
215 APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, scheme_handler, (request_rec *r,
216 proxy_server_conf *conf, char *url,
217 const char *proxyhost, apr_port_t proxyport))
218 APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, canon_handler, (request_rec *r,
221 APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, create_req, (request_rec *r, request_rec *pr))
222 APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, fixups, (request_rec *r))
226 PROXY_DECLARE(request_rec *)ap_proxy_make_fake_req(conn_rec *c, request_rec *r);
227 PROXY_DECLARE(int) ap_proxy_hex2c(const char *x);
228 PROXY_DECLARE(void) ap_proxy_c2hex(int ch, char *x);
229 PROXY_DECLARE(char *)ap_proxy_canonenc(apr_pool_t *p, const char *x, int len, enum enctype t,
231 PROXY_DECLARE(char *)ap_proxy_canon_netloc(apr_pool_t *p, char **const urlp, char **userp,
232 char **passwordp, char **hostp, apr_port_t *port);
233 PROXY_DECLARE(const char *)ap_proxy_date_canon(apr_pool_t *p, const char *x);
234 PROXY_DECLARE(apr_table_t *)ap_proxy_read_headers(request_rec *r, request_rec *rp, char *buffer, int size, conn_rec *c);
235 PROXY_DECLARE(int) ap_proxy_liststr(const char *list, const char *val);
236 PROXY_DECLARE(char *)ap_proxy_removestr(apr_pool_t *pool, const char *list, const char *val);
237 PROXY_DECLARE(int) ap_proxy_hex2sec(const char *x);
238 PROXY_DECLARE(void) ap_proxy_sec2hex(int t, char *y);
239 PROXY_DECLARE(int) ap_proxyerror(request_rec *r, int statuscode, const char *message);
240 PROXY_DECLARE(int) ap_proxy_is_ipaddr(struct dirconn_entry *This, apr_pool_t *p);
241 PROXY_DECLARE(int) ap_proxy_is_domainname(struct dirconn_entry *This, apr_pool_t *p);
242 PROXY_DECLARE(int) ap_proxy_is_hostname(struct dirconn_entry *This, apr_pool_t *p);
243 PROXY_DECLARE(int) ap_proxy_is_word(struct dirconn_entry *This, apr_pool_t *p);
244 PROXY_DECLARE(int) ap_proxy_checkproxyblock(request_rec *r, proxy_server_conf *conf, apr_sockaddr_t *uri_addr);
245 PROXY_DECLARE(int) ap_proxy_pre_http_request(conn_rec *c, request_rec *r);
246 PROXY_DECLARE(apr_status_t) ap_proxy_string_read(conn_rec *c, apr_bucket_brigade *bb, char *buff, size_t bufflen, int *eos);
247 PROXY_DECLARE(void) ap_proxy_table_unmerge(apr_pool_t *p, apr_table_t *t, char *key);
248 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 *);
249 PROXY_DECLARE(int) ap_proxy_ssl_enable(conn_rec *c);
250 PROXY_DECLARE(int) ap_proxy_ssl_disable(conn_rec *c);
253 extern module AP_MODULE_DECLARE_DATA proxy_module;
255 #endif /*MOD_PROXY_H*/