Log a message right before exiting gracefully
[privoxy.git] / urlmatch.c
index 36699fc..4670f31 100644 (file)
@@ -5,7 +5,7 @@
  * Purpose     :  Declares functions to match URLs against URL
  *                patterns.
  *
- * Copyright   :  Written by and Copyright (C) 2001-2014
+ * Copyright   :  Written by and Copyright (C) 2001-2020
  *                the Privoxy team. https://www.privoxy.org/
  *
  *                Based on the Internet Junkbuster originally written
@@ -45,7 +45,7 @@
 #include <assert.h>
 #include <string.h>
 
-#if !defined(_WIN32) && !defined(__OS2__)
+#if !defined(_WIN32)
 #include <unistd.h>
 #endif
 
@@ -63,7 +63,7 @@ enum regex_anchoring
    RIGHT_ANCHORED_HOST
 };
 static jb_err compile_vanilla_host_pattern(struct pattern_spec *url, const char *host_pattern);
-#ifdef FEATURE_EXTENDED_HOST_PATTERNS
+#ifdef FEATURE_PCRE_HOST_PATTERNS
 static jb_err compile_pcre_host_pattern(struct pattern_spec *url, const char *host_pattern);
 #endif
 
@@ -263,7 +263,9 @@ jb_err parse_http_url(const char *url, struct http_request *http, int require_pr
       else if (strncmpic(url_noproto, "https://", 8) == 0)
       {
          /*
-          * Should only happen when called from cgi_show_url_info().
+          * Should only happen when called from cgi_show_url_info()
+          * or when the request was https-inspected and the request
+          * line got rewritten.
           */
          url_noproto += 8;
          http->ssl = 1;
@@ -302,7 +304,7 @@ jb_err parse_http_url(const char *url, struct http_request *http, int require_pr
             url_path
          );
          *url_path = '\0';
-         http->hostport = strdup_or_die(url_noproto);
+         http->hostport = string_tolower(url_noproto);
       }
       else
       {
@@ -311,10 +313,15 @@ jb_err parse_http_url(const char *url, struct http_request *http, int require_pr
           * or CONNECT requests
           */
          http->path = strdup_or_die("/");
-         http->hostport = strdup_or_die(url_noproto);
+         http->hostport = string_tolower(url_noproto);
       }
 
       freez(buf);
+
+      if (http->hostport == NULL)
+      {
+         return JB_ERR_PARSE;
+      }
    }
 
    if (!host_available)
@@ -699,12 +706,12 @@ static jb_err compile_pattern(const char *pattern, enum regex_anchoring anchorin
 static jb_err compile_url_pattern(struct pattern_spec *url, char *buf)
 {
    char *p;
-
-#ifdef FEATURE_EXTENDED_HOST_PATTERNS
    const size_t prefix_length = 18;
+
+#ifdef FEATURE_PCRE_HOST_PATTERNS
    if (strncmpic(buf, "PCRE-HOST-PATTERN:", prefix_length) == 0)
    {
-      url->pattern.url_spec.host_regex_type = EXTENDED_HOST_PATTERN;
+      url->pattern.url_spec.host_regex_type = PCRE_HOST_PATTERN;
       /* Overwrite the "PCRE-HOST-PATTERN:" prefix */
       memmove(buf, buf+prefix_length, strlen(buf+prefix_length)+1);
    }
@@ -712,6 +719,22 @@ static jb_err compile_url_pattern(struct pattern_spec *url, char *buf)
    {
       url->pattern.url_spec.host_regex_type = VANILLA_HOST_PATTERN;
    }
+#else
+   if (strncmpic(buf, "PCRE-HOST-PATTERN:", prefix_length) == 0)
+   {
+      log_error(LOG_LEVEL_ERROR,
+         "PCRE-HOST-PATTERN detected while Privoxy has been compiled "
+         "without FEATURE_PCRE_HOST_PATTERNS: %s",
+         buf);
+      /* Overwrite the "PCRE-HOST-PATTERN:" prefix */
+      memmove(buf, buf+prefix_length, strlen(buf+prefix_length)+1);
+      /*
+       * The pattern will probably not work as expected.
+       * We don't simply return JB_ERR_PARSE here so the
+       * regression tests can be loaded with and without
+       * FEATURE_PCRE_HOST_PATTERNS.
+       */
+   }
 #endif
 
    p = strchr(buf, '/');
@@ -775,8 +798,8 @@ static jb_err compile_url_pattern(struct pattern_spec *url, char *buf)
 
    if (buf[0] != '\0')
    {
-#ifdef FEATURE_EXTENDED_HOST_PATTERNS
-      if (url->pattern.url_spec.host_regex_type == EXTENDED_HOST_PATTERN)
+#ifdef FEATURE_PCRE_HOST_PATTERNS
+      if (url->pattern.url_spec.host_regex_type == PCRE_HOST_PATTERN)
       {
          return compile_pcre_host_pattern(url, buf);
       }
@@ -792,7 +815,7 @@ static jb_err compile_url_pattern(struct pattern_spec *url, char *buf)
 }
 
 
-#ifdef FEATURE_EXTENDED_HOST_PATTERNS
+#ifdef FEATURE_PCRE_HOST_PATTERNS
 /*********************************************************************
  *
  * Function    :  compile_pcre_host_pattern
@@ -812,7 +835,7 @@ static jb_err compile_pcre_host_pattern(struct pattern_spec *url, const char *ho
 {
    return compile_pattern(host_pattern, RIGHT_ANCHORED_HOST, url, &url->pattern.url_spec.host_regex);
 }
-#endif /* def FEATURE_EXTENDED_HOST_PATTERNS */
+#endif /* def FEATURE_PCRE_HOST_PATTERNS */
 
 
 /*********************************************************************
@@ -1240,13 +1263,13 @@ void free_pattern_spec(struct pattern_spec *pattern)
    if (pattern == NULL) return;
 
    freez(pattern->spec);
-#ifdef FEATURE_EXTENDED_HOST_PATTERNS
+#ifdef FEATURE_PCRE_HOST_PATTERNS
    if (pattern->pattern.url_spec.host_regex)
    {
       regfree(pattern->pattern.url_spec.host_regex);
       freez(pattern->pattern.url_spec.host_regex);
    }
-#endif /* def FEATURE_EXTENDED_HOST_PATTERNS */
+#endif /* def FEATURE_PCRE_HOST_PATTERNS */
    freez(pattern->pattern.url_spec.dbuffer);
    freez(pattern->pattern.url_spec.dvec);
    pattern->pattern.url_spec.dcount = 0;
@@ -1300,8 +1323,9 @@ static int host_matches(const struct http_request *http,
                         const struct pattern_spec *pattern)
 {
    assert(http->host != NULL);
-#ifdef FEATURE_EXTENDED_HOST_PATTERNS
-   if (pattern->pattern.url_spec.host_regex_type == EXTENDED_HOST_PATTERN) {
+#ifdef FEATURE_PCRE_HOST_PATTERNS
+   if (pattern->pattern.url_spec.host_regex_type == PCRE_HOST_PATTERN)
+   {
       return ((NULL == pattern->pattern.url_spec.host_regex)
          || (0 == regexec(pattern->pattern.url_spec.host_regex,
                http->host, 0, NULL, 0)));