Repository: trafficserver Updated Branches: refs/heads/master d903a38d1 -> e985569ae
TS-3831: overridable error response type This closes #273. Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/e985569a Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/e985569a Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/e985569a Branch: refs/heads/master Commit: e985569ae95fa6345f6302d1340d4e9b4e64b804 Parents: d903a38 Author: Syeda Persia Aziz <[email protected]> Authored: Fri Aug 7 16:55:29 2015 -0500 Committer: Alan M. Carroll <[email protected]> Committed: Mon Aug 10 14:40:51 2015 -0500 ---------------------------------------------------------------------- lib/ts/apidefs.h.in | 1 + mgmt/RecordsConfig.cc | 3 ++- .../experimental/ts_lua/ts_lua_http_config.c | 5 ++-- proxy/InkAPI.cc | 24 +++++++++++++++++++- proxy/InkAPITest.cc | 3 ++- proxy/http/HttpBodyFactory.cc | 13 +++++++++-- proxy/http/HttpConfig.cc | 6 ++++- proxy/http/HttpConfig.h | 8 +++++-- 8 files changed, 53 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e985569a/lib/ts/apidefs.h.in ---------------------------------------------------------------------- diff --git a/lib/ts/apidefs.h.in b/lib/ts/apidefs.h.in index 5058990..2237cfe 100644 --- a/lib/ts/apidefs.h.in +++ b/lib/ts/apidefs.h.in @@ -674,6 +674,7 @@ typedef enum { TS_CONFIG_HTTP_AUTH_SERVER_SESSION_PRIVATE, TS_CONFIG_HTTP_SLOW_LOG_THRESHOLD, TS_CONFIG_HTTP_CACHE_GENERATION, + TS_CONFIG_BODY_FACTORY_TEMPLATE_BASE, TS_CONFIG_LAST_ENTRY } TSOverridableConfigKey; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e985569a/mgmt/RecordsConfig.cc ---------------------------------------------------------------------- diff --git a/mgmt/RecordsConfig.cc b/mgmt/RecordsConfig.cc index 72e677f..fc0c6b6 100644 --- a/mgmt/RecordsConfig.cc +++ b/mgmt/RecordsConfig.cc @@ -737,7 +737,8 @@ static const RecordElement RecordsConfig[] = //# 2 - suppress responses for intercepted traffic {RECT_CONFIG, "proxy.config.body_factory.response_suppression_mode", RECD_INT, "0", RECU_RESTART_TS, RR_NULL, RECC_INT, "[0-2]", RECA_NULL} , - + {RECT_CONFIG, "proxy.config.body_factory.template_base", RECD_STRING, "NONE", RECU_DYNAMIC, RR_NULL, RECC_STR, ".*", RECA_NULL} + , //############################################################################## //# //# SOCKS Processor http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e985569a/plugins/experimental/ts_lua/ts_lua_http_config.c ---------------------------------------------------------------------- diff --git a/plugins/experimental/ts_lua/ts_lua_http_config.c b/plugins/experimental/ts_lua/ts_lua_http_config.c index bdf7a78..d3cc003 100644 --- a/plugins/experimental/ts_lua/ts_lua_http_config.c +++ b/plugins/experimental/ts_lua/ts_lua_http_config.c @@ -82,6 +82,7 @@ typedef enum { TS_LUA_CONFIG_NET_SOCK_PACKET_MARK_OUT = TS_CONFIG_NET_SOCK_PACKET_MARK_OUT, TS_LUA_CONFIG_NET_SOCK_PACKET_TOS_OUT = TS_CONFIG_NET_SOCK_PACKET_TOS_OUT, TS_LUA_CONFIG_HTTP_SLOW_LOG_THRESHOLD = TS_CONFIG_HTTP_SLOW_LOG_THRESHOLD, + TS_LUA_CONFIG_BODY_FACTORY_TEMPLATE_BASE = TS_CONFIG_BODY_FACTORY_TEMPLATE_BASE, TS_LUA_CONFIG_LAST_ENTRY = TS_CONFIG_LAST_ENTRY, } TSLuaOverridableConfigKey; @@ -141,8 +142,8 @@ ts_lua_var_item ts_lua_http_config_vars[] = { TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_CACHE_FUZZ_MIN_TIME), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_DOC_IN_CACHE_SKIP_DNS), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_RESPONSE_SERVER_STR), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_CACHE_HEURISTIC_LM_FACTOR), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_CACHE_FUZZ_PROBABILITY), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_NET_SOCK_PACKET_MARK_OUT), - TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_NET_SOCK_PACKET_TOS_OUT), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_LAST_ENTRY), - TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_SLOW_LOG_THRESHOLD), + TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_NET_SOCK_PACKET_TOS_OUT), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_HTTP_SLOW_LOG_THRESHOLD), + TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_BODY_FACTORY_TEMPLATE_BASE), TS_LUA_MAKE_VAR_ITEM(TS_LUA_CONFIG_LAST_ENTRY), }; ts_lua_var_item ts_lua_http_timeout_vars[] = { http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e985569a/proxy/InkAPI.cc ---------------------------------------------------------------------- diff --git a/proxy/InkAPI.cc b/proxy/InkAPI.cc index 445e2ce..6c4129e 100644 --- a/proxy/InkAPI.cc +++ b/proxy/InkAPI.cc @@ -7909,7 +7909,10 @@ _conf_to_memberp(TSOverridableConfigKey conf, OverridableHttpConfigParams *overr typ = OVERRIDABLE_TYPE_INT; ret = &overridableHttpConfig->slow_log_threshold; break; - + case TS_CONFIG_BODY_FACTORY_TEMPLATE_BASE: + typ = OVERRIDABLE_TYPE_STRING; + ret = &overridableHttpConfig->body_factory_template_base; + break; // This helps avoiding compiler warnings, yet detect unhandled enum members. case TS_CONFIG_NULL: case TS_CONFIG_LAST_ENTRY: @@ -8055,6 +8058,15 @@ TSHttpTxnConfigStringSet(TSHttpTxn txnp, TSOverridableConfigKey conf, const char s->t_state.txn_conf->global_user_agent_header_size = 0; } break; + case TS_CONFIG_BODY_FACTORY_TEMPLATE_BASE: + if (value && length > 0) { + s->t_state.txn_conf->body_factory_template_base = const_cast<char *>(value); + s->t_state.txn_conf->body_factory_template_base_len = length; + } else { + s->t_state.txn_conf->body_factory_template_base = NULL; + s->t_state.txn_conf->body_factory_template_base_len = 0; + } + break; default: return TS_ERROR; break; @@ -8082,6 +8094,10 @@ TSHttpTxnConfigStringGet(TSHttpTxn txnp, TSOverridableConfigKey conf, const char *value = sm->t_state.txn_conf->global_user_agent_header; *length = sm->t_state.txn_conf->global_user_agent_header_size; break; + case TS_CONFIG_BODY_FACTORY_TEMPLATE_BASE: + *value = sm->t_state.txn_conf->body_factory_template_base; + *length = sm->t_state.txn_conf->body_factory_template_base_len; + break; default: return TS_ERROR; break; @@ -8208,6 +8224,12 @@ TSHttpTxnConfigFind(const char *name, int length, TSOverridableConfigKey *conf, case 39: switch (name[length - 1]) { + case 'e': + if (!strncmp(name, "proxy.config.body_factory.template_base", length)) { + cnf = TS_CONFIG_BODY_FACTORY_TEMPLATE_BASE; + typ = TS_RECORDDATATYPE_STRING; + } + break; case 'm': if (!strncmp(name, "proxy.config.http.anonymize_remove_from", length)) cnf = TS_CONFIG_HTTP_ANONYMIZE_REMOVE_FROM; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e985569a/proxy/InkAPITest.cc ---------------------------------------------------------------------- diff --git a/proxy/InkAPITest.cc b/proxy/InkAPITest.cc index 4a43fa6..704a759 100644 --- a/proxy/InkAPITest.cc +++ b/proxy/InkAPITest.cc @@ -7206,7 +7206,8 @@ const char *SDK_Overridable_Configs[TS_CONFIG_LAST_ENTRY] = { "proxy.config.ssl.hsts_max_age", "proxy.config.ssl.hsts_include_subdomains", "proxy.config.http.cache.open_read_retry_time", "proxy.config.http.cache.max_open_read_retries", "proxy.config.http.cache.range.write", "proxy.config.http.post.check.content_length.enabled", "proxy.config.http.global_user_agent_header", - "proxy.config.http.auth_server_session_private", "proxy.config.http.slow.log.threshold", "proxy.config.http.cache.generation"}; + "proxy.config.http.auth_server_session_private", "proxy.config.http.slow.log.threshold", "proxy.config.http.cache.generation", + "proxy.config.body_factory.template_base"}; REGRESSION_TEST(SDK_API_OVERRIDABLE_CONFIGS)(RegressionTest *test, int /* atype ATS_UNUSED */, int *pstatus) { http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e985569a/proxy/http/HttpBodyFactory.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpBodyFactory.cc b/proxy/http/HttpBodyFactory.cc index 362b335..540f01c 100644 --- a/proxy/http/HttpBodyFactory.cc +++ b/proxy/http/HttpBodyFactory.cc @@ -147,6 +147,7 @@ HttpBodyFactory::fabricate_with_old_api(const char *type, HttpTransact::State *c buffer = fabricate(&acpt_language_list, &acpt_charset_list, "default", context, resulting_buffer_length, &lang_ptr, &charset_ptr, &set); } + /////////////////////////////////// // enforce the max buffer length // /////////////////////////////////// @@ -397,9 +398,11 @@ HttpBodyFactory::fabricate(StrList *acpt_language_list, StrList *acpt_charset_li const char **set_return) { char *buffer; + const char *pType = context->txn_conf->body_factory_template_base; const char *set; HttpBodyTemplate *t; HttpBodySet *body_set; + char template_base[PATH_NAME_MAX]; if (set_return) *set_return = "???"; @@ -430,9 +433,15 @@ HttpBodyFactory::fabricate(StrList *acpt_language_list, StrList *acpt_charset_li if (set_return) *set_return = set; - + if (pType != NULL && 0 != *pType && 0 != strncmp(pType, "NONE", 4)) { + sprintf(template_base, "%s_%s", pType, type); + } else { + sprintf(template_base, "%s", type); + } // see if we have a custom error page template - t = find_template(set, type, &body_set); + t = find_template(set, template_base, &body_set); + if (t == NULL) + t = find_template(set, type, &body_set); // this executes if the template_base is wrong and doesn't exist if (t == NULL) { Debug("body_factory", " can't find template, returning NULL template"); return (NULL); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e985569a/proxy/http/HttpConfig.cc ---------------------------------------------------------------------- diff --git a/proxy/http/HttpConfig.cc b/proxy/http/HttpConfig.cc index 646173d..b467f2f 100644 --- a/proxy/http/HttpConfig.cc +++ b/proxy/http/HttpConfig.cc @@ -1065,7 +1065,8 @@ HttpConfig::startup() HttpEstablishStaticConfigStringAlloc(c.reverse_proxy_no_host_redirect, "proxy.config.header.parse.no_host_url_redirect"); c.reverse_proxy_no_host_redirect_len = -1; - + HttpEstablishStaticConfigStringAlloc(c.oride.body_factory_template_base, "proxy.config.body_factory.template_base"); + c.oride.body_factory_template_base_len = c.oride.body_factory_template_base ? strlen(c.oride.body_factory_template_base) : 0; HttpEstablishStaticConfigByte(c.errors_log_error_pages, "proxy.config.http.errors.log_error_pages"); HttpEstablishStaticConfigLongLong(c.oride.slow_log_threshold, "proxy.config.http.slow.log.threshold"); @@ -1334,6 +1335,9 @@ HttpConfig::reconfigure() params->oride.default_buffer_size_index = m_master.oride.default_buffer_size_index; params->oride.default_buffer_water_mark = m_master.oride.default_buffer_water_mark; params->enable_http_info = INT_TO_BOOL(m_master.enable_http_info); + params->oride.body_factory_template_base = ats_strdup(m_master.oride.body_factory_template_base); + params->oride.body_factory_template_base_len = + params->oride.body_factory_template_base ? strlen(params->oride.body_factory_template_base) : 0; params->reverse_proxy_no_host_redirect = ats_strdup(m_master.reverse_proxy_no_host_redirect); params->reverse_proxy_no_host_redirect_len = params->reverse_proxy_no_host_redirect ? strlen(params->reverse_proxy_no_host_redirect) : 0; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e985569a/proxy/http/HttpConfig.h ---------------------------------------------------------------------- diff --git a/proxy/http/HttpConfig.h b/proxy/http/HttpConfig.h index cd2cb75..1722f74 100644 --- a/proxy/http/HttpConfig.h +++ b/proxy/http/HttpConfig.h @@ -386,8 +386,9 @@ struct OverridableHttpConfigParams { default_buffer_size_index(8), default_buffer_water_mark(32768), slow_log_threshold(0), // Strings / floats must come last - proxy_response_server_string(NULL), proxy_response_server_string_len(0), global_user_agent_header(NULL), - global_user_agent_header_size(0), cache_heuristic_lm_factor(0.10), freshness_fuzz_prob(0.005), background_fill_threshold(0.5) + body_factory_template_base(NULL), body_factory_template_base_len(0), proxy_response_server_string(NULL), + proxy_response_server_string_len(0), global_user_agent_header(NULL), global_user_agent_header_size(0), + cache_heuristic_lm_factor(0.10), freshness_fuzz_prob(0.005), background_fill_threshold(0.5) { } @@ -561,6 +562,8 @@ struct OverridableHttpConfigParams { /////////////////////////////////////////////////////////////////// // Server header // /////////////////////////////////////////////////////////////////// + char *body_factory_template_base; + size_t body_factory_template_base_len; char *proxy_response_server_string; // This does not get free'd by us! size_t proxy_response_server_string_len; // Updated when server_string is set. @@ -866,6 +869,7 @@ inline HttpConfigParams::~HttpConfigParams() ats_free(proxy_response_via_string); ats_free(url_expansions_string); ats_free(anonymize_other_header_list); + ats_free(oride.body_factory_template_base); ats_free(oride.proxy_response_server_string); ats_free(oride.global_user_agent_header); ats_free(cache_vary_default_text);
