You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by bc...@apache.org on 2014/03/28 01:08:07 UTC

git commit: TS-2666: Add support for whitelist of headers to be proxied from origin servers by combo handler code review change: use const string

Repository: trafficserver
Updated Branches:
  refs/heads/master 440b5b55e -> f61b1b416


TS-2666: Add support for whitelist of headers to be proxied from origin servers by combo handler
code review change: use const string


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

Branch: refs/heads/master
Commit: f61b1b416f4bb99854c6b6c77b12f742b5af9ca8
Parents: 440b5b5
Author: Abhishek Nayani <na...@yahoo-inc.com>
Authored: Wed Mar 26 18:08:29 2014 +0000
Committer: Bryan Call <bc...@apache.org>
Committed: Thu Mar 27 17:07:24 2014 -0700

----------------------------------------------------------------------
 plugins/experimental/esi/README.combo     |  3 ++
 plugins/experimental/esi/combo_handler.cc | 43 ++++++++++++++++++++++++++
 2 files changed, 46 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/f61b1b41/plugins/experimental/esi/README.combo
----------------------------------------------------------------------
diff --git a/plugins/experimental/esi/README.combo b/plugins/experimental/esi/README.combo
index db0abd0..0cb3774 100644
--- a/plugins/experimental/esi/README.combo
+++ b/plugins/experimental/esi/README.combo
@@ -12,6 +12,9 @@ The arguments in the plugin.config line in order represent
 2) The name of the key used for signature verification (disabled
    by default) [verification not implemented yet]
 
+3) A colon separated list of headers which, if present on atleast one 
+   response, will be added to the combo response.
+
 A "-" can be supplied as a value for any of these arguments to request
 default value be applied.
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/f61b1b41/plugins/experimental/esi/combo_handler.cc
----------------------------------------------------------------------
diff --git a/plugins/experimental/esi/combo_handler.cc b/plugins/experimental/esi/combo_handler.cc
index ca218af..c2ecace 100644
--- a/plugins/experimental/esi/combo_handler.cc
+++ b/plugins/experimental/esi/combo_handler.cc
@@ -23,6 +23,8 @@
 
 #include <list>
 #include <string>
+#include <sstream>
+#include <vector>
 #include <time.h>
 #include <pthread.h>
 #include <arpa/inet.h>
@@ -46,6 +48,7 @@ using namespace EsiLib;
 
 int arg_idx;
 static string SIG_KEY_NAME;
+static vector<string> HEADER_WHITELIST;
 
 #define DEFAULT_COMBO_HANDLER_PATH "admin/v1/combo"
 static string COMBO_HANDLER_PATH;
@@ -216,6 +219,18 @@ TSPluginInit(int argc, const char *argv[])
   SIG_KEY_NAME = ((argc > 2) && (strcmp(argv[2], "-") != 0)) ? argv[2] : "";
   LOG_DEBUG("Signature key is [%s]", SIG_KEY_NAME.c_str());
 
+  if ((argc > 3) && (strcmp(argv[3], "-") != 0)) {
+    stringstream strstream(argv[3]);
+    string header;
+    while (getline(strstream, header, ':')) {
+      HEADER_WHITELIST.push_back(header);
+    }
+  }
+
+  for (unsigned int i = 0; i < HEADER_WHITELIST.size(); i++) {
+    LOG_DEBUG("WhiteList: %s", HEADER_WHITELIST[i].c_str());
+  }
+
   TSReleaseAssert(pthread_key_create(&threadKey, NULL) == 0);
 
   TSCont rrh_contp = TSContCreate(handleReadRequestHeader, NULL);
@@ -767,6 +782,13 @@ prepareResponse(InterceptData &int_data, ByteBlockList &body_blocks, string &res
     TSMLoc field_loc;
     time_t expires_time;
     bool got_expires_time = false;
+    int num_headers = HEADER_WHITELIST.size();
+    int flags_list[num_headers];
+
+    for (int i = 0; i < num_headers; i++) {
+      flags_list[i] = 0;
+    }
+
     for (StringList::iterator iter = int_data.creq.file_urls.begin(); iter != int_data.creq.file_urls.end();
          ++iter) {
       if (int_data.fetcher->getData(*iter, resp_data) && resp_data.status == TS_HTTP_STATUS_OK) {
@@ -790,6 +812,27 @@ prepareResponse(InterceptData &int_data, ByteBlockList &body_blocks, string &res
           }
           TSHandleMLocRelease(resp_data.bufp, resp_data.hdr_loc, field_loc);
         }
+
+        for (int i = 0; i < num_headers; i++) {
+          if (flags_list[i]) {
+            continue;
+          }
+
+          const string& header = HEADER_WHITELIST[i];
+
+          field_loc = TSMimeHdrFieldFind(resp_data.bufp, resp_data.hdr_loc, header.c_str(), header.size());
+          if (field_loc != TS_NULL_MLOC) {
+            int hdr_len = 0;
+            const char* hdr = TSMimeHdrFieldValueStringGet(resp_data.bufp, resp_data.hdr_loc, field_loc, 0, &hdr_len);
+            if (hdr) {
+              string hdr_value = string(hdr, hdr_len);
+              resp_header_fields.append(header + ": " + hdr_value + "\r\n");
+              flags_list[i] = 1;
+            }
+            TSHandleMLocRelease(resp_data.bufp, resp_data.hdr_loc, field_loc);
+          }
+        }
+
       } else {
         LOG_ERROR("Could not get content for requested URL [%s]", iter->c_str());
         int_data.creq.status = TS_HTTP_STATUS_BAD_REQUEST;