blob: 6d06b45266dfa9dae2bfdd28715acb8ea47b26bd [file] [log] [blame]
/** @file
Information about remap plugins.
@section license License
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.
*/
#pragma once
#include <string>
#include <tuple>
#include "tscore/ink_platform.h"
#include "ts/apidefs.h"
#include "ts/remap.h"
#include "PluginDso.h"
class url_mapping;
extern thread_local PluginThreadContext *pluginThreadContext;
static constexpr const char *const TSREMAP_FUNCNAME_INIT = "TSRemapInit";
static constexpr const char *const TSREMAP_FUNCNAME_PRE_CONFIG_RELOAD = "TSRemapPreConfigReload";
static constexpr const char *const TSREMAP_FUNCNAME_POST_CONFIG_RELOAD = "TSRemapPostConfigReload";
static constexpr const char *const TSREMAP_FUNCNAME_DONE = "TSRemapDone";
static constexpr const char *const TSREMAP_FUNCNAME_NEW_INSTANCE = "TSRemapNewInstance";
static constexpr const char *const TSREMAP_FUNCNAME_DELETE_INSTANCE = "TSRemapDeleteInstance";
static constexpr const char *const TSREMAP_FUNCNAME_DO_REMAP = "TSRemapDoRemap";
static constexpr const char *const TSREMAP_FUNCNAME_OS_RESPONSE = "TSRemapOSResponse";
/**
* Holds information for a remap plugin, remap specific callback entry points for plugin init/done and instance init/done, do_remap,
* origin server response,
*/
class RemapPluginInfo : public PluginDso
{
public:
/// Initialization function, called on library load.
using Init_F = TSReturnCode(TSRemapInterface *api_info, char *errbuf, int errbuf_size);
/// Reload function, called to inform the plugin that configuration is going to be reloaded.
using PreReload_F = void();
/// Reload function, called to inform the plugin that configuration is done reloading.
using PostReload_F = void(TSRemapReloadStatus);
/// Called when remapping for a transaction has finished.
using Done_F = void();
/// Create an rule instance.
using New_Instance_F = TSReturnCode(int argc, char *argv[], void **ih, char *errbuf, int errbuf_size);
/// Delete a rule instance.
using Delete_Instance_F = void(void *ih);
/// Perform remap.
using Do_Remap_F = TSRemapStatus(void *ih, TSHttpTxn rh, TSRemapRequestInfo *rri);
/// I have no idea what this is for.
using OS_Response_F = void(void *ih, TSHttpTxn rh, int os_response_type);
void *dl_handle = nullptr; /* "handle" for the dynamic library */
Init_F *init_cb = nullptr;
PreReload_F *pre_config_reload_cb = nullptr;
PostReload_F *post_config_reload_cb = nullptr;
Done_F *done_cb = nullptr;
New_Instance_F *new_instance_cb = nullptr;
Delete_Instance_F *delete_instance_cb = nullptr;
Do_Remap_F *do_remap_cb = nullptr;
OS_Response_F *os_response_cb = nullptr;
RemapPluginInfo(const fs::path &configPath, const fs::path &effectivePath, const fs::path &runtimePath);
~RemapPluginInfo();
/* Overload to add / execute remap plugin specific tasks during the plugin loading */
virtual bool load(std::string &error);
/* Used by the factory to invoke callbacks during plugin load, init and unload */
virtual bool init(std::string &error);
virtual void done(void);
/* Used by the facility that handles remap plugin instances to invoke callbacks per plugin instance */
bool initInstance(int argc, char **argv, void **ih, std::string &error);
void doneInstance(void *ih);
/* Used by the other parts of the traffic server core while handling requests */
TSRemapStatus doRemap(void *ih, TSHttpTxn rh, TSRemapRequestInfo *rri);
void osResponse(void *ih, TSHttpTxn rh, int os_response_type);
/* Used by traffic server core to indicate configuration reload */
virtual void indicatePreReload();
virtual void indicatePostReload(TSRemapReloadStatus reloadStatus);
protected:
/* Utility to be used only with unit testing */
std::string missingRequiredSymbolError(const std::string &pluginName, const char *required, const char *requiring = nullptr);
template <class T> T *getFunctionSymbol(const char *symbol);
void setPluginContext();
void resetPluginContext();
static constexpr const char *const _tag = "plugin_remap"; /** @brief log tag used by this class */
PluginThreadContext *_tempContext = nullptr;
};
/**
* struct host_hdr_info;
* Used to store info about host header
**/
struct host_hdr_info {
const char *request_host;
int host_len;
int request_port;
};