Hi Leif, Ah, apologies for missing the Jira ticket# in the commit.
This change is part of TS-2683 - I will try to update the CHANGES file with a consolidated list of changes made for TS-2683. Will that work? Thanks, Sudheer On 11/3/14, 12:12 PM, "Leif Hedstrom" <zw...@apache.org> wrote: > >> On Nov 3, 2014, at 12:24 PM, sudhe...@apache.org wrote: >> >> Repository: trafficserver >> Updated Branches: >> refs/heads/master 5e808b27b -> e655012e8 >> >> >> Add support for Content-Length in background_fetch config > > >Does this have a Jira associated with it? It helps tracking what¹s ³New² >in upcoming releases, amongst other forensic trails :) > >‹ Leif > >> >> >> Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo >> Commit: >>http://git-wip-us.apache.org/repos/asf/trafficserver/commit/e655012e >> Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/e655012e >> Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/e655012e >> >> Branch: refs/heads/master >> Commit: e655012e88572b6e9cfe2376c23276821e129ff9 >> Parents: 5e808b2 >> Author: Sudheer Vinukonda <sudhe...@yahoo-inc.com> >> Authored: Mon Nov 3 19:24:14 2014 +0000 >> Committer: Sudheer Vinukonda <sudhe...@yahoo-inc.com> >> Committed: Mon Nov 3 19:24:14 2014 +0000 >> >> ---------------------------------------------------------------------- >> doc/reference/plugins/background_fetch.en.rst | 2 + >> .../background_fetch/background_fetch.cc | 69 >>++++++++++++++++---- >> 2 files changed, 57 insertions(+), 14 deletions(-) >> ---------------------------------------------------------------------- >> >> >> >>http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e655012e/doc/re >>ference/plugins/background_fetch.en.rst >> ---------------------------------------------------------------------- >> diff --git a/doc/reference/plugins/background_fetch.en.rst >>b/doc/reference/plugins/background_fetch.en.rst >> index e1b4065..7826884 100644 >> --- a/doc/reference/plugins/background_fetch.en.rst >> +++ b/doc/reference/plugins/background_fetch.en.rst >> @@ -74,8 +74,10 @@ background fetch based on any arbitrary header or >>client-ip:: >> The contents of the config-file could be as below:: >> >> include User-Agent ABCDEF >> + exclude User-Agent * >> exclude Content-Type text >> exclude X-Foo-Bar text >> + exclude Content-Length <1000 >> >> The plugin also now supports per remap activation. To activate the >>plugin for >> a given remap, add the below on the remap line:: >> >> >>http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e655012e/plugin >>s/experimental/background_fetch/background_fetch.cc >> ---------------------------------------------------------------------- >> diff --git a/plugins/experimental/background_fetch/background_fetch.cc >>b/plugins/experimental/background_fetch/background_fetch.cc >> index f48ea05..7763b82 100644 >> --- a/plugins/experimental/background_fetch/background_fetch.cc >> +++ b/plugins/experimental/background_fetch/background_fetch.cc >> @@ -129,7 +129,14 @@ read_config(char* config_file, BgFetchRuleMap* ri) >> if (cfg_name) { >> cfg_value = strtok_r(NULL, " ", &savePtr); >> if (cfg_value) { >> - TSDebug(PLUGIN_NAME, "adding background_fetch exclusion >>rule %d for %s:%s", exclude, cfg_name, cfg_value); >> + if (!strcmp(cfg_name, "Content-Length")) { >> + if ((cfg_value[0] != '<') && (cfg_value[0] != '>')) { >> + TSError("%s: invalid content-len condition %s, >>skipping config value", PLUGIN_NAME, cfg_value); >> + memset(buffer, 0, sizeof(buffer)); >> + continue; >> + } >> + } >> + TSDebug(PLUGIN_NAME, "adding background_fetch exclusion >>rule %d for %s: %s", exclude, cfg_name, cfg_value); >> BgFetchRuleStruct ruleS = {exclude, cfg_name, cfg_value}; >> bgFetchRuleMapP->insert(std::make_pair(index++, ruleS)); >> } else { >> @@ -672,6 +679,20 @@ check_client_ip_configured(TSHttpTxn txnp, const >>char* cfg_ip) >> return false; >> } >> >> +static bool >> +check_content_length(const uint32_t len, const char* cfg_val) >> +{ >> + uint32_t cfg_cont_len = atoi(&cfg_val[1]); >> + >> + if (cfg_val[0] == '<') { >> + return (len <= cfg_cont_len); >> + } else if (cfg_val[0] == '>') { >> + return (len >= cfg_cont_len); >> + } else { >> + TSError("%s: invalid content length condition %c", PLUGIN_NAME, >>cfg_val[0]); >> + return false; >> + } >> +} >> >> >>///////////////////////////////////////////////////////////////////////// >>// >> // Check if a header excludes us from running the background fetch >> @@ -694,8 +715,29 @@ check_field_configured(TSHttpTxn txnp, const char* >>field_name, const char* cfg_v >> bool hdr_found = false; >> >> TSMBuffer hdr_bufp; >> - TSMLoc req_hdrs; >> + TSMLoc resp_hdrs; >> + >> + if (!strcmp(field_name, "Content-Length")) { >> + if (TS_SUCCESS == TSHttpTxnServerRespGet(txnp, &hdr_bufp, >>&resp_hdrs)) { >> + TSMLoc loc = TSMimeHdrFieldFind(hdr_bufp, resp_hdrs, field_name, >>-1); >> + if (TS_NULL_MLOC != loc) { >> + uint32_t content_len = TSMimeHdrFieldValueUintGet(hdr_bufp, >>resp_hdrs, loc, 0 /* index */ ); >> + if (check_content_length(content_len, cfg_val)) { >> + TSDebug(PLUGIN_NAME, "Found content-length match"); >> + hdr_found = true; >> + } >> + TSHandleMLocRelease(hdr_bufp, resp_hdrs, loc); >> + } else { >> + TSDebug(PLUGIN_NAME, "No content-length field in resp"); >> + } >> + } else { >> + TSError ("%s: Failed to get resp headers", PLUGIN_NAME); >> + } >> + TSHandleMLocRelease(hdr_bufp, TS_NULL_MLOC, resp_hdrs); >> + return hdr_found; >> + } >> >> + TSMLoc req_hdrs; >> TSReturnCode ret = TSHttpTxnClientReqGet(txnp, &hdr_bufp, &req_hdrs); >> >> if (ret != TS_SUCCESS) { >> @@ -709,19 +751,18 @@ check_field_configured(TSHttpTxn txnp, const >>char* field_name, const char* cfg_v >> if (TS_NULL_MLOC != loc) { >> if (!strcmp(cfg_val, "*")) { >> TSDebug(PLUGIN_NAME, "Found %s wild card", field_name); >> - TSHandleMLocRelease(hdr_bufp, req_hdrs, loc); >> - TSHandleMLocRelease(hdr_bufp, TS_NULL_MLOC, req_hdrs); >> - return true; >> - } >> - int val_len = 0; >> - const char *val_str = TSMimeHdrFieldValueStringGet(hdr_bufp, >>req_hdrs, loc, 0, &val_len); >> - >> - if (!val_str || val_len <= 0) { >> - TSDebug(PLUGIN_NAME,"invalid field"); >> + hdr_found = true; >> } else { >> - TSDebug(PLUGIN_NAME, "comparing with %s", cfg_val); >> - if (NULL != strstr(val_str, cfg_val)) { >> - hdr_found = true; >> + int val_len = 0; >> + const char *val_str = TSMimeHdrFieldValueStringGet(hdr_bufp, >>req_hdrs, loc, 0, &val_len); >> + >> + if (!val_str || val_len <= 0) { >> + TSDebug(PLUGIN_NAME,"invalid field"); >> + } else { >> + TSDebug(PLUGIN_NAME, "comparing with %s", cfg_val); >> + if (NULL != strstr(val_str, cfg_val)) { >> + hdr_found = true; >> + } >> } >> } >> TSHandleMLocRelease(hdr_bufp, req_hdrs, loc); >> >