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 2014/04/17 18:44:47 UTC

[48/50] git commit: [TS-2720] Fixing bug in C++ API Request Transformations

[TS-2720] Fixing bug in C++ API Request Transformations


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

Branch: refs/heads/5.0.x
Commit: a4860363a94e7bb51e5de651c5ea07a804915777
Parents: 76a0777
Author: Brian Geffon <br...@apache.org>
Authored: Wed Apr 16 13:13:32 2014 -0700
Committer: Brian Geffon <br...@apache.org>
Committed: Wed Apr 16 13:13:32 2014 -0700

----------------------------------------------------------------------
 CHANGES                                         |  2 ++
 .../NullTransformationPlugin.cc                 | 21 +++++++++++++++-----
 lib/atscppapi/src/TransformationPlugin.cc       | 18 ++++++++++++++++-
 .../include/atscppapi/TransformationPlugin.h    |  1 +
 4 files changed, 36 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/a4860363/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index ebe5161..8cb41d9 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,5 +1,7 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache Traffic Server 5.0.0
+  
+  *) [TS-2720] Fix bug with request transformations in C++ api
 
   *) [TS-2717] header-rewrite set-redirect not working.
    Author: Igor Brezac

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/a4860363/lib/atscppapi/examples/null_transformation_plugin/NullTransformationPlugin.cc
----------------------------------------------------------------------
diff --git a/lib/atscppapi/examples/null_transformation_plugin/NullTransformationPlugin.cc b/lib/atscppapi/examples/null_transformation_plugin/NullTransformationPlugin.cc
index 0155d30..5312d3b 100644
--- a/lib/atscppapi/examples/null_transformation_plugin/NullTransformationPlugin.cc
+++ b/lib/atscppapi/examples/null_transformation_plugin/NullTransformationPlugin.cc
@@ -32,9 +32,15 @@ namespace {
 
 class NullTransformationPlugin : public TransformationPlugin {
 public:
-  NullTransformationPlugin(Transaction &transaction)
-    : TransformationPlugin(transaction, RESPONSE_TRANSFORMATION) {
-    registerHook(HOOK_SEND_RESPONSE_HEADERS);
+  NullTransformationPlugin(Transaction &transaction, TransformationPlugin::Type xformType)
+    : TransformationPlugin(transaction, xformType) {
+    registerHook((xformType == TransformationPlugin::REQUEST_TRANSFORMATION) ? 
+                 HOOK_SEND_REQUEST_HEADERS : HOOK_SEND_RESPONSE_HEADERS);
+  }
+
+  void handleSendRequestHeaders(Transaction &transaction) {
+    transaction.getServerRequest().getHeaders()["X-Content-Transformed"] = "1";
+    transaction.resume();
   }
 
   void handleSendResponseHeaders(Transaction &transaction) {
@@ -60,14 +66,19 @@ private:
 class GlobalHookPlugin : public GlobalPlugin {
 public:
   GlobalHookPlugin() {
+    registerHook(HOOK_READ_REQUEST_HEADERS_POST_REMAP);
     registerHook(HOOK_READ_RESPONSE_HEADERS);
   }
 
-  virtual void handleReadResponseHeaders(Transaction &transaction) {
-    transaction.addPlugin(new NullTransformationPlugin(transaction));
+  virtual void handleReadRequestHeadersPostRemap(Transaction &transaction) {
+    transaction.addPlugin(new NullTransformationPlugin(transaction, TransformationPlugin::REQUEST_TRANSFORMATION));
     transaction.resume();
   }
 
+  virtual void handleReadResponseHeaders(Transaction &transaction) {
+    transaction.addPlugin(new NullTransformationPlugin(transaction, TransformationPlugin::RESPONSE_TRANSFORMATION));
+    transaction.resume();
+  }
 };
 
 void TSPluginInit(int argc ATSCPPAPI_UNUSED, const char *argv[] ATSCPPAPI_UNUSED) {

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/a4860363/lib/atscppapi/src/TransformationPlugin.cc
----------------------------------------------------------------------
diff --git a/lib/atscppapi/src/TransformationPlugin.cc b/lib/atscppapi/src/TransformationPlugin.cc
index f859bb3..3e5560a 100644
--- a/lib/atscppapi/src/TransformationPlugin.cc
+++ b/lib/atscppapi/src/TransformationPlugin.cc
@@ -56,6 +56,8 @@ struct atscppapi::TransformationPluginState: noncopyable {
   // sent the input end our write complte.
   bool input_complete_dispatched_;
 
+  std::string request_xform_output_; // in case of request xform, data produced is buffered here
+
   TransformationPluginState(atscppapi::Transaction &transaction, TransformationPlugin &transformation_plugin,
       TransformationPlugin::Type type, TSHttpTxn txn)
     : vconn_(NULL), transaction_(transaction), transformation_plugin_(transformation_plugin), type_(type),
@@ -232,7 +234,7 @@ TransformationPlugin::~TransformationPlugin() {
   delete state_;
 }
 
-size_t TransformationPlugin::produce(const std::string &data) {
+size_t TransformationPlugin::doProduce(const std::string &data) {
   LOG_DEBUG("TransformationPlugin=%p tshttptxn=%p producing output with length=%ld", this, state_->txn_, data.length());
   int64_t write_length = static_cast<int64_t>(data.length());
   if (!write_length) {
@@ -281,7 +283,21 @@ size_t TransformationPlugin::produce(const std::string &data) {
   return static_cast<size_t>(bytes_written);
 }
 
+size_t TransformationPlugin::produce(const std::string &data) {
+  if (state_->type_ == REQUEST_TRANSFORMATION) {
+    state_->request_xform_output_.append(data);
+    return data.size();
+  }
+  else {
+    return doProduce(data);
+  }
+}
+
 size_t TransformationPlugin::setOutputComplete() {
+  if (state_->type_ = REQUEST_TRANSFORMATION) {
+    doProduce(state_->request_xform_output_);
+  }
+
   int connection_closed = TSVConnClosedGet(state_->vconn_);
   LOG_DEBUG("OutputComplete TransformationPlugin=%p tshttptxn=%p vconn=%p connection_closed=%d, total bytes written=%" PRId64, this, state_->txn_, state_->vconn_, connection_closed,state_->bytes_written_);
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/a4860363/lib/atscppapi/src/include/atscppapi/TransformationPlugin.h
----------------------------------------------------------------------
diff --git a/lib/atscppapi/src/include/atscppapi/TransformationPlugin.h b/lib/atscppapi/src/include/atscppapi/TransformationPlugin.h
index ef934c3..4c617f7 100644
--- a/lib/atscppapi/src/include/atscppapi/TransformationPlugin.h
+++ b/lib/atscppapi/src/include/atscppapi/TransformationPlugin.h
@@ -121,6 +121,7 @@ protected:
   TransformationPlugin(Transaction &transaction, Type type);
 private:
   TransformationPluginState *state_; /** Internal state for a TransformationPlugin */
+  size_t doProduce(const std::string &);
 };
 
 } /* atscppapi */