-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 $
*
* 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.
return cgi_error_memory();
}
}
-
}
else
#endif /* def FEATURE_IMAGE_BLOCKING */
* 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);
}
* otherwise
*
*********************************************************************/
-int is_imageurl(struct client_state *csp)
+int is_imageurl(const struct client_state *csp)
{
#ifdef FEATURE_IMAGE_DETECT_MSIE
char *tmp;
* 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;
* 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...)
*
if (0 == found_filters)
{
log_error(LOG_LEVEL_ERROR, "Unable to get current state of regexp filtering.");
- return(NULL);
+ return(NULL);
}
/*
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];