Repository: trafficserver Updated Branches: refs/heads/master 44a826fe0 -> 558345f21
TS-2623 Also fix the indentation to follow our coding standards. Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/558345f2 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/558345f2 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/558345f2 Branch: refs/heads/master Commit: 558345f212bedcc467f7934da530b544e6a60c0a Parents: 44a826f Author: Leif Hedstrom <zw...@apache.org> Authored: Tue Mar 11 19:53:22 2014 -0600 Committer: Leif Hedstrom <zw...@apache.org> Committed: Tue Mar 11 19:53:22 2014 -0600 ---------------------------------------------------------------------- plugins/cacheurl/cacheurl.cc | 699 +++++++++++++++++++------------------- 1 file changed, 355 insertions(+), 344 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/558345f2/plugins/cacheurl/cacheurl.cc ---------------------------------------------------------------------- diff --git a/plugins/cacheurl/cacheurl.cc b/plugins/cacheurl/cacheurl.cc index bf7bfe0..c32d52d 100644 --- a/plugins/cacheurl/cacheurl.cc +++ b/plugins/cacheurl/cacheurl.cc @@ -17,7 +17,7 @@ * under the License. */ -/* cacheurl.c - Plugin to modify the URL used as a cache key for certain +/* cacheurl.cc - Plugin to modify the URL used as a cache key for certain * requests, without modifying the URL used for actually fetching data from * the origin server. */ @@ -43,392 +43,403 @@ #define OVECOUNT 30 #define PLUGIN_NAME "cacheurl" -struct regex_info { - pcre *re; /* Compiled regular expression */ - int tokcount; /* Token count */ - char *pattern; /* Pattern string */ - char *replacement; /* Replacement string */ - int *tokens; /* Array of $x token values */ - int *tokenoffset; /* Array of $x token offsets */ +struct regex_info +{ + pcre *re; /* Compiled regular expression */ + int tokcount; /* Token count */ + char *pattern; /* Pattern string */ + char *replacement; /* Replacement string */ + int *tokens; /* Array of $x token values */ + int *tokenoffset; /* Array of $x token offsets */ }; -struct pr_list { - std::vector <regex_info *> pr; - - pr_list() { - } - - ~pr_list() { - for (std::vector<regex_info *>::iterator info = this->pr.begin(); info != this->pr.end(); ++info) { - TSfree((*info)->tokens); - TSfree((*info)->tokenoffset); - pcre_free((*info)->re); - TSfree(*info); - } +struct pr_list +{ + std::vector<regex_info*>pr; + + pr_list() + { + } + + ~pr_list() + { + for (std::vector < regex_info * >::iterator info = this->pr.begin(); info != this->pr.end(); ++info) { + TSfree((*info)->tokens); + TSfree((*info)->tokenoffset); + pcre_free((*info)->re); + TSfree(*info); } + } }; -static int regex_substitute(char **buf, char *str, regex_info *info) { - int matchcount; - int ovector[OVECOUNT]; /* Locations of matches in regex */ - - int replacelen; /* length of replacement string */ - int i; - int offset; - int prev; - - /* Perform the regex matching */ - matchcount = pcre_exec(info->re, NULL, str, strlen(str), 0, 0, ovector, - OVECOUNT); - if (matchcount < 0) { - switch (matchcount) { - case PCRE_ERROR_NOMATCH: - break; - default: - TSError("[%s] Matching error: %d\n", PLUGIN_NAME, matchcount); - break; - } - return 0; - } - - /* Verify the replacement has the right number of matching groups */ - for (i=0; i<info->tokcount; i++) { - if (info->tokens[i] >= matchcount) { - TSError("[%s] Invalid reference int replacement: $%d\n", PLUGIN_NAME, info->tokens[i]); - return 0; - } - } - - /* malloc the replacement string */ - replacelen = strlen(info->replacement); - replacelen -= info->tokcount * 2; /* Subtract $1, $2 etc... */ - for (i=0; i<info->tokcount; i++) { - replacelen += (ovector[info->tokens[i]*2+1] - - ovector[info->tokens[i]*2]); +static int +regex_substitute(char **buf, char *str, regex_info * info) +{ + int matchcount; + int ovector[OVECOUNT]; /* Locations of matches in regex */ + + int replacelen; /* length of replacement string */ + int i; + int offset; + int prev; + + /* Perform the regex matching */ + matchcount = pcre_exec(info->re, NULL, str, strlen(str), 0, 0, ovector, OVECOUNT); + if (matchcount < 0) { + switch (matchcount) { + case PCRE_ERROR_NOMATCH: + break; + default: + TSError("[%s] Matching error: %d\n", PLUGIN_NAME, matchcount); + break; } - replacelen++; /* Null terminator */ - *buf = (char *)TSmalloc(replacelen); - - /* perform string replacement */ - offset = 0; /* Where we are adding new data in the string */ - prev = 0; - for (i=0; i<info->tokcount; i++) { - memcpy(*buf + offset, info->replacement + prev, - info->tokenoffset[i] - prev); - offset += (info->tokenoffset[i] - prev); - prev = info->tokenoffset[i] + 2; - - memcpy(*buf + offset, str + ovector[info->tokens[i]*2], - ovector[info->tokens[i]*2+1] - ovector[info->tokens[i]*2]); - offset += (ovector[info->tokens[i]*2+1] - ovector[info->tokens[i]*2]); + return 0; + } + + /* Verify the replacement has the right number of matching groups */ + for (i = 0; i < info->tokcount; i++) { + if (info->tokens[i] >= matchcount) { + TSError("[%s] Invalid reference int replacement: $%d\n", PLUGIN_NAME, info->tokens[i]); + return 0; } - memcpy(*buf + offset, info->replacement + prev, - strlen(info->replacement) - prev); - offset += strlen(info->replacement) - prev; - (*buf)[offset] = 0; /* Null termination */ - return 1; + } + + /* malloc the replacement string */ + replacelen = strlen(info->replacement); + replacelen -= info->tokcount * 2; /* Subtract $1, $2 etc... */ + for (i = 0; i < info->tokcount; i++) { + replacelen += (ovector[info->tokens[i] * 2 + 1] - ovector[info->tokens[i] * 2]); + } + replacelen++; /* Null terminator */ + *buf = (char *) TSmalloc(replacelen); + + /* perform string replacement */ + offset = 0; /* Where we are adding new data in the string */ + prev = 0; + for (i = 0; i < info->tokcount; i++) { + memcpy(*buf + offset, info->replacement + prev, info->tokenoffset[i] - prev); + offset += (info->tokenoffset[i] - prev); + prev = info->tokenoffset[i] + 2; + + memcpy(*buf + offset, str + ovector[info->tokens[i] * 2], + ovector[info->tokens[i] * 2 + 1] - ovector[info->tokens[i] * 2]); + offset += (ovector[info->tokens[i] * 2 + 1] - ovector[info->tokens[i] * 2]); + } + memcpy(*buf + offset, info->replacement + prev, strlen(info->replacement) - prev); + offset += strlen(info->replacement) - prev; + (*buf)[offset] = 0; /* Null termination */ + return 1; } -static int regex_compile(regex_info **buf, char *pattern, char *replacement) { - const char *reerror; /* Error string from pcre */ - int reerroffset; /* Offset where any pcre error occured */ - - int tokcount; - int *tokens; - int *tokenoffset; - - int status = 1; /* Status (return value) of the function */ - - regex_info *info = (regex_info *)TSmalloc(sizeof(regex_info)); - - - /* Precompile the regular expression */ - info->re = pcre_compile(pattern, 0, &reerror, &reerroffset, NULL); - if (!info->re) { - TSError("[%s] Compilation of regex '%s' failed at char %d: %s\n", - PLUGIN_NAME, pattern, reerroffset, reerror); - status = 0; - } - - /* Precalculate the location of $X tokens in the replacement */ - tokcount = 0; - if (status) { - tokens = (int *)TSmalloc(sizeof(int) * TOKENCOUNT); - tokenoffset = (int *)TSmalloc(sizeof(int) * TOKENCOUNT); - for (unsigned i = 0; i<strlen(replacement); i++) { - if (replacement[i] == '$') { - if (tokcount >= TOKENCOUNT) { - TSError("[%s] Error: too many tokens in replacement " - "string: %s\n", PLUGIN_NAME, replacement); - status = 0; - break; - } else if (replacement[i+1] < '0' || replacement[i+1] > '9') { - TSError("[%s] Error: Invalid replacement token $%c in " - "%s: should be $0 - $9\n", PLUGIN_NAME, - replacement[i+1], replacement); - status = 0; - break; - } else { - /* Store the location of the replacement */ - /* Convert '0' to 0 */ - tokens[tokcount] = replacement[i+1] - '0'; - tokenoffset[tokcount] = i; - tokcount++; - /* Skip the next char */ - i++; - } - } +static int +regex_compile(regex_info ** buf, char *pattern, char *replacement) +{ + const char *reerror; /* Error string from pcre */ + int reerroffset; /* Offset where any pcre error occured */ + + int tokcount; + int *tokens; + int *tokenoffset; + + int status = 1; /* Status (return value) of the function */ + regex_info *info = (regex_info *) TSmalloc(sizeof(regex_info)); + + /* Precompile the regular expression */ + info->re = pcre_compile(pattern, 0, &reerror, &reerroffset, NULL); + if (!info->re) { + TSError("[%s] Compilation of regex '%s' failed at char %d: %s\n", PLUGIN_NAME, pattern, reerroffset, reerror); + status = 0; + } + + /* Precalculate the location of $X tokens in the replacement */ + tokcount = 0; + if (status) { + tokens = (int *) TSmalloc(sizeof(int) * TOKENCOUNT); + tokenoffset = (int *) TSmalloc(sizeof(int) * TOKENCOUNT); + for (unsigned i = 0; i < strlen(replacement); i++) { + if (replacement[i] == '$') { + if (tokcount >= TOKENCOUNT) { + TSError("[%s] Error: too many tokens in replacement " "string: %s\n", PLUGIN_NAME, replacement); + status = 0; + break; + } else if (replacement[i + 1] < '0' || replacement[i + 1] > '9') { + TSError("[%s] Error: Invalid replacement token $%c in %s: should be $0 - $9\n", + PLUGIN_NAME, replacement[i + 1], replacement); + status = 0; + break; + } else { + /* Store the location of the replacement */ + /* Convert '0' to 0 */ + tokens[tokcount] = replacement[i + 1] - '0'; + tokenoffset[tokcount] = i; + tokcount++; + /* Skip the next char */ + i++; } + } } - - if (status) { - /* Everything went OK */ - info->tokcount = tokcount; - info->tokens = tokens; - info->tokenoffset = tokenoffset; - - info->pattern = TSstrdup(pattern); - info->replacement = TSstrdup(replacement); - - *buf = info; - } else { - /* Something went wrong, clean up */ - if (info->tokens) TSfree(info->tokens); - if (info->tokenoffset) TSfree(info->tokenoffset); - if (info->re) pcre_free(info->re); - if (info) TSfree(info); - } - return status; + } + + if (status) { + /* Everything went OK */ + info->tokcount = tokcount; + info->tokens = tokens; + info->tokenoffset = tokenoffset; + + info->pattern = TSstrdup(pattern); + info->replacement = TSstrdup(replacement); + + *buf = info; + } else { + /* Something went wrong, clean up */ + if (info->tokens) + TSfree(info->tokens); + if (info->tokenoffset) + TSfree(info->tokenoffset); + if (info->re) + pcre_free(info->re); + if (info) + TSfree(info); + } + return status; } static pr_list * -load_config_file(const char *config_file) { - char buffer[1024]; - std::string path; - TSFile fh; - pr_list *prl = new pr_list(); - - /* locations in a config file line, end of line, split start, split end */ - char *eol, *spstart, *spend; - int lineno = 0; - int retval; - regex_info *info = 0; - - if (config_file == NULL) { - /* Default config file of plugins/cacheurl.config */ - path = TSPluginDirGet(); - path += "/cacheurl.config"; - } else if (*config_file != '/') { - // Relative paths are relative to the config directory - path = TSConfigDirGet(); - path += "/"; - path += config_file; +load_config_file(const char *config_file) +{ + char buffer[1024]; + std::string path; + TSFile fh; + pr_list *prl = new pr_list(); + + /* locations in a config file line, end of line, split start, split end */ + char *eol, *spstart, *spend; + int lineno = 0; + int retval; + regex_info *info = 0; + + if (config_file == NULL) { + /* Default config file of plugins/cacheurl.config */ + path = TSPluginDirGet(); + path += "/cacheurl.config"; + } else if (*config_file != '/') { + // Relative paths are relative to the config directory + path = TSConfigDirGet(); + path += "/"; + path += config_file; + } else { + // Absolute path ... + path = config_file; + } + + TSDebug(PLUGIN_NAME, "Opening config file: %s", path.c_str()); + fh = TSfopen(path.c_str(), "r"); + + if (!fh) { + TSError("[%s] Unable to open %s. No patterns will be loaded\n", PLUGIN_NAME, path.c_str()); + return prl; + } + + while (TSfgets(fh, buffer, sizeof(buffer) - 1)) { + lineno++; + if (*buffer == '#') { + /* # Comments, only at line beginning */ + continue; + } + eol = strstr(buffer, "\n"); + if (eol) { + *eol = 0; /* Terminate string at newline */ } else { - // Absolute path ... - path = config_file; + /* Malformed line - skip */ + continue; } - - TSDebug(PLUGIN_NAME, "Opening config file: %s", path.c_str()); - fh = TSfopen(path.c_str(), "r"); - - if (!fh) { - TSError("[%s] Unable to open %s. No patterns will be loaded\n", - PLUGIN_NAME, path.c_str()); - return prl; + /* Split line into two parts based on whitespace */ + /* Find first whitespace */ + spstart = strstr(buffer, " "); + if (!spstart) { + spstart = strstr(buffer, "\t"); + } + if (!spstart) { + TSError("[%s] ERROR: Invalid format on line %d. Skipping\n", PLUGIN_NAME, lineno); + continue; + } + /* Find part of the line after any whitespace */ + spend = spstart + 1; + while (*spend == ' ' || *spend == '\t') { + spend++; + } + if (*spend == 0) { + /* We reached the end of the string without any non-whitepace */ + TSError("[%s] ERROR: Invalid format on line %d. Skipping\n", PLUGIN_NAME, lineno); + continue; } - while (TSfgets(fh, buffer, sizeof(buffer) - 1)) { - lineno++; - if (*buffer == '#') { - /* # Comments, only at line beginning */ - continue; - } - eol = strstr(buffer, "\n"); - if (eol) { - *eol = 0; /* Terminate string at newline */ - } else { - /* Malformed line - skip */ - continue; - } - /* Split line into two parts based on whitespace */ - /* Find first whitespace */ - spstart = strstr(buffer, " "); - if (!spstart) { - spstart = strstr(buffer, "\t"); - } - if (!spstart) { - TSError("[%s] ERROR: Invalid format on line %d. Skipping\n", - PLUGIN_NAME, lineno); - continue; - } - /* Find part of the line after any whitespace */ - spend = spstart + 1; - while(*spend == ' ' || *spend == '\t') { - spend++; - } - if (*spend == 0) { - /* We reached the end of the string without any non-whitepace */ - TSError("[%s] ERROR: Invalid format on line %d. Skipping\n", - PLUGIN_NAME, lineno); - continue; - } - - *spstart = 0; - /* We have the pattern/replacement, now do precompilation. - * buffer is the first part of the line. spend is the second part just - * after the whitespace */ - TSDebug(PLUGIN_NAME, "Adding pattern/replacement pair: '%s' -> '%s'", buffer, spend); - retval = regex_compile(&info, buffer, spend); - if (!retval) { - TSError("[%s] Error precompiling regex/replacement. Skipping.\n", - PLUGIN_NAME); - } - - prl->pr.push_back(info); + *spstart = 0; + /* We have the pattern/replacement, now do precompilation. + * buffer is the first part of the line. spend is the second part just + * after the whitespace */ + TSDebug(PLUGIN_NAME, "Adding pattern/replacement pair: '%s' -> '%s'", buffer, spend); + retval = regex_compile(&info, buffer, spend); + if (!retval) { + TSError("[%s] Error precompiling regex/replacement. Skipping.\n", PLUGIN_NAME); } - TSfclose(fh); - TSDebug(PLUGIN_NAME, "loaded %u regexes", (unsigned)prl->pr.size()); - return prl; + prl->pr.push_back(info); + } + TSfclose(fh); + + TSDebug(PLUGIN_NAME, "loaded %u regexes", (unsigned) prl->pr.size()); + return prl; } -static int rewrite_cacheurl(pr_list *prl, TSHttpTxn txnp) { - int ok = 1; - char *newurl = 0; - int retval; - - char *url; - int url_length; - if (ok) { - url = TSHttpTxnEffectiveUrlStringGet(txnp, &url_length); - if (!url) { - TSError("[%s] couldn't retrieve request url\n", - PLUGIN_NAME); - ok = 0; - } +static int +rewrite_cacheurl(pr_list * prl, TSHttpTxn txnp) +{ + int ok = 1; + char *newurl = 0; + int retval; + char *url; + int url_length; + + url = TSHttpTxnEffectiveUrlStringGet(txnp, &url_length); + if (!url) { + TSError("[%s] couldn't retrieve request url\n", PLUGIN_NAME); + ok = 0; + } + + if (ok) { + for (std::vector<regex_info*>::iterator info = prl->pr.begin(); info != prl->pr.end(); ++info) { + retval = regex_substitute(&newurl, url, *info); + if (retval) { + /* Successful match/substitution */ + break; + } } - - if (ok) { - for (std::vector<regex_info *>::iterator info = prl->pr.begin(); info != prl->pr.end(); ++info) { - retval = regex_substitute(&newurl, url, *info); - if (retval) { - /* Successful match/substitution */ - break; - } - } - if (newurl) { - TSDebug(PLUGIN_NAME, "Rewriting cache URL for %s to %s", url, newurl); - if (TSCacheUrlSet(txnp, newurl, strlen(newurl)) - != TS_SUCCESS) { - TSError("[%s] Unable to modify cache url from " - "%s to %s\n", PLUGIN_NAME, url, newurl); - ok = 0; - } - } + if (newurl) { + TSDebug(PLUGIN_NAME, "Rewriting cache URL for %s to %s", url, newurl); + if (TSCacheUrlSet(txnp, newurl, strlen(newurl)) + != TS_SUCCESS) { + TSError("[%s] Unable to modify cache url from " "%s to %s\n", PLUGIN_NAME, url, newurl); + ok = 0; + } } - /* Clean up */ - if (url) TSfree(url); - if (newurl) TSfree(newurl); - return ok; -} + } -static int handle_hook(TSCont contp, TSEvent event, void *edata) { - TSHttpTxn txnp = (TSHttpTxn) edata; - pr_list *prl; - int ok = 1; - - prl = (pr_list *)TSContDataGet(contp); - - switch (event) { - case TS_EVENT_HTTP_READ_REQUEST_HDR: - ok = rewrite_cacheurl(prl, txnp); - TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE); - break; - default: - TSAssert(!"Unexpected event"); - ok = 0; - break; - } + /* Clean up */ + if (url) + TSfree(url); + if (newurl) + TSfree(newurl); - return ok; + return ok; } -/* Generic error message function for errors in plugin initialization */ -static void initialization_error(const char *msg) { - TSError("[%s] %s\n", PLUGIN_NAME, msg); - TSError("[%s] Unable to initialize plugin (disabled).\n", PLUGIN_NAME); +static int +handle_hook(TSCont contp, TSEvent event, void *edata) +{ + TSHttpTxn txnp = (TSHttpTxn) edata; + pr_list *prl; + int ok = 1; + + prl = (pr_list *) TSContDataGet(contp); + + switch (event) { + case TS_EVENT_HTTP_READ_REQUEST_HDR: + ok = rewrite_cacheurl(prl, txnp); + TSHttpTxnReenable(txnp, TS_EVENT_HTTP_CONTINUE); + break; + default: + TSAssert(!"Unexpected event"); + ok = 0; + break; + } + + return ok; } -TSReturnCode TSRemapInit(TSRemapInterface *api_info, char *errbuf, - int errbuf_size) { - if (!api_info) { - strncpy(errbuf, "[tsremap_init] Invalid TSRemapInterface argument", - errbuf_size - 1); - return TS_ERROR; - } - - if (api_info->size < sizeof(TSRemapInterface)) { - strncpy(errbuf, - "[tsremap_init] Incorrect size of TSRemapInterface structure", - errbuf_size - 1); - return TS_ERROR; - } +/* Generic error message function for errors in plugin initialization */ +static void +initialization_error(const char *msg) +{ + TSError("[%s] %s\n", PLUGIN_NAME, msg); + TSError("[%s] Unable to initialize plugin (disabled).\n", PLUGIN_NAME); +} - if (api_info->tsremap_version < TSREMAP_VERSION) { - snprintf(errbuf, errbuf_size - 1, - "[tsremap_init] Incorrect API version %ld.%ld", - api_info->tsremap_version >> 16, - (api_info->tsremap_version & 0xffff)); - return TS_ERROR; - } +TSReturnCode +TSRemapInit(TSRemapInterface * api_info, char *errbuf, int errbuf_size) +{ + if (!api_info) { + strncpy(errbuf, "[tsremap_init] Invalid TSRemapInterface argument", errbuf_size - 1); + return TS_ERROR; + } + + if (api_info->size < sizeof(TSRemapInterface)) { + strncpy(errbuf, "[tsremap_init] Incorrect size of TSRemapInterface structure", errbuf_size - 1); + return TS_ERROR; + } + + if (api_info->tsremap_version < TSREMAP_VERSION) { + snprintf(errbuf, errbuf_size - 1, "[tsremap_init] Incorrect API version %ld.%ld", + api_info->tsremap_version >> 16, (api_info->tsremap_version & 0xffff)); + return TS_ERROR; + } + + TSDebug(PLUGIN_NAME, "remap plugin is successfully initialized"); + return TS_SUCCESS; +} - TSDebug(PLUGIN_NAME, "remap plugin is successfully initialized"); - return TS_SUCCESS; +TSReturnCode +TSRemapNewInstance(int argc, char *argv[], void **ih, char *errbuf ATS_UNUSED, int errbuf_size ATS_UNUSED) +{ + *ih = load_config_file(argc > 2 ? argv[2] : NULL); + return TS_SUCCESS; } -TSReturnCode TSRemapNewInstance(int argc, char* argv[], void** ih, char* errbuf ATS_UNUSED, - int errbuf_size ATS_UNUSED) { - *ih = load_config_file(argc > 2 ? argv[2] : NULL); - return TS_SUCCESS; -} +void +TSRemapDeleteInstance(void *ih) +{ + pr_list *prl = (pr_list *) ih; + TSDebug(PLUGIN_NAME, "Deleting remap instance"); -void TSRemapDeleteInstance(void *ih) { - TSDebug(PLUGIN_NAME, "Deleting remap instance"); - pr_list *prl = (pr_list *)ih; - TSfree(prl); - delete prl; + TSfree(prl); + delete prl; } -TSRemapStatus TSRemapDoRemap(void* ih, TSHttpTxn rh, TSRemapRequestInfo *rri ATS_UNUSED) { - int ok; - ok = rewrite_cacheurl((pr_list *)ih, rh); - if (ok) { - return TSREMAP_NO_REMAP; - } else { - return TSREMAP_ERROR; - } +TSRemapStatus +TSRemapDoRemap(void *ih, TSHttpTxn rh, TSRemapRequestInfo * rri ATS_UNUSED) +{ + int ok; + + ok = rewrite_cacheurl((pr_list *) ih, rh); + if (ok) { + return TSREMAP_NO_REMAP; + } else { + return TSREMAP_ERROR; + } } -void TSPluginInit(int argc, const char *argv[]) { - TSPluginRegistrationInfo info; - TSCont contp; - pr_list *prl; +void +TSPluginInit(int argc, const char *argv[]) +{ + TSPluginRegistrationInfo info; + TSCont contp; + pr_list *prl; - info.plugin_name = (char *)PLUGIN_NAME; - info.vendor_name = (char *)"Apache Software Foundation"; - info.support_email = (char *)"d...@trafficserver.apache.org"; + info.plugin_name = (char *) PLUGIN_NAME; + info.vendor_name = (char *) "Apache Software Foundation"; + info.support_email = (char *) "d...@trafficserver.apache.org"; - if (TSPluginRegister(TS_SDK_VERSION_3_0, &info) != TS_SUCCESS) { - initialization_error("Plugin registration failed."); - return; - } + if (TSPluginRegister(TS_SDK_VERSION_3_0, &info) != TS_SUCCESS) { + initialization_error("Plugin registration failed."); + return; + } - prl = load_config_file(argc > 1 ? argv[1] : NULL); + prl = load_config_file(argc > 1 ? argv[1] : NULL); - contp = TSContCreate((TSEventFunc)handle_hook, NULL); - /* Store the pattern replacement list in the continuation */ - TSContDataSet(contp, prl); - TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, contp); + contp = TSContCreate((TSEventFunc) handle_hook, NULL); + /* Store the pattern replacement list in the continuation */ + TSContDataSet(contp, prl); + TSHttpHookAdd(TS_HTTP_READ_REQUEST_HDR_HOOK, contp); }