You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by su...@apache.org on 2014/10/31 00:09:42 UTC
git commit: [TS-2682] Add per remap support for background fetch
plugin
Repository: trafficserver
Updated Branches:
refs/heads/master 589d8013e -> 42c89c713
[TS-2682] Add per remap support for background fetch plugin
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/42c89c71
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/42c89c71
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/42c89c71
Branch: refs/heads/master
Commit: 42c89c7133ee8dc8d0b3f71154f44b034c2de611
Parents: 589d801
Author: Sudheer Vinukonda <su...@yahoo-inc.com>
Authored: Thu Oct 30 23:09:04 2014 +0000
Committer: Sudheer Vinukonda <su...@yahoo-inc.com>
Committed: Thu Oct 30 23:09:04 2014 +0000
----------------------------------------------------------------------
.../background_fetch/background_fetch.cc | 124 +++++++++++++++++--
1 file changed, 114 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/42c89c71/plugins/experimental/background_fetch/background_fetch.cc
----------------------------------------------------------------------
diff --git a/plugins/experimental/background_fetch/background_fetch.cc b/plugins/experimental/background_fetch/background_fetch.cc
index f6a3e0e..440e295 100644
--- a/plugins/experimental/background_fetch/background_fetch.cc
+++ b/plugins/experimental/background_fetch/background_fetch.cc
@@ -51,12 +51,19 @@ const char PLUGIN_NAME[] = "background_fetch";
typedef std::set<std::string> stringSet;
+static int g_background_fetch_ArgIndex = 0;
static stringSet contentTypeSet;
static stringSet userAgentSet;
static stringSet clientIpSet;
+typedef struct {
+ stringSet contentTypeSet;
+ stringSet userAgentSet;
+ stringSet clientIpSet;
+} RemapInstance;
+
static
-bool read_config(char* config_file) {
+bool read_config(char* config_file, RemapInstance* ri=NULL) {
char file_path[1024];
TSFile file;
if (config_file == NULL) {
@@ -73,6 +80,17 @@ bool read_config(char* config_file) {
return 0;
}
+ stringSet* contentTypeSetP = &contentTypeSet;
+ stringSet* userAgentSetP = &userAgentSet;
+ stringSet* clientIpSetP = &clientIpSet;
+
+ if (ri) {
+ TSDebug(PLUGIN_NAME, "setting per-remap filters");
+ contentTypeSetP = &(ri->contentTypeSet);
+ userAgentSetP = &(ri->userAgentSet);
+ clientIpSetP = &(ri->clientIpSet);
+ }
+
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
while (TSfgets(file, buffer, sizeof(buffer) - 1) != NULL) {
@@ -103,13 +121,13 @@ bool read_config(char* config_file) {
if (cfg_type && cfg_value) {
if (!strcmp(cfg_type, "Content-Type")) {
TSDebug(PLUGIN_NAME, "adding content-type %s", cfg_value);
- contentTypeSet.insert(cfg_value);
+ contentTypeSetP->insert(cfg_value);
} else if (!strcmp(cfg_type, "User-Agent")) {
TSDebug(PLUGIN_NAME, "adding user-agent %s", cfg_value);
- userAgentSet.insert(cfg_value);
+ userAgentSetP->insert(cfg_value);
} else if (!strcmp(cfg_type, "Client-Ip")) {
TSDebug(PLUGIN_NAME, "adding client-ip %s", cfg_value);
- clientIpSet.insert(cfg_value);
+ clientIpSetP->insert(cfg_value);
}
}
@@ -649,7 +667,7 @@ check_hdr_configured(TSMBuffer hdr_bufp, TSMLoc req_hdrs, const char* field_type
}
static bool
-is_background_fetch_allowed(TSHttpTxn txnp)
+is_background_fetch_allowed(TSHttpTxn txnp, RemapInstance* ri=NULL)
{
bool allow_bg_fetch = true;
TSDebug(PLUGIN_NAME, "Testing: request is internal?");
@@ -657,6 +675,17 @@ is_background_fetch_allowed(TSHttpTxn txnp)
return false;
}
+ stringSet* contentTypeSetP = &contentTypeSet;
+ stringSet* userAgentSetP = &userAgentSet;
+ stringSet* clientIpSetP = &clientIpSet;
+
+ if (ri) {
+ TSDebug(PLUGIN_NAME, "setting per-remap filters");
+ contentTypeSetP = &(ri->contentTypeSet);
+ userAgentSetP = &(ri->userAgentSet);
+ clientIpSetP = &(ri->clientIpSet);
+ }
+
const sockaddr* client_ip = TSHttpTxnClientAddrGet(txnp);
char* ip_buf = NULL;
@@ -670,8 +699,8 @@ is_background_fetch_allowed(TSHttpTxn txnp)
if (ip_buf) {
TSDebug(PLUGIN_NAME,"client_ip %s", ip_buf);
- stringSet::iterator it = clientIpSet.begin();
- while(it!=clientIpSet.end()) {
+ stringSet::iterator it = clientIpSetP->begin();
+ while(it!=clientIpSetP->end()) {
if (NULL != strstr(ip_buf, (*it).c_str())) {
TSDebug(PLUGIN_NAME,"excluding bg fetch for ip %s, configured ip %s", ip_buf, (*it).c_str());
allow_bg_fetch = false;
@@ -691,12 +720,12 @@ is_background_fetch_allowed(TSHttpTxn txnp)
TSMLoc req_hdrs;
if (TSHttpTxnClientReqGet(txnp, &hdr_bufp, &req_hdrs) == TS_SUCCESS) {
- if (check_hdr_configured (hdr_bufp, req_hdrs, TS_MIME_FIELD_CONTENT_TYPE, TS_MIME_LEN_CONTENT_TYPE, &contentTypeSet)) {
+ if (check_hdr_configured (hdr_bufp, req_hdrs, TS_MIME_FIELD_CONTENT_TYPE, TS_MIME_LEN_CONTENT_TYPE, contentTypeSetP)) {
TSDebug(PLUGIN_NAME, "found content-type match");
allow_bg_fetch = false;
goto done;
}
- if (check_hdr_configured (hdr_bufp, req_hdrs, TS_MIME_FIELD_USER_AGENT, TS_MIME_LEN_USER_AGENT, &userAgentSet)) {
+ if (check_hdr_configured (hdr_bufp, req_hdrs, TS_MIME_FIELD_USER_AGENT, TS_MIME_LEN_USER_AGENT, userAgentSetP)) {
TSDebug(PLUGIN_NAME, "found user-agent match");
allow_bg_fetch = false;
goto done;
@@ -728,8 +757,9 @@ cont_handle_response(TSCont /* contp ATS_UNUSED */, TSEvent /* event ATS_UNUSED
{
// ToDo: If we want to support per-remap configurations, we have to pass along the data here
TSHttpTxn txnp = static_cast<TSHttpTxn>(edata);
+ RemapInstance *ri = static_cast<RemapInstance *> (TSHttpTxnArgGet(txnp, g_background_fetch_ArgIndex));
- if (is_background_fetch_allowed(txnp)) {
+ if (is_background_fetch_allowed(txnp, ri)) {
TSMBuffer response;
TSMLoc resp_hdr;
@@ -800,3 +830,77 @@ TSPluginInit(int argc, const char* argv[])
TSDebug(PLUGIN_NAME, "Initialized");
TSHttpHookAdd(TS_HTTP_READ_RESPONSE_HDR_HOOK, TSContCreate(cont_handle_response, NULL));
}
+
+///////////////////////////////////////////////////////////////////////////
+// Setup Remap mode
+///////////////////////////////////////////////////////////////////////////////
+// Initialize the plugin.
+//
+TSReturnCode
+TSRemapInit(TSRemapInterface *api_info, char *errbuf, int errbuf_size)
+{
+ TSDebug(PLUGIN_NAME, "background fetch remap init");
+ if (!api_info) {
+ strncpy(errbuf, "[tsremap_init] - Invalid TSRemapInterface argument", errbuf_size - 1);
+ return TS_ERROR;
+ }
+
+ if (api_info->tsremap_version < TSREMAP_VERSION) {
+ snprintf(errbuf, errbuf_size - 1, "[TSRemapInit] - Incorrect API version %ld.%ld",
+ api_info->tsremap_version >> 16, (api_info->tsremap_version & 0xffff));
+ return TS_ERROR;
+ }
+
+ TSDebug(PLUGIN_NAME, "background fetch remap is successfully initialized");
+ return TS_SUCCESS;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// We don't have any specific "instances" here, at least not yet.
+//
+TSReturnCode
+TSRemapNewInstance(int argc, char* argv[], void** ih, char* errbuf, int errbuf_size)
+{
+ RemapInstance *ri = new RemapInstance();
+ if (ri == NULL) {
+ TSError("Unable to create remap instance");
+ return TS_ERROR;
+ }
+
+ char* fileName = NULL;
+ if (0 != access(argv[1], R_OK)) {
+ fileName = argv[2];
+ TSDebug(PLUGIN_NAME, "config file %s", fileName);
+ }
+
+
+ read_config(fileName, ri);
+
+ *ih = (void*)ri;
+
+ return TS_SUCCESS;
+}
+
+void
+TSRemapDeleteInstance(void* ih)
+{
+ RemapInstance* ri = static_cast<RemapInstance*>(ih);
+ delete ri;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//// This is the main "entry" point for the plugin, called for every request.
+////
+TSRemapStatus
+TSRemapDoRemap(void* ih, TSHttpTxn txnp, TSRemapRequestInfo *rri)
+{
+ if (NULL == ih) {
+ return TSREMAP_NO_REMAP;
+ }
+
+ TSDebug(PLUGIN_NAME, "background fetch TSRemapDoRemap...");
+ TSHttpTxnArgSet(txnp, g_background_fetch_ArgIndex, static_cast<void *> (ih));
+ TSHttpTxnHookAdd(txnp, TS_HTTP_READ_RESPONSE_HDR_HOOK, TSContCreate(cont_handle_response, NULL));
+
+ return TSREMAP_NO_REMAP;
+}
Re: git commit: [TS-2682] Add per remap support for background fetch plugin
Posted by James Peach <jp...@apache.org>.
> On Oct 30, 2014, at 4:09 PM, sudheerv@apache.org wrote:
>
> Repository: trafficserver
> Updated Branches:
> refs/heads/master 589d8013e -> 42c89c713
>
>
> [TS-2682] Add per remap support for background fetch plugin
>
>
> Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
> Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/42c89c71
> Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/42c89c71
> Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/42c89c71
>
> Branch: refs/heads/master
> Commit: 42c89c7133ee8dc8d0b3f71154f44b034c2de611
> Parents: 589d801
> Author: Sudheer Vinukonda <su...@yahoo-inc.com>
> Authored: Thu Oct 30 23:09:04 2014 +0000
> Committer: Sudheer Vinukonda <su...@yahoo-inc.com>
> Committed: Thu Oct 30 23:09:04 2014 +0000
>
> ----------------------------------------------------------------------
> .../background_fetch/background_fetch.cc | 124 +++++++++++++++++--
> 1 file changed, 114 insertions(+), 10 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/42c89c71/plugins/experimental/background_fetch/background_fetch.cc
> ----------------------------------------------------------------------
> diff --git a/plugins/experimental/background_fetch/background_fetch.cc b/plugins/experimental/background_fetch/background_fetch.cc
> index f6a3e0e..440e295 100644
> --- a/plugins/experimental/background_fetch/background_fetch.cc
> +++ b/plugins/experimental/background_fetch/background_fetch.cc
> @@ -51,12 +51,19 @@ const char PLUGIN_NAME[] = "background_fetch";
>
> typedef std::set<std::string> stringSet;
>
> +static int g_background_fetch_ArgIndex = 0;
> static stringSet contentTypeSet;
> static stringSet userAgentSet;
> static stringSet clientIpSet;
>
> +typedef struct {
> + stringSet contentTypeSet;
> + stringSet userAgentSet;
> + stringSet clientIpSet;
> +} RemapInstance;
> +
> static
> -bool read_config(char* config_file) {
> +bool read_config(char* config_file, RemapInstance* ri=NULL) {
> char file_path[1024];
> TSFile file;
> if (config_file == NULL) {
> @@ -73,6 +80,17 @@ bool read_config(char* config_file) {
> return 0;
> }
>
> + stringSet* contentTypeSetP = &contentTypeSet;
> + stringSet* userAgentSetP = &userAgentSet;
> + stringSet* clientIpSetP = &clientIpSet;
> +
> + if (ri) {
> + TSDebug(PLUGIN_NAME, "setting per-remap filters");
> + contentTypeSetP = &(ri->contentTypeSet);
> + userAgentSetP = &(ri->userAgentSet);
> + clientIpSetP = &(ri->clientIpSet);
> + }
This is really ugly. You should just create another RemapInstance when the global plugin loads. Then you have the same code path everywhere.
> +
> char buffer[1024];
> memset(buffer, 0, sizeof(buffer));
> while (TSfgets(file, buffer, sizeof(buffer) - 1) != NULL) {
> @@ -103,13 +121,13 @@ bool read_config(char* config_file) {
> if (cfg_type && cfg_value) {
> if (!strcmp(cfg_type, "Content-Type")) {
> TSDebug(PLUGIN_NAME, "adding content-type %s", cfg_value);
> - contentTypeSet.insert(cfg_value);
> + contentTypeSetP->insert(cfg_value);
> } else if (!strcmp(cfg_type, "User-Agent")) {
> TSDebug(PLUGIN_NAME, "adding user-agent %s", cfg_value);
> - userAgentSet.insert(cfg_value);
> + userAgentSetP->insert(cfg_value);
> } else if (!strcmp(cfg_type, "Client-Ip")) {
> TSDebug(PLUGIN_NAME, "adding client-ip %s", cfg_value);
> - clientIpSet.insert(cfg_value);
> + clientIpSetP->insert(cfg_value);
> }
> }
>
> @@ -649,7 +667,7 @@ check_hdr_configured(TSMBuffer hdr_bufp, TSMLoc req_hdrs, const char* field_type
> }
>
> static bool
> -is_background_fetch_allowed(TSHttpTxn txnp)
> +is_background_fetch_allowed(TSHttpTxn txnp, RemapInstance* ri=NULL)
> {
> bool allow_bg_fetch = true;
> TSDebug(PLUGIN_NAME, "Testing: request is internal?");
> @@ -657,6 +675,17 @@ is_background_fetch_allowed(TSHttpTxn txnp)
> return false;
> }
>
> + stringSet* contentTypeSetP = &contentTypeSet;
> + stringSet* userAgentSetP = &userAgentSet;
> + stringSet* clientIpSetP = &clientIpSet;
> +
> + if (ri) {
> + TSDebug(PLUGIN_NAME, "setting per-remap filters");
> + contentTypeSetP = &(ri->contentTypeSet);
> + userAgentSetP = &(ri->userAgentSet);
> + clientIpSetP = &(ri->clientIpSet);
> + }
> +
> const sockaddr* client_ip = TSHttpTxnClientAddrGet(txnp);
> char* ip_buf = NULL;
>
> @@ -670,8 +699,8 @@ is_background_fetch_allowed(TSHttpTxn txnp)
>
> if (ip_buf) {
> TSDebug(PLUGIN_NAME,"client_ip %s", ip_buf);
> - stringSet::iterator it = clientIpSet.begin();
> - while(it!=clientIpSet.end()) {
> + stringSet::iterator it = clientIpSetP->begin();
> + while(it!=clientIpSetP->end()) {
> if (NULL != strstr(ip_buf, (*it).c_str())) {
> TSDebug(PLUGIN_NAME,"excluding bg fetch for ip %s, configured ip %s", ip_buf, (*it).c_str());
> allow_bg_fetch = false;
> @@ -691,12 +720,12 @@ is_background_fetch_allowed(TSHttpTxn txnp)
> TSMLoc req_hdrs;
>
> if (TSHttpTxnClientReqGet(txnp, &hdr_bufp, &req_hdrs) == TS_SUCCESS) {
> - if (check_hdr_configured (hdr_bufp, req_hdrs, TS_MIME_FIELD_CONTENT_TYPE, TS_MIME_LEN_CONTENT_TYPE, &contentTypeSet)) {
> + if (check_hdr_configured (hdr_bufp, req_hdrs, TS_MIME_FIELD_CONTENT_TYPE, TS_MIME_LEN_CONTENT_TYPE, contentTypeSetP)) {
> TSDebug(PLUGIN_NAME, "found content-type match");
> allow_bg_fetch = false;
> goto done;
> }
> - if (check_hdr_configured (hdr_bufp, req_hdrs, TS_MIME_FIELD_USER_AGENT, TS_MIME_LEN_USER_AGENT, &userAgentSet)) {
> + if (check_hdr_configured (hdr_bufp, req_hdrs, TS_MIME_FIELD_USER_AGENT, TS_MIME_LEN_USER_AGENT, userAgentSetP)) {
> TSDebug(PLUGIN_NAME, "found user-agent match");
> allow_bg_fetch = false;
> goto done;
> @@ -728,8 +757,9 @@ cont_handle_response(TSCont /* contp ATS_UNUSED */, TSEvent /* event ATS_UNUSED
> {
> // ToDo: If we want to support per-remap configurations, we have to pass along the data here
> TSHttpTxn txnp = static_cast<TSHttpTxn>(edata);
> + RemapInstance *ri = static_cast<RemapInstance *> (TSHttpTxnArgGet(txnp, g_background_fetch_ArgIndex));
>
> - if (is_background_fetch_allowed(txnp)) {
> + if (is_background_fetch_allowed(txnp, ri)) {
> TSMBuffer response;
> TSMLoc resp_hdr;
>
> @@ -800,3 +830,77 @@ TSPluginInit(int argc, const char* argv[])
> TSDebug(PLUGIN_NAME, "Initialized");
> TSHttpHookAdd(TS_HTTP_READ_RESPONSE_HDR_HOOK, TSContCreate(cont_handle_response, NULL));
> }
> +
> +///////////////////////////////////////////////////////////////////////////
> +// Setup Remap mode
> +///////////////////////////////////////////////////////////////////////////////
> +// Initialize the plugin.
> +//
> +TSReturnCode
> +TSRemapInit(TSRemapInterface *api_info, char *errbuf, int errbuf_size)
> +{
> + TSDebug(PLUGIN_NAME, "background fetch remap init");
> + if (!api_info) {
> + strncpy(errbuf, "[tsremap_init] - Invalid TSRemapInterface argument", errbuf_size - 1);
> + return TS_ERROR;
> + }
> +
> + if (api_info->tsremap_version < TSREMAP_VERSION) {
> + snprintf(errbuf, errbuf_size - 1, "[TSRemapInit] - Incorrect API version %ld.%ld",
> + api_info->tsremap_version >> 16, (api_info->tsremap_version & 0xffff));
> + return TS_ERROR;
> + }
> +
> + TSDebug(PLUGIN_NAME, "background fetch remap is successfully initialized");
> + return TS_SUCCESS;
> +}
> +
> +///////////////////////////////////////////////////////////////////////////////
> +// We don't have any specific "instances" here, at least not yet.
> +//
> +TSReturnCode
> +TSRemapNewInstance(int argc, char* argv[], void** ih, char* errbuf, int errbuf_size)
> +{
> + RemapInstance *ri = new RemapInstance();
> + if (ri == NULL) {
> + TSError("Unable to create remap instance");
> + return TS_ERROR;
> + }
> +
> + char* fileName = NULL;
> + if (0 != access(argv[1], R_OK)) {
> + fileName = argv[2];
> + TSDebug(PLUGIN_NAME, "config file %s", fileName);
> + }
Huh? What is this doing?
> +
> +
> + read_config(fileName, ri);
> +
> + *ih = (void*)ri;
> +
> + return TS_SUCCESS;
> +}
> +
> +void
> +TSRemapDeleteInstance(void* ih)
> +{
> + RemapInstance* ri = static_cast<RemapInstance*>(ih);
> + delete ri;
> +}
> +
> +///////////////////////////////////////////////////////////////////////////////
> +//// This is the main "entry" point for the plugin, called for every request.
> +////
> +TSRemapStatus
> +TSRemapDoRemap(void* ih, TSHttpTxn txnp, TSRemapRequestInfo *rri)
> +{
> + if (NULL == ih) {
> + return TSREMAP_NO_REMAP;
> + }
> +
> + TSDebug(PLUGIN_NAME, "background fetch TSRemapDoRemap...");
> + TSHttpTxnArgSet(txnp, g_background_fetch_ArgIndex, static_cast<void *> (ih));
Where is g_background_fetch_ArgIndex reserved? Why do you need an arg rather than continuation data?
> + TSHttpTxnHookAdd(txnp, TS_HTTP_READ_RESPONSE_HDR_HOOK, TSContCreate(cont_handle_response, NULL));
> +
> + return TSREMAP_NO_REMAP;
> +}
>
Re: git commit: [TS-2682] Add per remap support for background fetch plugin
Posted by James Peach <jp...@apache.org>.
> On Oct 30, 2014, at 4:09 PM, sudheerv@apache.org wrote:
>
> Repository: trafficserver
> Updated Branches:
> refs/heads/master 589d8013e -> 42c89c713
>
>
> [TS-2682] Add per remap support for background fetch plugin
>
>
> Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
> Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/42c89c71
> Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/42c89c71
> Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/42c89c71
>
> Branch: refs/heads/master
> Commit: 42c89c7133ee8dc8d0b3f71154f44b034c2de611
> Parents: 589d801
> Author: Sudheer Vinukonda <su...@yahoo-inc.com>
> Authored: Thu Oct 30 23:09:04 2014 +0000
> Committer: Sudheer Vinukonda <su...@yahoo-inc.com>
> Committed: Thu Oct 30 23:09:04 2014 +0000
>
> ----------------------------------------------------------------------
> .../background_fetch/background_fetch.cc | 124 +++++++++++++++++--
> 1 file changed, 114 insertions(+), 10 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/42c89c71/plugins/experimental/background_fetch/background_fetch.cc
> ----------------------------------------------------------------------
> diff --git a/plugins/experimental/background_fetch/background_fetch.cc b/plugins/experimental/background_fetch/background_fetch.cc
> index f6a3e0e..440e295 100644
> --- a/plugins/experimental/background_fetch/background_fetch.cc
> +++ b/plugins/experimental/background_fetch/background_fetch.cc
> @@ -51,12 +51,19 @@ const char PLUGIN_NAME[] = "background_fetch";
>
> typedef std::set<std::string> stringSet;
>
> +static int g_background_fetch_ArgIndex = 0;
> static stringSet contentTypeSet;
> static stringSet userAgentSet;
> static stringSet clientIpSet;
>
> +typedef struct {
> + stringSet contentTypeSet;
> + stringSet userAgentSet;
> + stringSet clientIpSet;
> +} RemapInstance;
> +
> static
> -bool read_config(char* config_file) {
> +bool read_config(char* config_file, RemapInstance* ri=NULL) {
> char file_path[1024];
> TSFile file;
> if (config_file == NULL) {
> @@ -73,6 +80,17 @@ bool read_config(char* config_file) {
> return 0;
> }
>
> + stringSet* contentTypeSetP = &contentTypeSet;
> + stringSet* userAgentSetP = &userAgentSet;
> + stringSet* clientIpSetP = &clientIpSet;
> +
> + if (ri) {
> + TSDebug(PLUGIN_NAME, "setting per-remap filters");
> + contentTypeSetP = &(ri->contentTypeSet);
> + userAgentSetP = &(ri->userAgentSet);
> + clientIpSetP = &(ri->clientIpSet);
> + }
This is really ugly. You should just create another RemapInstance when the global plugin loads. Then you have the same code path everywhere.
> +
> char buffer[1024];
> memset(buffer, 0, sizeof(buffer));
> while (TSfgets(file, buffer, sizeof(buffer) - 1) != NULL) {
> @@ -103,13 +121,13 @@ bool read_config(char* config_file) {
> if (cfg_type && cfg_value) {
> if (!strcmp(cfg_type, "Content-Type")) {
> TSDebug(PLUGIN_NAME, "adding content-type %s", cfg_value);
> - contentTypeSet.insert(cfg_value);
> + contentTypeSetP->insert(cfg_value);
> } else if (!strcmp(cfg_type, "User-Agent")) {
> TSDebug(PLUGIN_NAME, "adding user-agent %s", cfg_value);
> - userAgentSet.insert(cfg_value);
> + userAgentSetP->insert(cfg_value);
> } else if (!strcmp(cfg_type, "Client-Ip")) {
> TSDebug(PLUGIN_NAME, "adding client-ip %s", cfg_value);
> - clientIpSet.insert(cfg_value);
> + clientIpSetP->insert(cfg_value);
> }
> }
>
> @@ -649,7 +667,7 @@ check_hdr_configured(TSMBuffer hdr_bufp, TSMLoc req_hdrs, const char* field_type
> }
>
> static bool
> -is_background_fetch_allowed(TSHttpTxn txnp)
> +is_background_fetch_allowed(TSHttpTxn txnp, RemapInstance* ri=NULL)
> {
> bool allow_bg_fetch = true;
> TSDebug(PLUGIN_NAME, "Testing: request is internal?");
> @@ -657,6 +675,17 @@ is_background_fetch_allowed(TSHttpTxn txnp)
> return false;
> }
>
> + stringSet* contentTypeSetP = &contentTypeSet;
> + stringSet* userAgentSetP = &userAgentSet;
> + stringSet* clientIpSetP = &clientIpSet;
> +
> + if (ri) {
> + TSDebug(PLUGIN_NAME, "setting per-remap filters");
> + contentTypeSetP = &(ri->contentTypeSet);
> + userAgentSetP = &(ri->userAgentSet);
> + clientIpSetP = &(ri->clientIpSet);
> + }
> +
> const sockaddr* client_ip = TSHttpTxnClientAddrGet(txnp);
> char* ip_buf = NULL;
>
> @@ -670,8 +699,8 @@ is_background_fetch_allowed(TSHttpTxn txnp)
>
> if (ip_buf) {
> TSDebug(PLUGIN_NAME,"client_ip %s", ip_buf);
> - stringSet::iterator it = clientIpSet.begin();
> - while(it!=clientIpSet.end()) {
> + stringSet::iterator it = clientIpSetP->begin();
> + while(it!=clientIpSetP->end()) {
> if (NULL != strstr(ip_buf, (*it).c_str())) {
> TSDebug(PLUGIN_NAME,"excluding bg fetch for ip %s, configured ip %s", ip_buf, (*it).c_str());
> allow_bg_fetch = false;
> @@ -691,12 +720,12 @@ is_background_fetch_allowed(TSHttpTxn txnp)
> TSMLoc req_hdrs;
>
> if (TSHttpTxnClientReqGet(txnp, &hdr_bufp, &req_hdrs) == TS_SUCCESS) {
> - if (check_hdr_configured (hdr_bufp, req_hdrs, TS_MIME_FIELD_CONTENT_TYPE, TS_MIME_LEN_CONTENT_TYPE, &contentTypeSet)) {
> + if (check_hdr_configured (hdr_bufp, req_hdrs, TS_MIME_FIELD_CONTENT_TYPE, TS_MIME_LEN_CONTENT_TYPE, contentTypeSetP)) {
> TSDebug(PLUGIN_NAME, "found content-type match");
> allow_bg_fetch = false;
> goto done;
> }
> - if (check_hdr_configured (hdr_bufp, req_hdrs, TS_MIME_FIELD_USER_AGENT, TS_MIME_LEN_USER_AGENT, &userAgentSet)) {
> + if (check_hdr_configured (hdr_bufp, req_hdrs, TS_MIME_FIELD_USER_AGENT, TS_MIME_LEN_USER_AGENT, userAgentSetP)) {
> TSDebug(PLUGIN_NAME, "found user-agent match");
> allow_bg_fetch = false;
> goto done;
> @@ -728,8 +757,9 @@ cont_handle_response(TSCont /* contp ATS_UNUSED */, TSEvent /* event ATS_UNUSED
> {
> // ToDo: If we want to support per-remap configurations, we have to pass along the data here
> TSHttpTxn txnp = static_cast<TSHttpTxn>(edata);
> + RemapInstance *ri = static_cast<RemapInstance *> (TSHttpTxnArgGet(txnp, g_background_fetch_ArgIndex));
>
> - if (is_background_fetch_allowed(txnp)) {
> + if (is_background_fetch_allowed(txnp, ri)) {
> TSMBuffer response;
> TSMLoc resp_hdr;
>
> @@ -800,3 +830,77 @@ TSPluginInit(int argc, const char* argv[])
> TSDebug(PLUGIN_NAME, "Initialized");
> TSHttpHookAdd(TS_HTTP_READ_RESPONSE_HDR_HOOK, TSContCreate(cont_handle_response, NULL));
> }
> +
> +///////////////////////////////////////////////////////////////////////////
> +// Setup Remap mode
> +///////////////////////////////////////////////////////////////////////////////
> +// Initialize the plugin.
> +//
> +TSReturnCode
> +TSRemapInit(TSRemapInterface *api_info, char *errbuf, int errbuf_size)
> +{
> + TSDebug(PLUGIN_NAME, "background fetch remap init");
> + if (!api_info) {
> + strncpy(errbuf, "[tsremap_init] - Invalid TSRemapInterface argument", errbuf_size - 1);
> + return TS_ERROR;
> + }
> +
> + if (api_info->tsremap_version < TSREMAP_VERSION) {
> + snprintf(errbuf, errbuf_size - 1, "[TSRemapInit] - Incorrect API version %ld.%ld",
> + api_info->tsremap_version >> 16, (api_info->tsremap_version & 0xffff));
> + return TS_ERROR;
> + }
> +
> + TSDebug(PLUGIN_NAME, "background fetch remap is successfully initialized");
> + return TS_SUCCESS;
> +}
> +
> +///////////////////////////////////////////////////////////////////////////////
> +// We don't have any specific "instances" here, at least not yet.
> +//
> +TSReturnCode
> +TSRemapNewInstance(int argc, char* argv[], void** ih, char* errbuf, int errbuf_size)
> +{
> + RemapInstance *ri = new RemapInstance();
> + if (ri == NULL) {
> + TSError("Unable to create remap instance");
> + return TS_ERROR;
> + }
> +
> + char* fileName = NULL;
> + if (0 != access(argv[1], R_OK)) {
> + fileName = argv[2];
> + TSDebug(PLUGIN_NAME, "config file %s", fileName);
> + }
Huh? What is this doing?
> +
> +
> + read_config(fileName, ri);
> +
> + *ih = (void*)ri;
> +
> + return TS_SUCCESS;
> +}
> +
> +void
> +TSRemapDeleteInstance(void* ih)
> +{
> + RemapInstance* ri = static_cast<RemapInstance*>(ih);
> + delete ri;
> +}
> +
> +///////////////////////////////////////////////////////////////////////////////
> +//// This is the main "entry" point for the plugin, called for every request.
> +////
> +TSRemapStatus
> +TSRemapDoRemap(void* ih, TSHttpTxn txnp, TSRemapRequestInfo *rri)
> +{
> + if (NULL == ih) {
> + return TSREMAP_NO_REMAP;
> + }
> +
> + TSDebug(PLUGIN_NAME, "background fetch TSRemapDoRemap...");
> + TSHttpTxnArgSet(txnp, g_background_fetch_ArgIndex, static_cast<void *> (ih));
Where is g_background_fetch_ArgIndex reserved? Why do you need an arg rather than continuation data?
> + TSHttpTxnHookAdd(txnp, TS_HTTP_READ_RESPONSE_HDR_HOOK, TSContCreate(cont_handle_response, NULL));
> +
> + return TSREMAP_NO_REMAP;
> +}
>