Catching up: chroot
[privoxy.git] / urlmatch.c
index 1b2aee8..0338131 100644 (file)
@@ -1,7 +1,7 @@
-const char urlmatch_rcs[] = "$Id: urlmatch.c,v 1.9 2002/04/04 00:36:36 gliptak Exp $";
+const char urlmatch_rcs[] = "$Id: urlmatch.c,v 1.10.2.4 2003/02/28 12:57:44 oes Exp $";
 /*********************************************************************
  *
- * File        :  $Source: /cvsroot/ijbswa/current/urlmatch.c,v $
+ * File        :  $Source: /cvsroot/ijbswa/current/Attic/urlmatch.c,v $
  *
  * Purpose     :  Declares functions to match URLs against URL
  *                patterns.
@@ -33,6 +33,24 @@ const char urlmatch_rcs[] = "$Id: urlmatch.c,v 1.9 2002/04/04 00:36:36 gliptak E
  *
  * Revisions   :
  *    $Log: urlmatch.c,v $
+ *    Revision 1.10.2.4  2003/02/28 12:57:44  oes
+ *    Moved freeing of http request structure to its owner
+ *    as per Dan Price's observations in Bug #694713
+ *
+ *    Revision 1.10.2.3  2002/11/12 16:50:40  oes
+ *    Fixed memory leak in parse_http_request() reported by Oliver Stoeneberg. Fixes bug #637073
+ *
+ *    Revision 1.10.2.2  2002/09/25 14:53:15  oes
+ *    Added basic support for OPTIONS and TRACE HTTP methods:
+ *    parse_http_url now recognizes the "*" URI as well as
+ *    the OPTIONS and TRACE method keywords.
+ *
+ *    Revision 1.10.2.1  2002/06/06 19:06:44  jongfoster
+ *    Adding support for proprietary Microsoft WebDAV extensions
+ *
+ *    Revision 1.10  2002/05/12 21:40:37  jongfoster
+ *    - Removing some unused code
+ *
  *    Revision 1.9  2002/04/04 00:36:36  gliptak
  *    always use pcre for matching
  *
@@ -152,8 +170,8 @@ void free_http_request(struct http_request *http)
  *
  * Returns     :  JB_ERR_OK on success
  *                JB_ERR_MEMORY on out of memory
- *                JB_ERR_CGI_PARAMS on malformed command/URL
- *                                  or >100 domains deep.
+ *                JB_ERR_PARSE on malformed command/URL
+ *                             or >100 domains deep.
  *
  *********************************************************************/
 jb_err parse_http_url(const char * url,
@@ -176,6 +194,17 @@ jb_err parse_http_url(const char * url,
    }
 
 
+   /*
+    * Check for * URI. If found, we're done.
+    */  
+   if (*http->url == '*')
+   {
+      http->path = strdup("*");
+      http->hostport = strdup("");
+      return JB_ERR_OK;
+   }
+
+
    /*
     * Split URL into protocol,hostport,path.
     */
@@ -232,13 +261,11 @@ jb_err parse_http_url(const char * url,
          http->hostport = strdup(url_noproto);
       }
 
-      free(buf);
+      freez(buf);
 
       if ( (http->path == NULL)
         || (http->hostport == NULL))
       {
-         free(buf);
-         free_http_request(http);
          return JB_ERR_MEMORY;
       }
    }
@@ -255,7 +282,6 @@ jb_err parse_http_url(const char * url,
       buf = strdup(http->hostport);
       if (buf == NULL)
       {
-         free_http_request(http);
          return JB_ERR_MEMORY;
       }
 
@@ -293,15 +319,14 @@ jb_err parse_http_url(const char * url,
 
       if (http->host == NULL)
       {
-         free_http_request(http);
          return JB_ERR_MEMORY;
       }
    }
 
-
    /*
     * Split domain name so we can compare it against wildcards
     */
+
    {
       char *vec[BUFFER_SIZE];
       size_t size;
@@ -310,7 +335,6 @@ jb_err parse_http_url(const char * url,
       http->dbuffer = strdup(http->host);
       if (NULL == http->dbuffer)
       {
-         free_http_request(http);
          return JB_ERR_MEMORY;
       }
 
@@ -329,7 +353,6 @@ jb_err parse_http_url(const char * url,
           * Error: More than SZ(vec) components in domain
           *    or: no components in domain
           */
-         free_http_request(http);
          return JB_ERR_PARSE;
       }
 
@@ -339,15 +362,14 @@ jb_err parse_http_url(const char * url,
       http->dvec = (char **)malloc(size);
       if (NULL == http->dvec)
       {
-         free_http_request(http);
          return JB_ERR_MEMORY;
       }
 
       memcpy(http->dvec, vec, size);
    }
 
-
    return JB_ERR_OK;
+
 }
 
 
@@ -406,6 +428,8 @@ jb_err parse_http_request(const char *req,
          || (0 == strcmpic(v[0], "post"))
          || (0 == strcmpic(v[0], "put"))
          || (0 == strcmpic(v[0], "delete"))
+         || (0 == strcmpic(v[0], "options"))
+         || (0 == strcmpic(v[0], "trace"))
  
          /* or a webDAV extension (RFC2518) */
          || (0 == strcmpic(v[0], "propfind"))
@@ -415,6 +439,24 @@ jb_err parse_http_request(const char *req,
          || (0 == strcmpic(v[0], "mkcol"))
          || (0 == strcmpic(v[0], "lock"))
          || (0 == strcmpic(v[0], "unlock"))
+
+         /* Or a Microsoft webDAV extension for Exchange 2000.  See: */
+         /*   http://lists.w3.org/Archives/Public/w3c-dist-auth/2002JanMar/0001.html */
+         /*   http://msdn.microsoft.com/library/en-us/wss/wss/_webdav_methods.asp */ 
+         || (0 == strcmpic(v[0], "bcopy"))
+         || (0 == strcmpic(v[0], "bmove"))
+         || (0 == strcmpic(v[0], "bdelete"))
+         || (0 == strcmpic(v[0], "bpropfind"))
+         || (0 == strcmpic(v[0], "bproppatch"))
+
+         /* Or another Microsoft webDAV extension for Exchange 2000.  See: */
+         /*   http://systems.cs.colorado.edu/grunwald/MobileComputing/Papers/draft-cohen-gena-p-base-00.txt */
+         /*   http://lists.w3.org/Archives/Public/w3c-dist-auth/2002JanMar/0001.html */
+         /*   http://msdn.microsoft.com/library/en-us/wss/wss/_webdav_methods.asp */ 
+         || (0 == strcmpic(v[0], "subscribe"))
+         || (0 == strcmpic(v[0], "unsubscribe"))
+         || (0 == strcmpic(v[0], "notify"))
+         || (0 == strcmpic(v[0], "poll"))
          )
    {
       /* Normal */
@@ -447,11 +489,12 @@ jb_err parse_http_request(const char *req,
      || (http->ver == NULL) )
    {
       free(buf);
-      free_http_request(http);
       return JB_ERR_MEMORY;
    }
 
+   free(buf);
    return JB_ERR_OK;
+
 }