trafficserver-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From sudhe...@apache.org
Subject git commit: Add support for Content-Length in background_fetch config
Date Mon, 03 Nov 2014 19:24:42 GMT
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 <sudheerv@yahoo-inc.com>
Authored: Mon Nov 3 19:24:14 2014 +0000
Committer: Sudheer Vinukonda <sudheerv@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);


Mime
View raw message