1 /** @file 2 3 A brief file description 4 5 @section license License 6 7 Licensed to the Apache Software Foundation (ASF) under one 8 or more contributor license agreements. See the NOTICE file 9 distributed with this work for additional information 10 regarding copyright ownership. The ASF licenses this file 11 to you under the Apache License, Version 2.0 (the 12 "License"); you may not use this file except in compliance 13 with the License. You may obtain a copy of the License at 14 15 http://www.apache.org/licenses/LICENSE-2.0 16 17 Unless required by applicable law or agreed to in writing, software 18 distributed under the License is distributed on an "AS IS" BASIS, 19 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 20 See the License for the specific language governing permissions and 21 limitations under the License. 22 23 */ 24 25 #pragma once 26 27 #include <vector> 28 29 #include "tscore/ink_config.h" 30 #include "AclFiltering.h" 31 #include "URL.h" 32 #include "RemapPluginInfo.h" 33 #include "PluginFactory.h" 34 #include "tscore/Regex.h" 35 #include "tscore/List.h" 36 37 class NextHopSelectionStrategy; 38 39 /** 40 * Used to store http referer strings (and/or regexp) 41 **/ 42 class referer_info 43 { 44 public: 45 referer_info(char *_ref, bool *error_flag = nullptr, char *errmsgbuf = nullptr, int errmsgbuf_size = 0); 46 ~referer_info(); 47 referer_info *next; 48 char *referer; 49 int referer_size; 50 bool any; /* any flag '*' */ 51 bool negative; /* negative referer '~' */ 52 bool regx_valid; 53 pcre *regx; 54 }; 55 56 /** 57 * 58 **/ 59 class redirect_tag_str 60 { 61 public: redirect_tag_str()62 redirect_tag_str() {} ~redirect_tag_str()63 ~redirect_tag_str() 64 { 65 type = 0; 66 if (chunk_str) { 67 ats_free(chunk_str); 68 chunk_str = nullptr; 69 } 70 } 71 72 redirect_tag_str *next = nullptr; 73 char *chunk_str = nullptr; 74 char type = 0; /* s - string, r - referer, t - url_to, f - url_from, o - origin url */ 75 static redirect_tag_str *parse_format_redirect_url(char *url); 76 }; 77 78 /** 79 * Used to store the mapping for class UrlRewrite 80 **/ 81 class url_mapping 82 { 83 public: 84 ~url_mapping(); 85 86 bool add_plugin_instance(RemapPluginInst *i); 87 RemapPluginInst *get_plugin_instance(std::size_t) const; 88 89 std::size_t plugin_instance_count()90 plugin_instance_count() const 91 { 92 return _plugin_inst_list.size(); 93 } 94 95 void Print() const; 96 97 int from_path_len = 0; 98 URL fromURL; 99 URL toURL; // Default TO-URL (from remap.config) 100 bool homePageRedirect = false; 101 bool unique = false; // INKqa11970 - unique mapping 102 bool default_redirect_url = false; 103 bool optional_referer = false; 104 bool negative_referer = false; 105 bool wildcard_from_scheme = false; // from url is '/foo', only http or https for now 106 char *tag = nullptr; // tag 107 char *filter_redirect_url = nullptr; // redirect url when referer filtering enabled 108 unsigned int map_id = 0; 109 referer_info *referer_list = nullptr; 110 redirect_tag_str *redir_chunk_list = nullptr; 111 bool ip_allow_check_enabled_p = false; 112 acl_filter_rule *filter = nullptr; // acl filtering (list of rules) 113 LINK(url_mapping, link); // For use with the main Queue linked list holding all the mapping 114 std::shared_ptr<NextHopSelectionStrategy> strategy = nullptr; 115 116 int getRank()117 getRank() const 118 { 119 return _rank; 120 }; 121 void setRank(int rank)122 setRank(int rank) 123 { 124 _rank = rank; 125 }; 126 127 private: 128 std::vector<RemapPluginInst *> _plugin_inst_list; 129 int _rank = 0; 130 }; 131 132 /** 133 * UrlMappingContainer wraps a url_mapping object and allows a caller to rewrite the target URL. 134 * This is used while evaluating remap rules. 135 **/ 136 class UrlMappingContainer 137 { 138 public: UrlMappingContainer()139 UrlMappingContainer() {} UrlMappingContainer(HdrHeap * heap)140 explicit UrlMappingContainer(HdrHeap *heap) : _heap(heap) {} ~UrlMappingContainer()141 ~UrlMappingContainer() { deleteToURL(); } 142 URL * getToURL()143 getToURL() const 144 { 145 return _toURLPtr; 146 }; 147 URL * getFromURL()148 getFromURL() const 149 { 150 return _mapping ? &(_mapping->fromURL) : nullptr; 151 }; 152 153 url_mapping * getMapping()154 getMapping() const 155 { 156 return _mapping; 157 }; 158 159 void set(url_mapping * m)160 set(url_mapping *m) 161 { 162 deleteToURL(); 163 _mapping = m; 164 _toURLPtr = m ? &(m->toURL) : nullptr; 165 } 166 167 void set(HdrHeap * heap)168 set(HdrHeap *heap) 169 { 170 _heap = heap; 171 } 172 173 URL * createNewToURL()174 createNewToURL() 175 { 176 ink_assert(_heap != nullptr); 177 deleteToURL(); 178 _toURL.create(_heap); 179 _toURLPtr = &_toURL; 180 return _toURLPtr; 181 } 182 183 void deleteToURL()184 deleteToURL() 185 { 186 if (_toURLPtr == &_toURL) { 187 _toURL.clear(); 188 } 189 } 190 191 void clear()192 clear() 193 { 194 deleteToURL(); 195 _mapping = nullptr; 196 _toURLPtr = nullptr; 197 _heap = nullptr; 198 } 199 200 // noncopyable, non-assignable 201 UrlMappingContainer(const UrlMappingContainer &orig) = delete; 202 UrlMappingContainer &operator=(const UrlMappingContainer &rhs) = delete; 203 204 private: 205 url_mapping *_mapping = nullptr; 206 URL *_toURLPtr = nullptr; 207 URL _toURL; 208 HdrHeap *_heap = nullptr; 209 }; 210