| .. 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. |
| |
| .. include:: ../../common.defs |
| |
| .. highlight:: cpp |
| .. default-domain:: cpp |
| |
| .. _cripts-matchers: |
| |
| Matchers |
| ******** |
| |
| Cripts supports most common comparisons, ``==``, ``!=``, etc. for many of the |
| strings and variables that it provides. However, this is sometimes not adequate |
| for all use cases, so Cripts provides a way to define custom matchers. There are |
| currently three types of matchers: |
| |
| =================================== ==================================================================== |
| Matcher Description |
| =================================== ==================================================================== |
| ``cripts::Matcher::Range`` Matching IP addresses against one or many IP ranges. |
| ``cripts::Matcher::PCRE`` Matching strings against one or many regular expressions. |
| ``cripts::Matcher::List::Method`` Match a request method against a list of methods. |
| =================================== ==================================================================== |
| |
| Often you will declare these ranges once, and then use them over and over again. For this purpose, |
| Cripts allows ranges to be declared ``static``, which means it can optimize the code around the matches. |
| |
| Here's an example using the regular expression matcher: |
| |
| .. code-block:: cpp |
| |
| do_remap() |
| { |
| static cripts::Matcher::PCRE pcre({"^/([^/]+)/(.*)$", "^(.*)$"}); // Nonsensical ... |
| |
| borrow url = cripts::Client::URL::Get(); |
| |
| if (pcre.Match(url.path)) { |
| // Do something with the match |
| } |
| } |
| |
| .. note:: |
| |
| For the IP-range and regular expression matcher, you can specify a single range or regular expression, |
| it does not have to be declared as a list with the ``{}`` syntax. For both, the single or list arguments |
| are strings within ``""``. |
| |
| .. _cripts-matchers-functions: |
| |
| Matcher Functions |
| ================= |
| |
| All matchers have the following functions: |
| |
| ============================ ==================================================================== |
| Function Description |
| ============================ ==================================================================== |
| ``Match()`` Match the given string against the matcher. |
| ``Contains()`` Another name for ``Match()`` |
| ``Add()`` Add another element to the matcher (can not be used with ``static``) |
| ============================ ==================================================================== |
| |
| .. _cripts-matchers-pcre: |
| |
| Matcher::PCRE |
| ============= |
| |
| The PCRE matcher is used to match strings against one or many regular expressions. When a match |
| is found, a ``cripts::Matcher::PCRE::Result`` object is returned. This object has the following functions |
| to deal with the matched results and the capture groups: |
| |
| ============================ ==================================================================== |
| Function Description |
| ============================ ==================================================================== |
| ``Matched()`` A boolean indicating if a regex was matched. |
| ``Count()`` Returns the number of regex capture groups that are matched. |
| ``MatchIX()`` Returns the index of the matched regex capture group. |
| [] Index Retrieves the matched string for the given capture group index. |
| ============================ ==================================================================== |
| |
| Lets show an example: |
| |
| .. code-block:: cpp |
| |
| do_remap() |
| { |
| static cripts::Matcher::PCRE allow({"^([a-c][^/]*)/?(.*)", "^([g-h][^/]*)/?(.*)"}); |
| |
| borrow url = cripts::Client::URL::Get(); |
| |
| auto res = allow.Match(url.path); |
| |
| if (res.Matched()) { |
| CDebug("Matched: {}", res[1]); |
| CDebug("Matched: {}", res[2]); |
| // Now do something with these URLs matching these paths |
| } |
| } |