> On Oct 30, 2014, at 4:09 PM, sudhe...@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 <sudhe...@yahoo-inc.com> > Authored: Thu Oct 30 23:09:04 2014 +0000 > Committer: Sudheer Vinukonda <sudhe...@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; > +} >