00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _URL_REWRITE_H_
00025 #define _URL_REWRITE_H_
00026
00027 #include "UrlMapping.h"
00028 #include "HttpTransact.h"
00029
00030 #ifdef HAVE_PCRE_PCRE_H
00031 #include <pcre/pcre.h>
00032 #else
00033 #include <pcre.h>
00034 #endif
00035
00036 #define URL_REMAP_FILTER_NONE 0x00000000
00037 #define URL_REMAP_FILTER_REFERER 0x00000001
00038 #define URL_REMAP_FILTER_REDIRECT_FMT 0x00010000
00039
00040 struct BUILD_TABLE_INFO ;
00041
00042
00043
00044
00045 enum mapping_type
00046 { FORWARD_MAP, REVERSE_MAP, PERMANENT_REDIRECT, TEMPORARY_REDIRECT, FORWARD_MAP_REFERER,
00047 FORWARD_MAP_WITH_RECV_PORT, NONE };
00048
00049
00050
00051
00052 class UrlRewrite
00053 {
00054 public:
00055 UrlRewrite();
00056 ~UrlRewrite();
00057
00058 int BuildTable(const char * path);
00059 mapping_type Remap_redirect(HTTPHdr * request_header, URL *redirect_url);
00060 bool ReverseMap(HTTPHdr *response_header);
00061 void SetReverseFlag(int flag);
00062 void Print();
00063 bool is_valid() const { return _valid; };
00064
00065
00066 static const int MAX_REGEX_SUBS = 10;
00067
00068 struct RegexMapping
00069 {
00070 url_mapping *url_map;
00071 pcre *re;
00072 pcre_extra *re_extra;
00073
00074
00075
00076
00077 char *to_url_host_template;
00078 int to_url_host_template_len;
00079
00080
00081 int n_substitutions;
00082
00083
00084
00085
00086 int substitution_markers[MAX_REGEX_SUBS];
00087 int substitution_ids[MAX_REGEX_SUBS];
00088
00089 LINK(RegexMapping, link);
00090 };
00091
00092 typedef Queue<RegexMapping> RegexMappingList;
00093
00094 struct MappingsStore
00095 {
00096 InkHashTable *hash_lookup;
00097 RegexMappingList regex_list;
00098 bool empty() { return ((hash_lookup == NULL) && regex_list.empty()); }
00099 };
00100
00101 void PerformACLFiltering(HttpTransact::State * s, url_mapping * mapping);
00102 url_mapping *SetupPacMapping();
00103 url_mapping *SetupBackdoorMapping();
00104 void PrintStore(MappingsStore &store);
00105
00106 void DestroyStore(MappingsStore &store)
00107 {
00108 _destroyTable(store.hash_lookup);
00109 _destroyList(store.regex_list);
00110 }
00111
00112 bool InsertForwardMapping(mapping_type maptype, url_mapping * mapping, const char * src_host);
00113 bool InsertMapping(mapping_type maptype, url_mapping *new_mapping, RegexMapping *reg_map,
00114 const char * src_host, bool is_cur_mapping_regex);
00115
00116 bool TableInsert(InkHashTable *h_table, url_mapping *mapping, const char *src_host);
00117
00118 MappingsStore forward_mappings;
00119 MappingsStore reverse_mappings;
00120 MappingsStore permanent_redirects;
00121 MappingsStore temporary_redirects;
00122 MappingsStore forward_mappings_with_recv_port;
00123
00124 bool forwardMappingLookup(URL *request_url, int request_port, const char *request_host,
00125 int request_host_len, UrlMappingContainer &mapping_container)
00126 {
00127 return _mappingLookup(forward_mappings, request_url, request_port, request_host, request_host_len,
00128 mapping_container);
00129 }
00130 bool reverseMappingLookup(URL *request_url, int request_port, const char *request_host,
00131 int request_host_len, UrlMappingContainer &mapping_container)
00132 {
00133 return _mappingLookup(reverse_mappings, request_url, request_port, request_host, request_host_len,
00134 mapping_container);
00135 }
00136 bool permanentRedirectLookup(URL *request_url, int request_port, const char *request_host,
00137 int request_host_len, UrlMappingContainer &mapping_container)
00138 {
00139 return _mappingLookup(permanent_redirects, request_url, request_port, request_host, request_host_len,
00140 mapping_container);
00141 }
00142 bool temporaryRedirectLookup(URL *request_url, int request_port, const char *request_host,
00143 int request_host_len, UrlMappingContainer &mapping_container)
00144 {
00145 return _mappingLookup(temporary_redirects, request_url, request_port, request_host, request_host_len,
00146 mapping_container);
00147 }
00148 bool forwardMappingWithRecvPortLookup(URL *request_url, int recv_port, const char *request_host,
00149 int request_host_len, UrlMappingContainer &mapping_container)
00150 {
00151 return _mappingLookup(forward_mappings_with_recv_port, request_url, recv_port, request_host,
00152 request_host_len, mapping_container);
00153 }
00154
00155 int nohost_rules;
00156 int reverse_proxy;
00157 int backdoor_enabled;
00158
00159
00160 int mgmt_autoconf_port;
00161 int default_to_pac;
00162 int default_to_pac_port;
00163
00164 char *ts_name;
00165
00166 char *http_default_redirect_url;
00167 int num_rules_forward;
00168 int num_rules_reverse;
00169 int num_rules_redirect_permanent;
00170 int num_rules_redirect_temporary;
00171 int num_rules_forward_with_recv_port;
00172
00173 private:
00174 bool _valid;
00175
00176 bool _mappingLookup(MappingsStore &mappings, URL *request_url, int request_port, const char *request_host,
00177 int request_host_len, UrlMappingContainer &mapping_container);
00178 url_mapping *_tableLookup(InkHashTable * h_table, URL * request_url, int request_port, char *request_host,
00179 int request_host_len);
00180 bool _regexMappingLookup(RegexMappingList ®ex_mappings, URL * request_url, int request_port, const char *request_host,
00181 int request_host_len, int rank_ceiling,
00182 UrlMappingContainer &mapping_container);
00183 int _expandSubstitutions(int *matches_info, const RegexMapping *reg_map, const char *matched_string, char *dest_buf,
00184 int dest_buf_size);
00185 void _destroyTable(InkHashTable *h_table);
00186 void _destroyList(RegexMappingList ®exes);
00187 inline bool _addToStore(MappingsStore &store, url_mapping *new_mapping, RegexMapping *reg_map, const char *src_host,
00188 bool is_cur_mapping_regex, int &count);
00189 };
00190
00191 void url_rewrite_remap_request(const UrlMappingContainer& mapping_container, URL * request_url);
00192
00193 #endif