Repository: trafficserver Updated Branches: refs/heads/master 9d12a5db7 -> 3fb05190f
[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/master Commit: a4860363a94e7bb51e5de651c5ea07a804915777 Parents: 76a0777 Author: Brian Geffon <bri...@apache.org> Authored: Wed Apr 16 13:13:32 2014 -0700 Committer: Brian Geffon <bri...@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 */