- Be a bit more descriptive about why CGI access
[privoxy.git] / filters.c
index 84ea1d5..36eccf4 100644 (file)
--- a/filters.c
+++ b/filters.c
@@ -1,4 +1,4 @@
-const char filters_rcs[] = "$Id: filters.c,v 1.74 2006/12/24 17:37:38 fabiankeil Exp $";
+const char filters_rcs[] = "$Id: filters.c,v 1.76 2007/01/01 19:36:37 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/filters.c,v $
@@ -40,6 +40,14 @@ const char filters_rcs[] = "$Id: filters.c,v 1.74 2006/12/24 17:37:38 fabiankeil
  *
  * Revisions   :
  *    $Log: filters.c,v $
+ *    Revision 1.76  2007/01/01 19:36:37  fabiankeil
+ *    Integrate a modified version of Wil Mahan's
+ *    zlib patch (PR #895531).
+ *
+ *    Revision 1.75  2006/12/29 18:30:46  fabiankeil
+ *    Fixed gcc43 conversion warnings,
+ *    changed sprintf calls to snprintf.
+ *
  *    Revision 1.74  2006/12/24 17:37:38  fabiankeil
  *    Adjust comment in pcrs_filter_response()
  *    to recent pcrs changes. Hohoho.
@@ -934,7 +942,6 @@ struct http_response *block_url(struct client_state *csp)
             return cgi_error_memory();
          }
       }
-
    }
    else
 #endif /* def FEATURE_IMAGE_BLOCKING */
@@ -1422,7 +1429,7 @@ struct http_response *redirect_url(struct client_state *csp)
        * If it exists, use the previously rewritten URL as input
        * otherwise just use the old path.
        */
-      old_url = new_url ? new_url : strdup(csp->http->path);
+      old_url = (new_url != NULL) ? new_url : strdup(csp->http->path);
       new_url = get_last_url(old_url, redirect_mode);
       freez(old_url);
    }
@@ -1484,7 +1491,7 @@ struct http_response *redirect_url(struct client_state *csp)
  *                otherwise
  *
  *********************************************************************/
-int is_imageurl(struct client_state *csp)
+int is_imageurl(const struct client_state *csp)
 {
 #ifdef FEATURE_IMAGE_DETECT_MSIE
    char *tmp;
@@ -1531,7 +1538,7 @@ int is_imageurl(struct client_state *csp)
  * Returns     :  0 => trusted, 1 => untrusted
  *
  *********************************************************************/
-int is_untrusted_url(struct client_state *csp)
+int is_untrusted_url(const struct client_state *csp)
 {
    struct file_list *fl;
    struct block_spec *b;
@@ -1660,6 +1667,11 @@ int is_untrusted_url(struct client_state *csp)
  *                csp->content_length to the modified size and raise the
  *                CSP_FLAG_MODIFIED flag.
  *
+ *                XXX: Currently pcrs_filter_response is also responsible
+ *                for dechunking and decompressing. Both should be
+ *                done in separate functions so other content modifiers
+ *                profit as well, even if pcrs filtering is disabled.
+ *
  * Parameters  :
  *          1  :  csp = Current client state (buffers, headers, etc...)
  *
@@ -1709,7 +1721,7 @@ char *pcrs_filter_response(struct client_state *csp)
    if (0 == found_filters)
    {
       log_error(LOG_LEVEL_ERROR, "Unable to get current state of regexp filtering.");
-         return(NULL);
+      return(NULL);
    }
 
    /*
@@ -1727,6 +1739,41 @@ char *pcrs_filter_response(struct client_state *csp)
       csp->flags |= CSP_FLAG_MODIFIED;
    }
 
+#ifdef FEATURE_ZLIB
+   /*
+    * If the body has a compressed transfer-encoding,
+    * uncompress it first, adjusting size and iob->eod.
+    * Note that decompression occurs after de-chunking.
+    */
+   if (csp->content_type & CT_GZIP || csp->content_type & CT_DEFLATE)
+   {
+      /* Notice that we at least tried to decompress. */
+      if (JB_ERR_OK != decompress_iob(csp))
+      {
+         /*
+          * We failed to decompress the data; there's no point
+          * in continuing since we can't filter. This is
+          * slightly tricky because we need to remember not to
+          * modify the Content-Encoding header later; using
+          * CT_TABOO flag is a kludge for this purpose.
+          */
+          csp->content_type |= CT_TABOO;
+          return(NULL);
+      }
+      log_error(LOG_LEVEL_RE_FILTER, "Decompressing successful");
+
+      /*
+       * Decompression gives us a completely new iob,
+       * so we need to update.
+       */
+      size = (size_t)(csp->iob->eod - csp->iob->cur);
+      old  = csp->iob->cur;
+
+      csp->flags |= CSP_FLAG_MODIFIED;
+      csp->content_type &= ~CT_TABOO;
+   }
+#endif
+
    for (i = 0; i < MAX_AF_FILES; i++)
    {
      fl = csp->rlist[i];