Updated Branches:
  refs/heads/master b0254b282 -> cc1773f90

TS-1227 header_filter "set" operator does not work if the header does not 
already exist


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/cc1773f9
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/cc1773f9
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/cc1773f9

Branch: refs/heads/master
Commit: cc1773f90df39ffd598658700eaf0f79027bc22e
Parents: b0254b2
Author: Leif Hedstrom <[email protected]>
Authored: Thu Apr 26 09:43:39 2012 -0600
Committer: Leif Hedstrom <[email protected]>
Committed: Thu Apr 26 09:43:39 2012 -0600

----------------------------------------------------------------------
 CHANGES                        |    2 +
 plugins/header_filter/rules.cc |  140 ++++++++++++++++++-----------------
 2 files changed, 74 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/cc1773f9/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index cfaee14..cd8278d 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,7 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache Traffic Server 3.1.4
+  *) [TS-1227] header_filter "set" operator doesn't work if the header
+   doesn't already exist.
 
   *) [TS-1210] remove 3.0.x deprecated APIs
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/cc1773f9/plugins/header_filter/rules.cc
----------------------------------------------------------------------
diff --git a/plugins/header_filter/rules.cc b/plugins/header_filter/rules.cc
index 6ad7b2f..62c21cb 100644
--- a/plugins/header_filter/rules.cc
+++ b/plugins/header_filter/rules.cc
@@ -67,85 +67,89 @@ RulesEntry::execute(TSMBuffer& reqp, TSMLoc& hdr_loc) const
     TSMLoc field = TSMimeHdrFieldFind(reqp, hdr_loc, _header, _h_len);
     bool first_set = true;
 
-    while (field) {
-      TSMLoc tmp;
-      int val_len = 0;
-      const char* val = NULL;
-      bool nuke = false;
+    if (!field && _q_type == QUAL_SET) {
+      add_header(reqp, hdr_loc, _header, _h_len, _qualifier, _q_len);
+    } else {
+      while (field) {
+        TSMLoc tmp;
+        int val_len = 0;
+        const char* val = NULL;
+        bool nuke = false;
       
-      if (_q_type != QUAL_NONE)
-        val = TSMimeHdrFieldValueStringGet(reqp, hdr_loc, field, 0, &val_len);
-
-      switch (_q_type) {
-      case QUAL_NONE:
-        nuke = true;
-        break;
-      case QUAL_REGEX:
-        if (val_len > 0) {
-          nuke = pcre_exec(_rex,            // the compiled pattern
-                           _extra,          // Extra data from study (maybe)
-                           val,                // the subject string
-                           val_len,            // the length of the subject
-                           0,                  // start at offset 0 in the 
subject
-                           0,                  // default options
-                           NULL,               // no output vector for 
substring information
-                           0) >= 0;
-        }
-        break;
+        if (_q_type != QUAL_NONE)
+          val = TSMimeHdrFieldValueStringGet(reqp, hdr_loc, field, 0, 
&val_len);
 
-      case QUAL_STRING:
-        if (static_cast<size_t>(val_len) == _q_len) {
-          if (_options & PCRE_CASELESS) {
-            nuke = !strncasecmp(_qualifier, val, val_len);
-          } else {
-            nuke = !memcmp(_qualifier, val, val_len);
+        switch (_q_type) {
+        case QUAL_NONE:
+          nuke = true;
+          break;
+        case QUAL_REGEX:
+          if (val_len > 0) {
+            nuke = pcre_exec(_rex,            // the compiled pattern
+                             _extra,          // Extra data from study (maybe)
+                             val,                // the subject string
+                             val_len,            // the length of the subject
+                             0,                  // start at offset 0 in the 
subject
+                             0,                  // default options
+                             NULL,               // no output vector for 
substring information
+                             0) >= 0;
           }
-        }
-        break;
+          break;
 
-      case QUAL_PREFIX:
-        if (static_cast<size_t>(val_len) >= _q_len) {
-          if (_options & PCRE_CASELESS) {
-            nuke = !strncasecmp(_qualifier, val, _q_len);
-          } else {
-            nuke = !memcmp(_qualifier, val, _q_len);
+        case QUAL_STRING:
+          if (static_cast<size_t>(val_len) == _q_len) {
+            if (_options & PCRE_CASELESS) {
+              nuke = !strncasecmp(_qualifier, val, val_len);
+            } else {
+              nuke = !memcmp(_qualifier, val, val_len);
+            }
           }
-        }
-        break;
+          break;
+
+        case QUAL_PREFIX:
+          if (static_cast<size_t>(val_len) >= _q_len) {
+            if (_options & PCRE_CASELESS) {
+              nuke = !strncasecmp(_qualifier, val, _q_len);
+            } else {
+              nuke = !memcmp(_qualifier, val, _q_len);
+            }
+          }
+          break;
 
-      case QUAL_POSTFIX: 
-        if (static_cast<size_t>(val_len) >= _q_len) {
-          if (_options & PCRE_CASELESS) {
-            nuke = !strncasecmp(_qualifier, val + val_len - _q_len, _q_len);
+        case QUAL_POSTFIX: 
+          if (static_cast<size_t>(val_len) >= _q_len) {
+            if (_options & PCRE_CASELESS) {
+              nuke = !strncasecmp(_qualifier, val + val_len - _q_len, _q_len);
+            } else {
+              nuke = !memcmp(_qualifier, val + val_len - _q_len, _q_len);
+            }
+          }
+          break;
+        case QUAL_SET:
+          if (first_set) {
+            nuke = false;
+            first_set = false;
+            if (TS_SUCCESS == TSMimeHdrFieldValueStringSet(reqp, hdr_loc, 
field, -1, _qualifier, _q_len))
+              TSDebug(PLUGIN_NAME, "\tSet header:  %s: %s", _header, 
_qualifier);
           } else {
-            nuke = !memcmp(_qualifier, val + val_len - _q_len, _q_len);
+            // Nuke all other "duplicates" of this header
+            nuke = true;
           }
-        }
-        break;
-      case QUAL_SET:
-        if (first_set) {
-          nuke = false;
-          first_set = false;
-          if (TS_SUCCESS == TSMimeHdrFieldValueStringSet(reqp, hdr_loc, field, 
-1, _qualifier, _q_len))
-            TSDebug(PLUGIN_NAME, "\tSet header:  %s: %s", _header, _qualifier);
-        } else {
-          // Nuke all other "duplicates" of this header
-          nuke = true;
-        }
         
-      default:
-        break;
-      }
+        default:
+          break;
+        }
 
-      tmp = TSMimeHdrFieldNextDup(reqp, hdr_loc, field);
-      if (_inverse)
-        nuke = !nuke;
-      if (nuke) {
-        if (TS_SUCCESS == TSMimeHdrFieldDestroy(reqp, hdr_loc, field))
-          TSDebug(PLUGIN_NAME, "\tDeleting header %.*s", 
static_cast<int>(_h_len), _header);
+        tmp = TSMimeHdrFieldNextDup(reqp, hdr_loc, field);
+        if (_inverse)
+          nuke = !nuke;
+        if (nuke) {
+          if (TS_SUCCESS == TSMimeHdrFieldDestroy(reqp, hdr_loc, field))
+            TSDebug(PLUGIN_NAME, "\tDeleting header %.*s", 
static_cast<int>(_h_len), _header);
+        }
+        TSHandleMLocRelease(reqp, hdr_loc, field);
+        field = tmp;
       }
-      TSHandleMLocRelease(reqp, hdr_loc, field);
-      field = tmp;
     }
   }
 }

Reply via email to