1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
|
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* @file configs.h
* @brief Plugin configuration (header file).
*/
#pragma once
#include "pattern.h"
#include "common.h"
#include <map>
enum CacheKeyUriType {
REMAP,
PRISTINE,
};
enum CacheKeyKeyType {
CACHE_KEY,
PARENT_SELECTION_URL,
};
const char *getCacheKeyUriTypeName(CacheKeyUriType type);
const char *getCacheKeyKeyTypeName(CacheKeyKeyType type);
typedef std::set<CacheKeyKeyType> CacheKeyKeyTypeSet;
/**
* @brief Plug-in configuration elements (query / headers / cookies).
*
* Query parameters, cookies and headers can be handle in a similar way, through a similar set of rules (methods and properties).
*/
class ConfigElements
{
public:
ConfigElements() {}
virtual ~ConfigElements();
void setExclude(const char *arg);
void setInclude(const char *arg);
void setExcludePatterns(const char *arg);
void setIncludePatterns(const char *arg);
void setRemove(const char *arg);
void setSort(const char *arg);
void addCapture(const char *arg);
const auto &
getCaptures() const
{
return _captures;
}
/** @brief shows if the elements are to be sorted in the result */
bool toBeSorted() const;
/** @brief shows if the elements are to be removed from the result */
bool toBeRemoved() const;
/** @brief shows if the processing of elements is to be skipped */
bool toBeSkipped() const;
/** @brief shows if the element is to be included in the result */
bool toBeAdded(const String &element) const;
/** @brief returns the configuration element name for debug logging */
virtual const String &name() const = 0;
/**
* @brief provides means for post-processing of the configuration after all of parameters are available.
* @return true if successful, false if failure.
*/
virtual bool finalize() = 0;
protected:
bool noIncludeExcludeRules() const;
bool setCapture(const String &name, const String &pattern);
StringSet _exclude;
StringSet _include;
MultiPattern _includePatterns;
MultiPattern _excludePatterns;
bool _sort = false;
bool _remove = false;
bool _skip = false;
std::map<String, MultiPattern *> _captures;
};
/**
* @brief Query configuration class.
*/
class ConfigQuery : public ConfigElements
{
public:
bool finalize() override;
private:
const String &name() const override;
static const String _NAME;
};
/**
* @brief Headers configuration class.
*/
class ConfigHeaders : public ConfigElements
{
public:
bool finalize() override;
const StringSet &getInclude() const;
private:
const String &name() const override;
static const String _NAME;
};
/**
* @brief Cookies configuration class.
*/
class ConfigCookies : public ConfigElements
{
public:
bool finalize() override;
private:
const String &name() const override;
static const String _NAME;
};
/**
* @brief Class holding all configurable rules on how the cache key need to be constructed.
*/
class Configs
{
public:
Configs() {}
/**
* @brief initializes plugin configuration.
* @param argc number of plugin parameters
* @param argv plugin parameters
* @param perRemapConfig boolean showing if this is per-remap config (vs global config).
*/
bool init(int argc, const char *argv[], bool perRemapConfig);
/**
* @brief provides means for post-processing of the plugin parameters to finalize the configuration or to "cache" some of the
* decisions for later use.
* @return true if successful, false if failure.
*/
bool finalize();
/**
* @brief Tells the caller if the prefix is to be removed (not processed at all).
*/
bool prefixToBeRemoved();
/**
* @brief Tells the caller if the path is to be removed (not processed at all).
*/
bool pathToBeRemoved();
/**
* @brief keep URI scheme and authority elements.
*/
bool canonicalPrefix();
/**
* @brief set the cache key elements separator string.
*/
void setSeparator(const char *arg);
/**
* @brief get the cache key elements separator string.
*/
const String &getSeparator();
/**
* @brief sets the URI Type.
*/
void setUriType(const char *arg);
/**
* @brief sets the target URI Type.
*/
void setKeyType(const char *arg);
/**
* @brief get URI type.
*/
CacheKeyUriType getUriType();
/**
* @brief get target URI type.
*/
CacheKeyKeyTypeSet &getKeyType();
/* Make the following members public to avoid unnecessary accessors */
ConfigQuery _query; /**< @brief query parameter related configuration */
ConfigHeaders _headers; /**< @brief headers related configuration */
ConfigCookies _cookies; /**< @brief cookies related configuration */
Pattern _uaCapture; /**< @brief the capture groups and the replacement string used for the User-Agent header capture */
String _prefix; /**< @brief cache key prefix string */
Pattern _prefixCapture; /**< @brief cache key prefix captured from the URI host:port */
Pattern _prefixCaptureUri; /**< @brief cache key prefix captured from the URI as a whole */
Pattern _pathCapture; /**< @brief cache key element captured from the URI path */
Pattern _pathCaptureUri; /**< @brief cache key element captured from the URI as a whole */
Classifier _classifier; /**< @brief denylist and allow-list classifier used to classify User-Agent header */
private:
/**
* @brief a helper function which loads the classifier from files.
* @param args classname + filename in '<classname>:<filename>' format.
* @param denylist true - load as a denylist classifier, false - allow-list.
* @return true if successful, false otherwise.
*/
bool loadClassifiers(const String &args, bool denylist = true);
bool _prefixToBeRemoved = false; /**< @brief instructs the prefix (i.e. host:port) not to added to the cache key */
bool _pathToBeRemoved = false; /**< @brief instructs the path not to added to the cache key */
bool _canonicalPrefix = false; /**< @brief keep the URI scheme and authority element used as input to transforming into key */
String _separator = "/"; /**< @brief a separator used to separate the cache key elements extracted from the URI */
CacheKeyUriType _uriType = REMAP; /**< @brief shows which URI the cache key will be based on */
CacheKeyKeyTypeSet _keyTypes; /**< @brief target URI to be modified, cache key or paren selection */
};
|