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 */