blob: 52440b40b19642f64f42dda20b74446facd8b308 [file] [log] [blame]
/** @file
Definitions via the X Macro pattern for overridable configuration variables.
@section license License
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.
*/
/**
@section overview Overview
This file provides a single source of truth for all overridable configuration
variables using the X-macro pattern. By defining configs here once, we
auto-generate code in multiple locations:
- Lua plugin enum and variable array (ts_lua_http_config.cc)
- String-to-enum mapping (overridable_txn_vars.cc)
- The _conf_to_memberp switch statement (InkAPI.cc)
- SDK_Overridable_Configs test array (InkAPITest.cc)
@section xmacro_format X-Macro Format
Each entry in OVERRIDABLE_CONFIGS has 5 parameters:
X(CONFIG_KEY, MEMBER, RECORD_NAME, DATA_TYPE, CONV)
- CONFIG_KEY: Enum suffix, becomes TS_CONFIG_<CONFIG_KEY> in the public API.
- MEMBER: The struct member name in OverridableHttpConfigParams.
- RECORD_NAME: The proxy.config.* record name string (or a variable for
dynamic names like ConnectionTracker::CONFIG_SERVER_VAR_MIN).
- DATA_TYPE: One of INT, FLOAT, or STRING. Used for type validation.
- CONV: Converter specification (see below).
@section converters Converter Types (CONV parameter)
The CONV parameter controls how values are converted between the API and
internal storage. There are three categories:
1. GENERIC - Use _memberp_to_generic() which auto-selects the appropriate
converter based on the member's C++ type (MgmtByte, MgmtInt, MgmtFloat,
std::string_view, etc.). This is the most common case.
2. NONE - No conversion; the config is handled specially elsewhere (e.g.,
SSL string configs are processed directly in TSHttpTxnConfigStringSet).
The MEMBER field is ignored but must be provided.
3. Custom converter name - For configs needing special conversion logic.
The name must match a _CONF_CASE_<name> macro defined in InkAPI.cc.
Examples: HttpDownServerCacheTimeConv, HttpStatusCodeList_Conv,
ConnectionTracker_MIN_SERVER_CONV, HttpTransact_HOST_RES_CONV.
See the X-Macro Dispatch doxygen documentation in InkAPI.cc for more
details.
@section adding_new_config Adding a New Overridable Config
To make a configuration variable overridable:
1. Add the config member to OverridableHttpConfigParams in HttpConfig.h.
(Move it from HttpConfigParams if it already exists as non-overridable.)
2. Add an entry to OVERRIDABLE_CONFIGS below. Place it at the END of the
list to match the enum order requirement.
3. Add the enum value to TSOverridableConfigKey in apidefs.h.in.
It MUST be added at the end, just before TS_CONFIG_LAST_ENTRY, to
preserve ABI compatibility.
IMPORTANT: The X-macro order MUST match the enum order exactly.
overridable_txn_vars.cc has compile-time validation that will fail
if they don't match.
4. Update documentation in doc/developer-guide/api/.
@section adding_custom_converter Adding a Custom Converter
See the X-Macro Dispatch doxygen documentation in InkAPI.cc for more details.
@section caching Automatic Caching for STRING Configs
Some STRING configs require parsing that is more expensive than a simple
string copy (e.g., parsing status code lists or host resolution preferences).
For these configs, TSHttpTxnConfigStringSet() automatically uses
ParsedConfigCache (defined in HttpConfig.h) to cache parsed results.
This means the parsing only happens once per unique (config_key, value) pair.
Subsequent calls with the same value use the cached result directly.
HTTP_NEGATIVE_CACHING_LIST is an example configuration that takes advantage
of this. This optimization is transparent to API users - they just call
TSHttpTxnConfigStringSet() as usual and get the performance benefit
automatically.
@section none_configs Note on CONV=NONE
Some SSL string configs use NONE because they bypass _conf_to_memberp()
entirely and are handled directly in TSHttpTxnConfigStringSet(). For these
entries, the MEMBER field is ignored but must still be provided to satisfy
the macro format (typically using a placeholder member name).
*/
#pragma once
// clang-format off
#define OVERRIDABLE_CONFIGS(X) \
X(URL_REMAP_PRISTINE_HOST_HDR, maintain_pristine_host_hdr, "proxy.config.url_remap.pristine_host_hdr", INT, GENERIC) \
X(HTTP_CHUNKING_ENABLED, chunking_enabled, "proxy.config.http.chunking_enabled", INT, GENERIC) \
X(HTTP_NEGATIVE_CACHING_ENABLED, negative_caching_enabled, "proxy.config.http.negative_caching_enabled", INT, GENERIC) \
X(HTTP_NEGATIVE_CACHING_LIFETIME, negative_caching_lifetime, "proxy.config.http.negative_caching_lifetime", INT, GENERIC) \
X(HTTP_CACHE_WHEN_TO_REVALIDATE, cache_when_to_revalidate, "proxy.config.http.cache.when_to_revalidate", INT, GENERIC) \
X(HTTP_KEEP_ALIVE_ENABLED_IN, keep_alive_enabled_in, "proxy.config.http.keep_alive_enabled_in", INT, GENERIC) \
X(HTTP_KEEP_ALIVE_ENABLED_OUT, keep_alive_enabled_out, "proxy.config.http.keep_alive_enabled_out", INT, GENERIC) \
X(HTTP_KEEP_ALIVE_POST_OUT, keep_alive_post_out, "proxy.config.http.keep_alive_post_out", INT, GENERIC) \
X(HTTP_SERVER_SESSION_SHARING_MATCH, server_session_sharing_match, "proxy.config.http.server_session_sharing.match", STRING, GENERIC) \
X(NET_SOCK_RECV_BUFFER_SIZE_OUT, sock_recv_buffer_size_out, "proxy.config.net.sock_recv_buffer_size_out", INT, GENERIC) \
X(NET_SOCK_SEND_BUFFER_SIZE_OUT, sock_send_buffer_size_out, "proxy.config.net.sock_send_buffer_size_out", INT, GENERIC) \
X(NET_SOCK_OPTION_FLAG_OUT, sock_option_flag_out, "proxy.config.net.sock_option_flag_out", INT, GENERIC) \
X(HTTP_FORWARD_PROXY_AUTH_TO_PARENT, fwd_proxy_auth_to_parent, "proxy.config.http.forward.proxy_auth_to_parent", INT, GENERIC) \
X(HTTP_ANONYMIZE_REMOVE_FROM, anonymize_remove_from, "proxy.config.http.anonymize_remove_from", INT, GENERIC) \
X(HTTP_ANONYMIZE_REMOVE_REFERER, anonymize_remove_referer, "proxy.config.http.anonymize_remove_referer", INT, GENERIC) \
X(HTTP_ANONYMIZE_REMOVE_USER_AGENT, anonymize_remove_user_agent, "proxy.config.http.anonymize_remove_user_agent", INT, GENERIC) \
X(HTTP_ANONYMIZE_REMOVE_COOKIE, anonymize_remove_cookie, "proxy.config.http.anonymize_remove_cookie", INT, GENERIC) \
X(HTTP_ANONYMIZE_REMOVE_CLIENT_IP, anonymize_remove_client_ip, "proxy.config.http.anonymize_remove_client_ip", INT, GENERIC) \
X(HTTP_ANONYMIZE_INSERT_CLIENT_IP, anonymize_insert_client_ip, "proxy.config.http.insert_client_ip", INT, GENERIC) \
X(HTTP_RESPONSE_SERVER_ENABLED, proxy_response_server_enabled, "proxy.config.http.response_server_enabled", INT, GENERIC) \
X(HTTP_INSERT_SQUID_X_FORWARDED_FOR, insert_squid_x_forwarded_for, "proxy.config.http.insert_squid_x_forwarded_for", INT, GENERIC) \
X(HTTP_SEND_HTTP11_REQUESTS, send_http11_requests, "proxy.config.http.send_http11_requests", INT, GENERIC) \
X(HTTP_CACHE_HTTP, cache_http, "proxy.config.http.cache.http", INT, GENERIC) \
X(HTTP_CACHE_IGNORE_CLIENT_NO_CACHE, cache_ignore_client_no_cache, "proxy.config.http.cache.ignore_client_no_cache", INT, GENERIC) \
X(HTTP_CACHE_IGNORE_CLIENT_CC_MAX_AGE, cache_ignore_client_cc_max_age, "proxy.config.http.cache.ignore_client_cc_max_age", INT, GENERIC) \
X(HTTP_CACHE_IMS_ON_CLIENT_NO_CACHE, cache_ims_on_client_no_cache, "proxy.config.http.cache.ims_on_client_no_cache", INT, GENERIC) \
X(HTTP_CACHE_IGNORE_SERVER_NO_CACHE, cache_ignore_server_no_cache, "proxy.config.http.cache.ignore_server_no_cache", INT, GENERIC) \
X(HTTP_CACHE_CACHE_RESPONSES_TO_COOKIES, cache_responses_to_cookies, "proxy.config.http.cache.cache_responses_to_cookies", INT, GENERIC) \
X(HTTP_CACHE_IGNORE_AUTHENTICATION, cache_ignore_auth, "proxy.config.http.cache.ignore_authentication", INT, GENERIC) \
X(HTTP_CACHE_CACHE_URLS_THAT_LOOK_DYNAMIC, cache_urls_that_look_dynamic, "proxy.config.http.cache.cache_urls_that_look_dynamic", INT, GENERIC) \
X(HTTP_CACHE_REQUIRED_HEADERS, cache_required_headers, "proxy.config.http.cache.required_headers", INT, GENERIC) \
X(HTTP_INSERT_REQUEST_VIA_STR, insert_request_via_string, "proxy.config.http.insert_request_via_str", INT, GENERIC) \
X(HTTP_INSERT_RESPONSE_VIA_STR, insert_response_via_string, "proxy.config.http.insert_response_via_str", INT, GENERIC) \
X(HTTP_CACHE_HEURISTIC_MIN_LIFETIME, cache_heuristic_min_lifetime, "proxy.config.http.cache.heuristic_min_lifetime", INT, GENERIC) \
X(HTTP_CACHE_HEURISTIC_MAX_LIFETIME, cache_heuristic_max_lifetime, "proxy.config.http.cache.heuristic_max_lifetime", INT, GENERIC) \
X(HTTP_CACHE_GUARANTEED_MIN_LIFETIME, cache_guaranteed_min_lifetime, "proxy.config.http.cache.guaranteed_min_lifetime", INT, GENERIC) \
X(HTTP_CACHE_GUARANTEED_MAX_LIFETIME, cache_guaranteed_max_lifetime, "proxy.config.http.cache.guaranteed_max_lifetime", INT, GENERIC) \
X(HTTP_CACHE_MAX_STALE_AGE, cache_max_stale_age, "proxy.config.http.cache.max_stale_age", INT, GENERIC) \
X(HTTP_KEEP_ALIVE_NO_ACTIVITY_TIMEOUT_IN, keep_alive_no_activity_timeout_in, "proxy.config.http.keep_alive_no_activity_timeout_in", INT, GENERIC) \
X(HTTP_KEEP_ALIVE_NO_ACTIVITY_TIMEOUT_OUT, keep_alive_no_activity_timeout_out, "proxy.config.http.keep_alive_no_activity_timeout_out", INT, GENERIC) \
X(HTTP_TRANSACTION_NO_ACTIVITY_TIMEOUT_IN, transaction_no_activity_timeout_in, "proxy.config.http.transaction_no_activity_timeout_in", INT, GENERIC) \
X(HTTP_TRANSACTION_NO_ACTIVITY_TIMEOUT_OUT, transaction_no_activity_timeout_out, "proxy.config.http.transaction_no_activity_timeout_out", INT, GENERIC) \
X(HTTP_TRANSACTION_ACTIVE_TIMEOUT_OUT, transaction_active_timeout_out, "proxy.config.http.transaction_active_timeout_out", INT, GENERIC) \
X(HTTP_CONNECT_ATTEMPTS_MAX_RETRIES, connect_attempts_max_retries, "proxy.config.http.connect_attempts_max_retries", INT, GENERIC) \
X(HTTP_CONNECT_ATTEMPTS_MAX_RETRIES_DOWN_SERVER, connect_attempts_max_retries_down_server, "proxy.config.http.connect_attempts_max_retries_down_server", INT, GENERIC) \
X(HTTP_CONNECT_ATTEMPTS_RR_RETRIES, connect_attempts_rr_retries, "proxy.config.http.connect_attempts_rr_retries", INT, GENERIC) \
X(HTTP_CONNECT_ATTEMPTS_TIMEOUT, connect_attempts_timeout, "proxy.config.http.connect_attempts_timeout", INT, GENERIC) \
X(HTTP_DOWN_SERVER_CACHE_TIME, down_server_timeout, "proxy.config.http.down_server.cache_time", INT, HttpDownServerCacheTimeConv) \
X(HTTP_DOC_IN_CACHE_SKIP_DNS, doc_in_cache_skip_dns, "proxy.config.http.doc_in_cache_skip_dns", INT, GENERIC) \
X(HTTP_BACKGROUND_FILL_ACTIVE_TIMEOUT, background_fill_active_timeout, "proxy.config.http.background_fill_active_timeout", INT, GENERIC) \
X(HTTP_RESPONSE_SERVER_STR, proxy_response_server_string, "proxy.config.http.response_server_str", STRING, GENERIC) \
X(HTTP_CACHE_HEURISTIC_LM_FACTOR, cache_heuristic_lm_factor, "proxy.config.http.cache.heuristic_lm_factor", FLOAT, GENERIC) \
X(HTTP_BACKGROUND_FILL_COMPLETED_THRESHOLD, background_fill_threshold, "proxy.config.http.background_fill_completed_threshold", FLOAT, GENERIC) \
X(NET_SOCK_PACKET_MARK_OUT, sock_packet_mark_out, "proxy.config.net.sock_packet_mark_out", INT, GENERIC) \
X(NET_SOCK_PACKET_TOS_OUT, sock_packet_tos_out, "proxy.config.net.sock_packet_tos_out", INT, GENERIC) \
X(HTTP_INSERT_AGE_IN_RESPONSE, insert_age_in_response, "proxy.config.http.insert_age_in_response", INT, GENERIC) \
X(HTTP_CHUNKING_SIZE, http_chunking_size, "proxy.config.http.chunking.size", INT, GENERIC) \
X(HTTP_FLOW_CONTROL_ENABLED, flow_control_enabled, "proxy.config.http.flow_control.enabled", INT, GENERIC) \
X(HTTP_FLOW_CONTROL_LOW_WATER_MARK, flow_low_water_mark, "proxy.config.http.flow_control.low_water", INT, GENERIC) \
X(HTTP_FLOW_CONTROL_HIGH_WATER_MARK, flow_high_water_mark, "proxy.config.http.flow_control.high_water", INT, GENERIC) \
X(HTTP_CACHE_RANGE_LOOKUP, cache_range_lookup, "proxy.config.http.cache.range.lookup", INT, GENERIC) \
X(HTTP_DEFAULT_BUFFER_SIZE, default_buffer_size_index, "proxy.config.http.default_buffer_size", INT, GENERIC) \
X(HTTP_DEFAULT_BUFFER_WATER_MARK, default_buffer_water_mark, "proxy.config.http.default_buffer_water_mark", INT, GENERIC) \
X(HTTP_REQUEST_HEADER_MAX_SIZE, request_hdr_max_size, "proxy.config.http.request_header_max_size", INT, GENERIC) \
X(HTTP_RESPONSE_HEADER_MAX_SIZE, response_hdr_max_size, "proxy.config.http.response_header_max_size", INT, GENERIC) \
X(HTTP_NEGATIVE_REVALIDATING_ENABLED, negative_revalidating_enabled, "proxy.config.http.negative_revalidating_enabled", INT, GENERIC) \
X(HTTP_NEGATIVE_REVALIDATING_LIFETIME, negative_revalidating_lifetime, "proxy.config.http.negative_revalidating_lifetime", INT, GENERIC) \
X(SSL_HSTS_MAX_AGE, proxy_response_hsts_max_age, "proxy.config.ssl.hsts_max_age", INT, GENERIC) \
X(SSL_HSTS_INCLUDE_SUBDOMAINS, proxy_response_hsts_include_subdomains, "proxy.config.ssl.hsts_include_subdomains", INT, GENERIC) \
X(HTTP_CACHE_OPEN_READ_RETRY_TIME, cache_open_read_retry_time, "proxy.config.http.cache.open_read_retry_time", INT, GENERIC) \
X(HTTP_CACHE_MAX_OPEN_READ_RETRIES, max_cache_open_read_retries, "proxy.config.http.cache.max_open_read_retries", INT, GENERIC) \
X(HTTP_CACHE_RANGE_WRITE, cache_range_write, "proxy.config.http.cache.range.write", INT, GENERIC) \
X(HTTP_POST_CHECK_CONTENT_LENGTH_ENABLED, post_check_content_length_enabled, "proxy.config.http.post.check.content_length.enabled", INT, GENERIC) \
X(HTTP_GLOBAL_USER_AGENT_HEADER, global_user_agent_header, "proxy.config.http.global_user_agent_header", STRING, GENERIC) \
X(HTTP_AUTH_SERVER_SESSION_PRIVATE, auth_server_session_private, "proxy.config.http.auth_server_session_private", INT, GENERIC) \
X(HTTP_SLOW_LOG_THRESHOLD, slow_log_threshold, "proxy.config.http.slow.log.threshold", INT, GENERIC) \
X(HTTP_CACHE_GENERATION, cache_generation_number, "proxy.config.http.cache.generation", INT, GENERIC) \
X(BODY_FACTORY_TEMPLATE_BASE, body_factory_template_base, "proxy.config.body_factory.template_base", STRING, GENERIC) \
X(HTTP_CACHE_OPEN_WRITE_FAIL_ACTION, cache_open_write_fail_action, "proxy.config.http.cache.open_write_fail_action", INT, GENERIC) \
X(HTTP_NUMBER_OF_REDIRECTIONS, number_of_redirections, "proxy.config.http.number_of_redirections", INT, GENERIC) \
X(HTTP_CACHE_MAX_OPEN_WRITE_RETRIES, max_cache_open_write_retries, "proxy.config.http.cache.max_open_write_retries", INT, GENERIC) \
X(HTTP_CACHE_MAX_OPEN_WRITE_RETRY_TIMEOUT, max_cache_open_write_retry_timeout, "proxy.config.http.cache.max_open_write_retry_timeout", INT, GENERIC) \
X(HTTP_REDIRECT_USE_ORIG_CACHE_KEY, redirect_use_orig_cache_key, "proxy.config.http.redirect_use_orig_cache_key", INT, GENERIC) \
X(HTTP_ATTACH_SERVER_SESSION_TO_CLIENT, attach_server_session_to_client, "proxy.config.http.attach_server_session_to_client", INT, GENERIC) \
X(WEBSOCKET_NO_ACTIVITY_TIMEOUT, websocket_inactive_timeout, "proxy.config.websocket.no_activity_timeout", INT, GENERIC) \
X(WEBSOCKET_ACTIVE_TIMEOUT, websocket_active_timeout, "proxy.config.websocket.active_timeout", INT, GENERIC) \
X(HTTP_UNCACHEABLE_REQUESTS_BYPASS_PARENT, uncacheable_requests_bypass_parent, "proxy.config.http.uncacheable_requests_bypass_parent", INT, GENERIC) \
X(HTTP_PARENT_PROXY_TOTAL_CONNECT_ATTEMPTS, parent_connect_attempts, "proxy.config.http.parent_proxy.total_connect_attempts", INT, GENERIC) \
X(HTTP_TRANSACTION_ACTIVE_TIMEOUT_IN, transaction_active_timeout_in, "proxy.config.http.transaction_active_timeout_in", INT, GENERIC) \
X(SRV_ENABLED, srv_enabled, "proxy.config.srv_enabled", INT, GENERIC) \
X(HTTP_FORWARD_CONNECT_METHOD, forward_connect_method, "proxy.config.http.forward_connect_method", INT, GENERIC) \
X(SSL_CERT_FILENAME, ssl_client_cert_filename, "proxy.config.ssl.client.cert.filename", STRING, NONE) \
X(SSL_CERT_FILEPATH, ssl_client_cert_filename, "proxy.config.ssl.client.cert.path", STRING, NONE) \
X(PARENT_FAILURES_UPDATE_HOSTDB, parent_failures_update_hostdb, "proxy.config.http.parent_proxy.mark_down_hostdb", INT, GENERIC) \
X(HTTP_CACHE_IGNORE_ACCEPT_MISMATCH, ignore_accept_mismatch, "proxy.config.http.cache.ignore_accept_mismatch", INT, GENERIC) \
X(HTTP_CACHE_IGNORE_ACCEPT_LANGUAGE_MISMATCH, ignore_accept_language_mismatch, "proxy.config.http.cache.ignore_accept_language_mismatch", INT, GENERIC) \
X(HTTP_CACHE_IGNORE_ACCEPT_ENCODING_MISMATCH, ignore_accept_encoding_mismatch, "proxy.config.http.cache.ignore_accept_encoding_mismatch", INT, GENERIC) \
X(HTTP_CACHE_IGNORE_ACCEPT_CHARSET_MISMATCH, ignore_accept_charset_mismatch, "proxy.config.http.cache.ignore_accept_charset_mismatch", INT, GENERIC) \
X(HTTP_PARENT_PROXY_FAIL_THRESHOLD, parent_fail_threshold, "proxy.config.http.parent_proxy.fail_threshold", INT, GENERIC) \
X(HTTP_PARENT_PROXY_RETRY_TIME, parent_retry_time, "proxy.config.http.parent_proxy.retry_time", INT, GENERIC) \
X(HTTP_PER_PARENT_CONNECT_ATTEMPTS, per_parent_connect_attempts, "proxy.config.http.parent_proxy.per_parent_connect_attempts", INT, GENERIC) \
X(HTTP_NORMALIZE_AE, normalize_ae, "proxy.config.http.normalize_ae", INT, GENERIC) \
X(HTTP_INSERT_FORWARDED, insert_forwarded, "proxy.config.http.insert_forwarded", STRING, GENERIC) \
X(HTTP_PROXY_PROTOCOL_OUT, proxy_protocol_out, "proxy.config.http.proxy_protocol_out", INT, GENERIC) \
X(HTTP_ALLOW_MULTI_RANGE, allow_multi_range, "proxy.config.http.allow_multi_range", INT, GENERIC) \
X(HTTP_REQUEST_BUFFER_ENABLED, request_buffer_enabled, "proxy.config.http.request_buffer_enabled", INT, GENERIC) \
X(HTTP_ALLOW_HALF_OPEN, allow_half_open, "proxy.config.http.allow_half_open", INT, GENERIC) \
X(HTTP_SERVER_MIN_KEEP_ALIVE_CONNS, connection_tracker_config.server_min, ConnectionTracker::CONFIG_SERVER_VAR_MIN, INT, ConnectionTracker_MIN_SERVER_CONV) \
X(HTTP_PER_SERVER_CONNECTION_MAX, connection_tracker_config.server_max, ConnectionTracker::CONFIG_SERVER_VAR_MAX, INT, ConnectionTracker_MAX_SERVER_CONV) \
X(HTTP_PER_SERVER_CONNECTION_MATCH, connection_tracker_config.server_match, ConnectionTracker::CONFIG_SERVER_VAR_MATCH, INT, ConnectionTracker_SERVER_MATCH_CONV) \
X(SSL_CLIENT_VERIFY_SERVER_POLICY, ssl_client_verify_server_policy, "proxy.config.ssl.client.verify.server.policy", STRING, NONE) \
X(SSL_CLIENT_VERIFY_SERVER_PROPERTIES, ssl_client_verify_server_properties, "proxy.config.ssl.client.verify.server.properties", STRING, NONE) \
X(SSL_CLIENT_SNI_POLICY, ssl_client_sni_policy, "proxy.config.ssl.client.sni_policy", STRING, NONE) \
X(SSL_CLIENT_PRIVATE_KEY_FILENAME, ssl_client_private_key_filename, "proxy.config.ssl.client.private_key.filename", STRING, NONE) \
X(SSL_CLIENT_CA_CERT_FILENAME, ssl_client_ca_cert_filename, "proxy.config.ssl.client.CA.cert.filename", STRING, NONE) \
X(SSL_CLIENT_ALPN_PROTOCOLS, ssl_client_alpn_protocols, "proxy.config.ssl.client.alpn_protocols", STRING, NONE) \
X(HTTP_HOST_RESOLUTION_PREFERENCE, host_res_data, "proxy.config.hostdb.ip_resolve", STRING, HttpTransact_HOST_RES_CONV) \
X(HTTP_CONNECT_DOWN_POLICY, connect_down_policy, "proxy.config.http.connect.down.policy", INT, GENERIC) \
X(HTTP_MAX_PROXY_CYCLES, max_proxy_cycles, "proxy.config.http.max_proxy_cycles", INT, GENERIC) \
X(PLUGIN_VC_DEFAULT_BUFFER_INDEX, plugin_vc_default_buffer_index, "proxy.config.plugin.vc.default_buffer_index", INT, GENERIC) \
X(PLUGIN_VC_DEFAULT_BUFFER_WATER_MARK, plugin_vc_default_buffer_water_mark, "proxy.config.plugin.vc.default_buffer_water_mark", INT, GENERIC) \
X(NET_SOCK_NOTSENT_LOWAT, sock_packet_notsent_lowat, "proxy.config.net.sock_notsent_lowat", INT, GENERIC) \
X(BODY_FACTORY_RESPONSE_SUPPRESSION_MODE, response_suppression_mode, "proxy.config.body_factory.response_suppression_mode", INT, GENERIC) \
X(HTTP_ENABLE_PARENT_TIMEOUT_MARKDOWNS, enable_parent_timeout_markdowns, "proxy.config.http.parent_proxy.enable_parent_timeout_markdowns", INT, GENERIC) \
X(HTTP_DISABLE_PARENT_MARKDOWNS, disable_parent_markdowns, "proxy.config.http.parent_proxy.disable_parent_markdowns", INT, GENERIC) \
X(NET_DEFAULT_INACTIVITY_TIMEOUT, default_inactivity_timeout, "proxy.config.net.default_inactivity_timeout", INT, GENERIC) \
X(HTTP_NO_DNS_JUST_FORWARD_TO_PARENT, no_dns_forward_to_parent, "proxy.config.http.no_dns_just_forward_to_parent", INT, GENERIC) \
X(HTTP_CACHE_IGNORE_QUERY, cache_ignore_query, "proxy.config.http.cache.ignore_query", INT, GENERIC) \
X(HTTP_DROP_CHUNKED_TRAILERS, http_drop_chunked_trailers, "proxy.config.http.drop_chunked_trailers", INT, GENERIC) \
X(HTTP_STRICT_CHUNK_PARSING, http_strict_chunk_parsing, "proxy.config.http.strict_chunk_parsing", INT, GENERIC) \
X(HTTP_NEGATIVE_CACHING_LIST, negative_caching_list, "proxy.config.http.negative_caching_list", STRING, HttpStatusCodeList_Conv) \
X(HTTP_CONNECT_ATTEMPTS_RETRY_BACKOFF_BASE, connect_attempts_retry_backoff_base, "proxy.config.http.connect_attempts_retry_backoff_base", INT, GENERIC) \
X(HTTP_NEGATIVE_REVALIDATING_LIST, negative_revalidating_list, "proxy.config.http.negative_revalidating_list", STRING, HttpStatusCodeList_Conv) \
X(HTTP_CACHE_POST_METHOD, cache_post_method, "proxy.config.http.cache.post_method", INT, GENERIC)
// clang-format on