Introduce tags as alternative way to specify which
[privoxy.git] / urlmatch.c
index 8bb8e26..f3eaa41 100644 (file)
@@ -1,4 +1,4 @@
-const char urlmatch_rcs[] = "$Id: urlmatch.c,v 1.15 2007/01/28 16:11:23 fabiankeil Exp $";
+const char urlmatch_rcs[] = "$Id: urlmatch.c,v 1.16 2007/02/13 13:59:24 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/urlmatch.c,v $
@@ -33,6 +33,9 @@ const char urlmatch_rcs[] = "$Id: urlmatch.c,v 1.15 2007/01/28 16:11:23 fabianke
  *
  * Revisions   :
  *    $Log: urlmatch.c,v $
+ *    Revision 1.16  2007/02/13 13:59:24  fabiankeil
+ *    Remove redundant log message.
+ *
  *    Revision 1.15  2007/01/28 16:11:23  fabiankeil
  *    Accept WebDAV methods for subversion
  *    in parse_http_request(). Closes FR 1581425.
@@ -741,6 +744,9 @@ static int domain_match(const struct url_spec *pattern, const struct http_reques
 jb_err create_url_spec(struct url_spec * url, const char * buf)
 {
    char *p;
+   int errcode;
+   size_t errlen;
+   char rebuf[BUFFER_SIZE];
 
    assert(url);
    assert(buf);
@@ -758,6 +764,38 @@ jb_err create_url_spec(struct url_spec * url, const char * buf)
       return JB_ERR_MEMORY;
    }
 
+   /* Is it tag pattern? */
+   if (0 == strncmpic("TAG:", url->spec, 4))
+   {
+      if (NULL == (url->tag_regex = zalloc(sizeof(*url->tag_regex))))
+      {
+         freez(url->spec);
+         return JB_ERR_MEMORY;
+      }
+
+      /* buf + 4 to skip "TAG:" */
+      errcode = regcomp(url->tag_regex, buf + 4, (REG_EXTENDED|REG_NOSUB|REG_ICASE));
+      if (errcode)
+      {
+         errlen = regerror(errcode, url->preg, rebuf, sizeof(rebuf));
+         if (errlen > (sizeof(rebuf) - 1))
+         {
+            errlen = sizeof(rebuf) - 1;
+         }
+         rebuf[errlen] = '\0';
+
+         log_error(LOG_LEVEL_ERROR, "error compiling %s: %s", url->spec, rebuf);
+
+         freez(url->spec);
+         regfree(url->tag_regex);
+         freez(url->tag_regex);
+
+         return JB_ERR_PARSE;
+      }
+      return JB_ERR_OK;
+   }
+
+   /* Only reached for URL patterns */
    if ((p = strchr(buf, '/')) != NULL)
    {
       if (NULL == (url->path = strdup(p)))
@@ -775,9 +813,6 @@ jb_err create_url_spec(struct url_spec * url, const char * buf)
    }
    if (url->path)
    {
-      int errcode;
-      char rebuf[BUFFER_SIZE];
-
       if (NULL == (url->preg = zalloc(sizeof(*url->preg))))
       {
          freez(url->spec);
@@ -791,8 +826,7 @@ jb_err create_url_spec(struct url_spec * url, const char * buf)
             (REG_EXTENDED|REG_NOSUB|REG_ICASE));
       if (errcode)
       {
-         size_t errlen = regerror(errcode,
-            url->preg, rebuf, sizeof(rebuf));
+         errlen = regerror(errcode, url->preg, rebuf, sizeof(rebuf));
 
          if (errlen > (sizeof(rebuf) - (size_t)1))
          {
@@ -934,6 +968,11 @@ void free_url_spec(struct url_spec *url)
       regfree(url->preg);
       freez(url->preg);
    }
+   if (url->tag_regex)
+   {
+      regfree(url->tag_regex);
+      freez(url->tag_regex);
+   }
 }
 
 
@@ -947,12 +986,18 @@ void free_url_spec(struct url_spec *url)
  *          1  :  pattern = a URL pattern
  *          2  :  url = URL to match
  *
- * Returns     :  0 iff the URL matches the pattern, else nonzero.
+ * Returns     :  Nonzero if the URL matches the pattern, else 0.
  *
  *********************************************************************/
 int url_match(const struct url_spec *pattern,
               const struct http_request *url)
 {
+   if (pattern->tag_regex != NULL)
+   {
+      /* It's a tag pattern and shouldn't be matched against URLs */
+      return 0;
+   } 
+
    return ((pattern->port == 0) || (pattern->port == url->port))
        && ((pattern->dbuffer == NULL) || (domain_match(pattern, url) == 0))
        && ((pattern->path == NULL) ||