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