blob: fcddf41ec1a5beabd3d8e34bb671fe7d5cfddb18 [file] [log] [blame]
/**
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you 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.
See the License for the specific language governing permissions and
limitations under the License.
*/
/**
* @file Plugin.h
*
* @brief Contains the base interface used in creating Global and Transaction plugins.
* \note This interface can never be implemented directly, it should be implemented
* through extending GlobalPlugin, TransactionPlugin, or TransformationPlugin.
*/
// The C++ Plugin API is deprecated in ATS 10, and will be removed in ATS 11.
#pragma once
#include "tscpp/api/Request.h"
#include "tscpp/api/Transaction.h"
#include "tscpp/api/noncopyable.h"
namespace atscppapi
{
/**
* @brief The base interface used when creating a Plugin.
*
* \note This interface can never be implemented directly, it should be implemented
* through extending GlobalPlugin, TransactionPlugin, or TransformationPlugin.
*
* @see TransactionPlugin
* @see GlobalPlugin
* @see TransformationPlugin
*/
class Plugin : noncopyable
{
public:
/**
* A enumeration of the available types of Hooks. These are used with GlobalPlugin::registerHook()
* and TransactionPlugin::registerHook().
*/
enum HookType {
HOOK_READ_REQUEST_HEADERS_PRE_REMAP = 0, /**< This hook will be fired before remap has occurred. */
HOOK_READ_REQUEST_HEADERS_POST_REMAP, /**< This hook will be fired directly after remap has occurred. */
HOOK_SEND_REQUEST_HEADERS, /**< This hook will be fired right before request headers are sent to the origin */
HOOK_READ_RESPONSE_HEADERS, /**< This hook will be fired right after response headers have been read from the origin */
HOOK_SEND_RESPONSE_HEADERS, /**< This hook will be fired right before the response headers are sent to the client */
HOOK_OS_DNS, /**< This hook will be fired right after the OS DNS lookup */
HOOK_READ_REQUEST_HEADERS, /**< This hook will be fired after the request is read. */
HOOK_READ_CACHE_HEADERS, /**< This hook will be fired after the CACHE hdrs. */
HOOK_CACHE_LOOKUP_COMPLETE, /**< This hook will be fired after cache lookup complete. */
HOOK_TXN_CLOSE, /**< This hook will be fired after send response headers, only for TransactionPlugins::registerHook()!. */
HOOK_SELECT_ALT /**< This hook will be fired after select alt. */
};
/**
* This method must be implemented when you hook HOOK_READ_REQUEST_HEADERS_PRE_REMAP
*/
virtual void
handleReadRequestHeadersPreRemap(Transaction &transaction)
{
transaction.resume();
};
/**
* This method must be implemented when you hook HOOK_READ_REQUEST_HEADERS_POST_REMAP
*/
virtual void
handleReadRequestHeadersPostRemap(Transaction &transaction)
{
transaction.resume();
};
/**
* This method must be implemented when you hook HOOK_SEND_REQUEST_HEADERS
*/
virtual void
handleSendRequestHeaders(Transaction &transaction)
{
transaction.resume();
};
/**
* This method must be implemented when you hook HOOK_READ_RESPONSE_HEADERS
*/
virtual void
handleReadResponseHeaders(Transaction &transaction)
{
transaction.resume();
};
/**
* This method must be implemented when you hook HOOK_SEND_RESPONSE_HEADERS
*/
virtual void
handleSendResponseHeaders(Transaction &transaction)
{
transaction.resume();
};
/**
* This method must be implemented when you hook HOOK_OS_DNS
*/
virtual void
handleOsDns(Transaction &transaction)
{
transaction.resume();
};
/**
* This method must be implemented when you hook HOOK_READ_REQUEST_HEADERS
*/
virtual void
handleReadRequestHeaders(Transaction &transaction)
{
transaction.resume();
};
/**
* This method must be implemented when you hook HOOK_READ_CACHE_HEADERS
*/
virtual void
handleReadCacheHeaders(Transaction &transaction)
{
transaction.resume();
};
/**
* This method must be implemented when you hook HOOK_CACHE_LOOKUP_COMPLETE
*/
virtual void
handleReadCacheLookupComplete(Transaction &transaction)
{
transaction.resume();
};
/**
* This method must be implemented when you hook HOOK_TXN_CLOSE
*/
virtual void
handleTxnClose(Transaction &transaction)
{
transaction.resume();
};
/**
* This method must be implemented when you hook HOOK_SELECT_ALT
*/
virtual void handleSelectAlt(const Request & /* clientReq ATS_UNUSED */, const Request & /* cachedReq ATS_UNUSED */,
const Response & /* cachedResp ATS_UNUSED */) {};
virtual ~Plugin(){};
protected:
/**
* \note This interface can never be implemented directly, it should be implemented
* through extending GlobalPlugin, TransactionPlugin, or TransformationPlugin.
*
* @private
*/
Plugin(){};
};
/**< Human readable strings for each HookType, you can access them as HOOK_TYPE_STRINGS[HOOK_OS_DNS] for example. */
extern const std::string HOOK_TYPE_STRINGS[];
bool RegisterGlobalPlugin(const char *name, const char *vendor, const char *email);
inline bool
RegisterGlobalPlugin(std::string const &name, std::string const &vendor, std::string const &email)
{
return RegisterGlobalPlugin(name.c_str(), vendor.c_str(), email.c_str());
}
} // namespace atscppapi