.. 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-variables: Variables ********* Cripts supports a wide variety of variable types, and they can be used in many places. In many cases, the variable types are automatically converted to the correct type, but in some cases you may need to explicitly declare the variable. Most commonly you will declare a variable using either ``auto`` or ``borrow``. The latter is used when working with a complex object, like a URL or a header, that is managed by ATS itself. For ``auto`` variables, these are the most common types: =================== ================================================================================== Type Description =================== ================================================================================== ``integer`` A 64-bit signed integer. ``float`` A 64-bit floating point number. ``boolean`` A boolean value. ``string`` A string. ``string_view`` A string view. =================== ================================================================================== Of these, ``string_view`` is perhaps the least familiar type, but it is the most commonly used type of strings within ATS itself. As such, they are incredibly efficient to use. Again, most of the time just declare your variables as ``auto`` and let the compiler figure out the type. .. _cripts-variables-strings: Strings ======= String and ``string_views`` are probably the types you will work with most. These types have a number of methods that can be used to manipulate the string. Strings here are secretly wrapped in standard C++ strings, and have all the methods that come with them. As an example, to get the length of a string, you can use the ``size()`` method: .. code-block:: cpp borrow req = cripts::Client::Request::Get(); if (req["Host"].size() > 3) { // Do something } Here's a list of methods available on strings: =================== ============================================================================= Method Description =================== ============================================================================= ``clear()`` Clear (empty) the string. ``empty()`` Check if the string is empty or not, returns ``true`` or ``false``. ``size()`` Return the length of the string. Also available as ``length()``. ``starts_with()`` Check if the string starts with a given string. ``ends_with()`` Check if the string ends with a given string. ``find()`` Find a string within the string. ``rfind()`` Find a string within the string, starting from the end. ``contains()`` Check if the string contains a given string. ``substr()`` Get a substring of the string, arguments are ``start`` and ``end`` position. ``split()`` Split the string into a list of strings, using a delimiter. Returns a list. ``trim()`` Trim whitespace from the string. ``ltrim()`` Trim whitespace from the left of the string. ``rtrim()`` Trim whitespace from the right of the string. ``remove_prefix()`` Remove a prefix string from the string. This does not return a new string. ``remove_suffix()`` Remove a suffix string from the string. This does not return a new string. ``toFloat()`` Convert the string to a float. ``toBool()`` Convert the string to a boolean. ``toInteger()`` Convert the string to an integer. ``toFloat()`` Convert the string to a float. =================== ============================================================================= In addition to this, there's a number of *matching* features in Cripts, which can be used together with strings. These are covered in more detail in the :ref:`cripts-matchers` section. Of course, regular comparisons such as ``==`` and ``!=`` are also available. .. note:: The ``find()`` and ``rfind()`` methods return the position of the string within the string, or ``cripts::string_view::npos`` if the string is not found. .. _cripts-variables-configuration: Configuration Variable ====================== ATS has a flexible set of configurations, many of which can be accessed and modified using Cripts. These configurations are, in ATS terms, what's called overridable. They all have a default value, that is set globally via :file:`records.yaml`, but they are also overridable per transaction. Cript exposes this via the global ``proxy`` object, which is a map of all the configurations. Best way to understand this is to look at an example: .. code-block:: cpp auto cache_on = proxy.config.http.cache.http.Get(); if (cache_on > 0) { proxy.config.http.ignore_server_no_cache.Set(1); } This is a pretty artificial example, but shows the name space of these configurations, and how they match the documented ATS configuration names. The configurations can also be access via a more advanced API, typically used for embedding existing control planes with Cripts. This is done using the ``Records`` object, for example: .. code-block:: cpp do_remap() { auto http_cache = cripts::cripts::Records("proxy.config.http.cache.http"); if (AsInteger(http_cache.Get()) > 0) { CDebug("HTTP Cache is on"); } } .. _cripts-variables-control: Control Variable ================ ATS plugins (and Cripts) have access to a number of control functions that can be used to control some behavior of ATS. This is exposed via the global ``control`` object. This object has a number of variables that can be used to control the behavior of ATS. ============================ ==================================================================== Variable Description ============================ ==================================================================== ``control.cache.request`` Control the cache behavior for the request. ``control.cache.response`` Control the cache behavior for the response. ``control.cache.nostore`` Control the cache behavior for the no-store. ``control.logging`` Turn logging on or off. ``control.intercept`` Turn incepts on or off. ``control.debug`` Enable debugging (rarely used) ``control.remap`` Indicate whether remap matching is required or not. ============================ ==================================================================== All of these are controlled via a boolean value, and can be set to either ``true`` or ``false``, using the same ``Get()`` and ``Set()`` as for configuration variables. As an example, lets randomly turn off logging for some percentage of requests: .. code-block:: cpp do_remap() { if (cripts::random(1000) > 99) { control.logging.Set(false); // 10% log sampling } } .. _cripts-misc-versions: Versions ======== Cripts provides a way to get the version of ATS and Cripts at runtime. The following global variables are available: ============================ ==================================================================== Variable Description ============================ ==================================================================== versions.major The major version of ATS. versions.minor The minor version of ATS. versions.patch The patch version of ATS. ============================ ==================================================================== .. _cripts-variables-other: Other Variables =============== There are a number of other variables that are available in Cripts. They are generally closely tied to another object, and are therefore documented in various chapters within here. However, here's a quick list of some of the more common ones: - :ref:`cripts-connections-variables` - :ref:`cripts-connections-tcpinfo-variables`