intercept support in atscppapi
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/b4c34003 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/b4c34003 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/b4c34003 Branch: refs/heads/master Commit: b4c34003301694dc5a26498382c4446364d4a2eb Parents: 79ae4a1 Author: Manjesh Nilange <[email protected]> Authored: Thu Mar 6 12:36:54 2014 -0800 Committer: Manjesh Nilange <[email protected]> Committed: Thu Mar 6 12:36:54 2014 -0800 ---------------------------------------------------------------------- configure.ac | 1 + lib/atscppapi/examples/Makefile.am | 3 +- lib/atscppapi/examples/intercept/Makefile.am | 24 ++++++++++ lib/atscppapi/examples/intercept/intercept.cc | 55 ++++++++++++++++++++++ lib/atscppapi/src/Makefile.am | 6 ++- lib/atscppapi/src/include/utils_internal.h | 6 +++ 6 files changed, 92 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b4c34003/configure.ac ---------------------------------------------------------------------- diff --git a/configure.ac b/configure.ac index 875f2c4..7460f7c 100644 --- a/configure.ac +++ b/configure.ac @@ -1937,6 +1937,7 @@ AC_CONFIG_FILES([ lib/atscppapi/examples/timeout_example/Makefile lib/atscppapi/examples/internal_transaction_handling/Makefile lib/atscppapi/examples/async_timer/Makefile + lib/atscppapi/examples/intercept/Makefile lib/wccp/Makefile lib/perl/Makefile lib/perl/lib/Apache/TS.pm http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b4c34003/lib/atscppapi/examples/Makefile.am ---------------------------------------------------------------------- diff --git a/lib/atscppapi/examples/Makefile.am b/lib/atscppapi/examples/Makefile.am index 23c9c70..9cbf7d6 100644 --- a/lib/atscppapi/examples/Makefile.am +++ b/lib/atscppapi/examples/Makefile.am @@ -33,4 +33,5 @@ SUBDIRS = helloworld \ gzip_transformation \ timeout_example \ internal_transaction_handling \ - async_timer \ No newline at end of file + async_timer \ + intercept \ No newline at end of file http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b4c34003/lib/atscppapi/examples/intercept/Makefile.am ---------------------------------------------------------------------- diff --git a/lib/atscppapi/examples/intercept/Makefile.am b/lib/atscppapi/examples/intercept/Makefile.am new file mode 100644 index 0000000..2400a10 --- /dev/null +++ b/lib/atscppapi/examples/intercept/Makefile.am @@ -0,0 +1,24 @@ +# +# Copyright (c) 2013 LinkedIn Corp. All rights reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of the license at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software distributed under the +# License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +# either express or implied. +# + +AM_CPPFLAGS = -I$(top_srcdir)/src/include + +target=intercept.so +pkglibdir = ${pkglibexecdir} +pkglib_LTLIBRARIES = intercept.la +intercept_la_SOURCES = intercept.cc +intercept_la_LDFLAGS = -module -avoid-version -shared -L$(top_srcdir) -latscppapi + +all: + ln -sf .libs/$(target) + +clean-local: + rm -f $(target) http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b4c34003/lib/atscppapi/examples/intercept/intercept.cc ---------------------------------------------------------------------- diff --git a/lib/atscppapi/examples/intercept/intercept.cc b/lib/atscppapi/examples/intercept/intercept.cc new file mode 100644 index 0000000..4c98782 --- /dev/null +++ b/lib/atscppapi/examples/intercept/intercept.cc @@ -0,0 +1,55 @@ +#include <atscppapi/GlobalPlugin.h> +#include <atscppapi/InterceptPlugin.h> +#include <atscppapi/PluginInit.h> + +#include <iostream> + +using namespace atscppapi; +using std::string; +using std::cout; +using std::endl; + +class Intercept : public InterceptPlugin { +public: + Intercept(Transaction &transaction) : InterceptPlugin(transaction, InterceptPlugin::SERVER_INTERCEPT) { } + void consume(const string &data, InterceptPlugin::RequestDataType type); + void handleInputComplete(); + ~Intercept() { cout << "Shutting down" << endl; } +}; + +class InterceptInstaller : public GlobalPlugin { +public: + InterceptInstaller() : GlobalPlugin(true /* ignore internal transactions */) { + GlobalPlugin::registerHook(Plugin::HOOK_READ_REQUEST_HEADERS_PRE_REMAP); + } + void handleReadRequestHeadersPreRemap(Transaction &transaction) { + transaction.addPlugin(new Intercept(transaction)); + cout << "Added intercept" << endl; + transaction.resume(); + } +}; + +void TSPluginInit(int argc, const char *argv[]) { + new InterceptInstaller(); +} + +void Intercept::consume(const string &data, InterceptPlugin::RequestDataType type) { + if (type == InterceptPlugin::REQUEST_HEADER) { + cout << "Read request header data" << endl << data; + } + else { + cout << "Read request body data" << endl << data << endl; + } +} + +void Intercept::handleInputComplete() { + cout << "Request data complete" << endl; + string response("HTTP/1.1 200 OK\r\n" + "Content-Length: 7\r\n" + "\r\n"); + InterceptPlugin::produce(response); +// sleep(5); TODO: this is a test for streaming; currently doesn't work + response = "hello\r\n"; + InterceptPlugin::produce(response); + InterceptPlugin::setOutputComplete(); +} http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b4c34003/lib/atscppapi/src/Makefile.am ---------------------------------------------------------------------- diff --git a/lib/atscppapi/src/Makefile.am b/lib/atscppapi/src/Makefile.am index 4e7d204..346bdee 100644 --- a/lib/atscppapi/src/Makefile.am +++ b/lib/atscppapi/src/Makefile.am @@ -51,7 +51,8 @@ libatscppapi_la_SOURCES = GlobalPlugin.cc \ RemapPlugin.cc \ GzipDeflateTransformation.cc \ GzipInflateTransformation.cc \ - AsyncTimer.cc + AsyncTimer.cc \ + InterceptPlugin.cc library_includedir=$(includedir)/atscppapi base_include_folder = include/atscppapi/ @@ -82,4 +83,5 @@ library_include_HEADERS = $(base_include_folder)/GlobalPlugin.h \ $(base_include_folder)/AsyncHttpFetch.h \ $(base_include_folder)/GzipDeflateTransformation.h \ $(base_include_folder)/GzipInflateTransformation.h \ - $(base_include_folder)/AsyncTimer.h + $(base_include_folder)/AsyncTimer.h \ + $(base_include_folder)/InterceptPlugin.h http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b4c34003/lib/atscppapi/src/include/utils_internal.h ---------------------------------------------------------------------- diff --git a/lib/atscppapi/src/include/utils_internal.h b/lib/atscppapi/src/include/utils_internal.h index 0eb499e..c6ead71 100644 --- a/lib/atscppapi/src/include/utils_internal.h +++ b/lib/atscppapi/src/include/utils_internal.h @@ -37,6 +37,7 @@ #include "atscppapi/utils.h" #include "atscppapi/AsyncHttpFetch.h" #include "atscppapi/Transaction.h" +#include "atscppapi/InterceptPlugin.h" namespace atscppapi { @@ -80,6 +81,11 @@ public: static const std::list<TransactionPlugin *> &getTransactionPlugins(const Transaction &transaction) { return transaction.getPlugins(); } + + static void dispatchInterceptEvent(InterceptPlugin *plugin, TSEvent event, void *edata) { + plugin->handleEvent(static_cast<int>(event), edata); + } + }; /* internal */ } /* utils */
