You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@trafficserver.apache.org by Igor Galić <i....@brainsware.org> on 2013/11/06 21:53:10 UTC
Re: [08/12] git commit: TS-2323: separate remap.config parsing from
UrlRewrite
----- Original Message -----
> TS-2323: separate remap.config parsing from UrlRewrite
>
>
> Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
> Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/90f923ef
> Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/90f923ef
> Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/90f923ef
>
> Branch: refs/heads/master
> Commit: 90f923ef36313f74241f9ebe55ceea17de5caac7
> Parents: 3e8668d
> Author: James Peach <jp...@apache.org>
> Authored: Fri Nov 1 10:28:14 2013 -0700
> Committer: James Peach <jp...@apache.org>
> Committed: Tue Nov 5 16:46:35 2013 -0800
>
> ----------------------------------------------------------------------
> proxy/http/remap/RemapConfig.cc | 765 ++++++++++++++++++++++++++++++-
> proxy/http/remap/RemapConfig.h | 11 +-
> proxy/http/remap/UrlRewrite.cc | 860 ++++-------------------------------
> proxy/http/remap/UrlRewrite.h | 11 +-
> 4 files changed, 848 insertions(+), 799 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/90f923ef/proxy/http/remap/RemapConfig.cc
> ----------------------------------------------------------------------
> diff --git a/proxy/http/remap/RemapConfig.cc
> b/proxy/http/remap/RemapConfig.cc
> index 0c6442b..a4d41f2 100644
> --- a/proxy/http/remap/RemapConfig.cc
> +++ b/proxy/http/remap/RemapConfig.cc
> @@ -22,8 +22,39 @@
> */
>
> #include "RemapConfig.h"
> -#include "libts.h"
> +#include "UrlRewrite.h"
> +#include "ReverseProxy.h"
> #include "HTTP.h"
> +#include "libts.h"
> +#include "ink_cap.h"
> +
> +#define modulePrefix "[ReverseProxy]"
> +
> +/**
> + Returns the length of the URL.
> +
> + Will replace the terminator with a '/' if this is a full URL and
> + there are no '/' in it after the the host. This ensures that class
> + URL parses the URL correctly.
> +
> +*/
> +static int
> +UrlWhack(char *toWhack, int *origLength)
> +{
> + int length = strlen(toWhack);
> + char *tmp;
> + *origLength = length;
> +
> + // Check to see if this a full URL
> + tmp = strstr(toWhack, "://");
> + if (tmp != NULL) {
> + if (strchr(tmp + 3, '/') == NULL) {
> + toWhack[length] = '/';
> + length++;
> + }
> + }
> + return length;
> +}
>
> /**
> Cleanup *char[] array - each item in array must be allocated via
> @@ -58,6 +89,33 @@ BUILD_TABLE_INFO::reset()
> clear_xstr_array(this->argv, sizeof(this->argv) / sizeof(char *));
> }
>
> +static const char *
> +process_filter_opt(url_mapping * mp, const BUILD_TABLE_INFO * bti, char *
> errStrBuf, int errStrBufSize)
> +{
> + acl_filter_rule *rp, **rpp;
> + const char *errStr = NULL;
> +
> + if (unlikely(!mp || !bti || !errStrBuf || errStrBufSize <= 0)) {
> + Debug("url_rewrite", "[process_filter_opt] Invalid argument(s)");
> + return (const char *) "[process_filter_opt] Invalid argument(s)";
> + }
> + for (rp = bti->rules_list; rp; rp = rp->next) {
> + if (rp->active_queue_flag) {
> + Debug("url_rewrite", "[process_filter_opt] Add active main filter
> \"%s\" (argc=%d)",
> + rp->filter_name ? rp->filter_name : "<NULL>", rp->argc);
> + for (rpp = &mp->filter; *rpp; rpp = &((*rpp)->next));
> + if ((errStr = remap_validate_filter_args(rpp, (const char **)rp->argv,
> rp->argc, errStrBuf, errStrBufSize)) != NULL)
> + break;
> + }
> + }
> + if (!errStr && (bti->remap_optflg & REMAP_OPTFLG_ALL_FILTERS) != 0) {
> + Debug("url_rewrite", "[process_filter_opt] Add per remap filter");
> + for (rpp = &mp->filter; *rpp; rpp = &((*rpp)->next));
> + errStr = remap_validate_filter_args(rpp, (const char **)bti->argv,
> bti->argc, errStrBuf, errStrBufSize);
> + }
> + return errStr;
> +}
> +
> static bool
> is_inkeylist(const char * key, ...)
> {
> @@ -104,7 +162,7 @@ parse_define_directive(const char * directive,
> BUILD_TABLE_INFO * bti, char * er
>
> flg = ((rp = acl_filter_rule::find_byname(bti->rules_list, (const char *)
> bti->paramv[1])) == NULL) ? true : false;
> // coverity[alloc_arg]
> - if ((cstr = remap_validate_filter_args(&rp, bti->argv, bti->argc, errbuf,
> errbufsize)) == NULL && rp) {
> + if ((cstr = remap_validate_filter_args(&rp, (const char **)bti->argv,
> bti->argc, errbuf, errbufsize)) == NULL && rp) {
> if (flg) { // new filter - add to list
> Debug("url_rewrite", "[parse_directive] new rule \"%s\" was created",
> bti->paramv[1]);
> for (rpp = &bti->rules_list; *rpp; rpp = &((*rpp)->next));
> @@ -223,11 +281,12 @@ remap_parse_directive(BUILD_TABLE_INFO *bti, char *
> errbuf, size_t errbufsize)
> }
>
> const char *
> -remap_validate_filter_args(acl_filter_rule ** rule_pp, char ** argv, int
> argc, char * errStrBuf, size_t errStrBufSize)
> +remap_validate_filter_args(acl_filter_rule ** rule_pp, const char ** argv,
> int argc, char * errStrBuf, size_t errStrBufSize)
> {
> acl_filter_rule *rule;
> unsigned long ul;
> - char *argptr, tmpbuf[1024];
> + const char *argptr;
> + char tmpbuf[1024];
> src_ip_info_t *ipi;
> int i, j, m;
> bool new_rule_flg = false;
> @@ -255,7 +314,7 @@ remap_validate_filter_args(acl_filter_rule ** rule_pp,
> char ** argv, int argc, c
> }
>
> for (i = 0; i < argc; i++) {
> - if ((ul = remap_check_option(&argv[i], 1, 0, NULL, &argptr)) == 0) {
> + if ((ul = remap_check_option((const char **)&argv[i], 1, 0, NULL,
> &argptr)) == 0) {
> Debug("url_rewrite", "[validate_filter_args] Unknow remap option -
> %s", argv[i]);
> snprintf(errStrBuf, errStrBufSize, "Unknown option - \"%s\"",
> argv[i]);
> errStrBuf[errStrBufSize - 1] = 0;
> @@ -405,7 +464,7 @@ remap_validate_filter_args(acl_filter_rule ** rule_pp,
> char ** argv, int argc, c
> }
>
> unsigned long
> -remap_check_option(char *argv[], int argc, unsigned long findmode, int
> *_ret_idx, char **argptr)
> +remap_check_option(const char ** argv, int argc, unsigned long findmode, int
> *_ret_idx, const char **argptr)
> {
> unsigned long ret_flags = 0;
> int idx = 0;
> @@ -474,3 +533,697 @@ remap_check_option(char *argv[], int argc, unsigned
> long findmode, int *_ret_idx
> *_ret_idx = idx;
> return ret_flags;
> }
> +
> +int
> +remap_load_plugin(const char ** argv, int argc, url_mapping *mp, char
> *errbuf, int errbufsize,
> + int jump_to_argc, int *plugin_found_at)
> +{
> + TSRemapInterface ri;
> + struct stat stat_buf;
> + remap_plugin_info *pi;
> + char *c, *err, tmpbuf[2048], default_path[PATH_NAME_MAX];
> + const char *new_argv[1024];
> + char * parv[1024];
> + int idx = 0, retcode = 0;
> + int parc = 0;
> +
> + *plugin_found_at = 0;
> +
> + memset(parv, 0, sizeof(parv));
> + memset(new_argv, 0, sizeof(new_argv));
> + tmpbuf[0] = 0;
> +
> + ink_assert(argc < countof(new_argv));
> +
> + if (jump_to_argc != 0) {
> + argc -= jump_to_argc;
> + int i = 0;
> + while (argv[i + jump_to_argc]) {
> + new_argv[i] = argv[i + jump_to_argc];
> + i++;
> + }
> + argv = &new_argv[0];
> + if (!remap_check_option(argv, argc, REMAP_OPTFLG_PLUGIN, &idx)) {
> + return -1;
> + }
> + } else {
> + if (unlikely(!mp || (remap_check_option(argv, argc, REMAP_OPTFLG_PLUGIN,
> &idx) & REMAP_OPTFLG_PLUGIN) == 0)) {
> + snprintf(errbuf, errbufsize, "Can't find remap plugin keyword or
> \"url_mapping\" is NULL");
> + return -1; /* incorrect input data - almost impossible
> case */
> + }
> + }
> +
> + if (unlikely((c = strchr(argv[idx], (int) '=')) == NULL || !(*(++c)))) {
> + snprintf(errbuf, errbufsize, "Can't find remap plugin file name in
> \"@%s\"", argv[idx]);
> + return -2; /* incorrect input data */
> + }
> +
> + if (stat(c, &stat_buf) != 0) {
> + const char *plugin_default_path = TSPluginDirGet();
> +
> + // Try with the plugin path instead
> + if (strlen(c) + strlen(plugin_default_path) > (PATH_NAME_MAX - 1)) {
> + Debug("remap_plugin", "way too large a path specified for remap
> plugin");
> + return -3;
not a huge fan of these return values (would be nice if they had names)
How do we know what they mean? What's the difference between -1 and -2 in
this instance? etc...
Also, this debug message seems strange.
[snip]
++ i
Igor Galić
Tel: +43 (0) 664 886 22 883
Mail: i.galic@brainsware.org
URL: http://brainsware.org/
GPG: 8716 7A9F 989B ABD5 100F 4008 F266 55D6 2998 1641