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; } } }
