blob: 684695aa39e6c26555c5a7a5fbf8ad69c8011633 [file]
.. 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.
.. default-domain:: cpp
TSConnectionLimitExemptList
===========================
Synopsis
--------
.. code-block:: cpp
#include <ts/ts.h>
.. function:: TSReturnCode TSConnectionLimitExemptListAdd(std::string_view ip_ranges)
.. function:: TSReturnCode TSConnectionLimitExemptListRemove(std::string_view ip_ranges)
.. function:: void TSConnectionLimitExemptListClear()
Description
-----------
These functions manage the per-client connection limit exempt list, which contains IP addresses
and ranges that are exempt from the connection limits enforced by
:ts:cv:`proxy.config.net.per_client.max_connections_in`.
:func:`TSConnectionLimitExemptListAdd` adds one or more IP addresses or CIDR ranges specified in
:arg:`ip_ranges` to the existing exempt list. The :arg:`ip_ranges` parameter can be a single
IP address or CIDR range, or a comma-separated string of multiple ranges (e.g.,
"192.168.1.10,10.0.0.0/8,172.16.0.0/12"). The ranges are added without removing any existing
entries. Returns :enumerator:`TS_SUCCESS` if all ranges were successfully added, :enumerator:`TS_ERROR` if
any of the IP ranges are invalid or if the operation fails.
:func:`TSConnectionLimitExemptListRemove` removes one or more IP addresses or CIDR ranges specified in
:arg:`ip_ranges` from the existing exempt list. The :arg:`ip_ranges` parameter can be a single
IP address or CIDR range, or a comma-separated string of multiple ranges. If a range is not present
in the list, it is silently ignored. Returns :enumerator:`TS_SUCCESS` if all ranges were successfully
processed, :enumerator:`TS_ERROR` if any of the IP ranges are invalid or if the operation fails.
:func:`TSConnectionLimitExemptListClear` removes all entries from the per-client connection
limit exempt list. After calling this function, all clients will be subject to connection
limits. This function does not return a value and never fails.
All functions are thread-safe and can be called from any plugin context. Changes made through
these functions will override any configuration set via
:ts:cv:`proxy.config.http.per_client.connection.exempt_list`.
Return Values
-------------
:func:`TSConnectionLimitExemptListAdd` and :func:`TSConnectionLimitExemptListRemove` return
:enumerator:`TS_SUCCESS` if the operation completed successfully, or :enumerator:`TS_ERROR` if the
operation failed due to invalid input or system errors.
Examples
--------
.. code-block:: cpp
#include <ts/ts.h>
#include <fstream>
#include <string>
void load_exempt_list_from_file(const char *filename) {
std::ifstream file(filename);
if (!file.is_open()) {
TSError("Failed to open exempt list file: %s", filename);
return;
}
// Clear existing exempt list before loading from file
TSConnectionLimitExemptListClear();
std::string line;
int line_num = 0;
while (std::getline(file, line)) {
line_num++;
// Skip empty lines and comments
if (line.empty() || line[0] == '#') {
continue;
}
// Add each IP range to the exempt list
TSReturnCode result = TSConnectionLimitExemptListAdd(line.c_str());
if (result != TS_SUCCESS) {
TSError("Failed to add IP range '%s' from line %d in %s", line.c_str(), line_num, filename);
} else {
TSDebug("exempt_list", "Added IP range: %s", line.c_str());
}
}
file.close();
}
void TSPluginInit(int argc, const char *argv[]) {
const char *exempt_file = "exempt_ips.txt";
// Check if custom file specified in plugin arguments
if (argc > 1) {
exempt_file = argv[1];
}
// Load exempt list from file
load_exempt_list_from_file(exempt_file);
}
See Also
--------
:ts:cv:`proxy.config.net.per_client.max_connections_in`,
:ts:cv:`proxy.config.http.per_client.connection.exempt_list`