You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2012/04/26 17:44:34 UTC
git commit: TS-1227 header_filter "set" operator does not work if the
header does not already exist
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 <zw...@apache.org>
Authored: Thu Apr 26 09:43:39 2012 -0600
Committer: Leif Hedstrom <zw...@apache.org>
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;
}
}
}