TS-2323: drive remap directives from a pointer table

Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/5d2ea5b5
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/5d2ea5b5
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/5d2ea5b5

Branch: refs/heads/master
Commit: 5d2ea5b57e98878d557eb9222cf46587936eddf3
Parents: a2db1d0
Author: James Peach <[email protected]>
Authored: Wed Oct 30 10:56:58 2013 -0700
Committer: James Peach <[email protected]>
Committed: Tue Nov 5 16:46:12 2013 -0800

----------------------------------------------------------------------
 proxy/http/remap/UrlRewrite.cc | 57 +++++++++++++++++++++++--------------
 1 file changed, 35 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/5d2ea5b5/proxy/http/remap/UrlRewrite.cc
----------------------------------------------------------------------
diff --git a/proxy/http/remap/UrlRewrite.cc b/proxy/http/remap/UrlRewrite.cc
index 36f8ff2..4b7a1bf 100644
--- a/proxy/http/remap/UrlRewrite.cc
+++ b/proxy/http/remap/UrlRewrite.cc
@@ -487,6 +487,34 @@ parse_deactivate_directive(const char * directive, 
BUILD_TABLE_INFO * bti, char
   return NULL;
 }
 
+struct remap_directive
+{
+  const char * name;
+  const char * (*parser)(const char *, BUILD_TABLE_INFO *, char *, size_t);
+};
+
+static const remap_directive directives[] = {
+
+  { ".definefilter", parse_define_directive},
+  { ".deffilter", parse_define_directive},
+  { ".defflt", parse_define_directive},
+
+  { ".deletefilter", parse_delete_directive},
+  { ".delfilter", parse_delete_directive},
+  { ".delflt", parse_delete_directive},
+
+  { ".usefilter", parse_activate_directive},
+  { ".activefilter", parse_activate_directive},
+  { ".activatefilter", parse_activate_directive},
+
+  { ".unusefilter", parse_deactivate_directive},
+  { ".deactivatefilter", parse_deactivate_directive},
+  { ".unactivefilter", parse_deactivate_directive},
+  { ".deuseflt", parse_deactivate_directive},
+  { ".unuseflt", parse_deactivate_directive},
+
+};
+
 static const char *
 parse_directive(BUILD_TABLE_INFO *bti, char * errbuf, size_t errbufsize)
 {
@@ -498,30 +526,15 @@ parse_directive(BUILD_TABLE_INFO *bti, char * errbuf, 
size_t errbufsize)
     return "Invalid argument(s)";
   }
 
-  Debug("url_rewrite", "[parse_directive] Start processing \"%s\" directive", 
directive);
-
-  if (directive[0] != '.' || directive[1] == 0) {
-    snprintf(errbuf, errbufsize, "Invalid directive \"%s\"", directive);
-    Debug("url_rewrite", "[parse_directive] %s", errbuf);
-    return (const char *) errbuf;
-  }
-
-  if (is_inkeylist(directive, ".definefilter", ".deffilter", ".defflt", NULL)) 
{
-    return parse_define_directive(&directive[1], bti, errbuf, errbufsize);
-  } else if (is_inkeylist(directive, ".deletefilter", ".delfilter", ".delflt", 
NULL)) {
-    return parse_delete_directive(directive, bti, errbuf, errbufsize);
-  } else if (is_inkeylist(directive, ".usefilter", ".activefilter", 
".activatefilter", ".useflt", NULL)) {
-    return parse_activate_directive(directive, bti, errbuf, errbufsize);
-  } else if (is_inkeylist(directive, ".unusefilter", ".deactivatefilter", 
".unactivefilter", ".deuseflt", ".unuseflt", NULL))
-  {
-    return parse_deactivate_directive(directive, bti, errbuf, errbufsize);
-  } else {
-    snprintf(errbuf, errbufsize, "Unknown directive \"%s\"", directive);
-    Debug("url_rewrite", "[parse_directive] %s", errbuf);
-    return (const char *) errbuf;
+  for (unsigned i = 0; i < countof(directives); ++i) {
+    if (strcmp(directive, directives[i].name) == 0) {
+      return directives[i].parser(directive, bti, errbuf, errbufsize);
+    }
   }
 
-  return NULL;
+  snprintf(errbuf, errbufsize, "Unknown directive \"%s\"", directive);
+  Debug("url_rewrite", "[parse_directive] %s", errbuf);
+  return (const char *) errbuf;
 }
 
 static const char *

Reply via email to