You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by su...@apache.org on 2014/11/03 20:24:42 UTC

git commit: Add support for Content-Length in background_fetch config

Repository: trafficserver
Updated Branches:
  refs/heads/master 5e808b27b -> e655012e8


Add support for Content-Length in background_fetch config


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 <su...@yahoo-inc.com>
Authored: Mon Nov 3 19:24:14 2014 +0000
Committer: Sudheer Vinukonda <su...@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/reference/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/plugins/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);


Re: git commit: Add support for Content-Length in background_fetch config

Posted by Sudheer Vinukonda <su...@yahoo-inc.com.INVALID>.
Hi Alan,

Sure - but, unfortunately, it looks like there¹s something wrong with the
automatic propagation of the commit SHA onto the jira for the past few
days.

It¹s not been updating the commit SHA on the jira, despite mentioning the
jira ticket # in the commit message.

Thanks,

Sudheer

On 11/4/14, 1:22 PM, "Alan M. Carroll" <am...@network-geographics.com> wrote:

>Monday, November 3, 2014, 2:57:00 PM, you wrote:
>
>> 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?
>
>If you could, also put the commit SHA in a comment on the ticket. That's
>very useful later on. This happens automatically if you put the ticket #
>in the commit message.
>


Re: git commit: Add support for Content-Length in background_fetch config

Posted by "Alan M. Carroll" <am...@network-geographics.com>.
Monday, November 3, 2014, 2:57:00 PM, you wrote:

> 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?

If you could, also put the commit SHA in a comment on the ticket. That's very useful later on. This happens automatically if you put the ticket # in the commit message.


Re: git commit: Add support for Content-Length in background_fetch config

Posted by Sudheer Vinukonda <su...@yahoo-inc.com.INVALID>.
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, sudheerv@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 <su...@yahoo-inc.com>
>> Authored: Mon Nov 3 19:24:14 2014 +0000
>> Committer: Sudheer Vinukonda <su...@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);
>> 
>


Re: git commit: Add support for Content-Length in background_fetch config

Posted by Leif Hedstrom <zw...@apache.org>.
> On Nov 3, 2014, at 12:24 PM, sudheerv@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 <su...@yahoo-inc.com>
> Authored: Mon Nov 3 19:24:14 2014 +0000
> Committer: Sudheer Vinukonda <su...@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/reference/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/plugins/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);
> 


Re: git commit: Add support for Content-Length in background_fetch config

Posted by Leif Hedstrom <zw...@apache.org>.
> On Nov 3, 2014, at 12:24 PM, sudheerv@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 <su...@yahoo-inc.com>
> Authored: Mon Nov 3 19:24:14 2014 +0000
> Committer: Sudheer Vinukonda <su...@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/reference/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/plugins/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);
>