-const char filters_rcs[] = "$Id: filters.c,v 1.76 2007/01/01 19:36:37 fabiankeil Exp $";
+const char filters_rcs[] = "$Id: filters.c,v 1.79 2007/01/31 16:21:38 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/filters.c,v $
* `jpeg_inspect_response', `execute_single_pcrs_command',
* `rewrite_url', `get_last_url'
*
- * Copyright : Written by and Copyright (C) 2001, 2004-2006 the SourceForge
+ * Copyright : Written by and Copyright (C) 2001, 2004-2007 the SourceForge
* Privoxy team. http://www.privoxy.org/
*
* Based on the Internet Junkbuster originally written
*
* Revisions :
* $Log: filters.c,v $
+ * Revision 1.79 2007/01/31 16:21:38 fabiankeil
+ * Search for Max-Forwards headers case-insensitive,
+ * don't generate the "501 unsupported" message for invalid
+ * Max-Forwards values and don't increase negative ones.
+ *
+ * Revision 1.78 2007/01/28 13:41:18 fabiankeil
+ * - Add HEAD support to finish_http_response.
+ * - Add error favicon to internal HTML error messages.
+ *
+ * Revision 1.77 2007/01/12 15:36:44 fabiankeil
+ * Mark *csp as immutable for is_untrusted_url()
+ * and is_imageurl(). Closes FR 1237736.
+ *
* Revision 1.76 2007/01/01 19:36:37 fabiankeil
* Integrate a modified version of Wil Mahan's
* zlib patch (PR #895531).
}
else
{
- rsp->status = strdup("404 Request for blocked URL");
+ rsp->status = strdup("403 Request for blocked URL");
}
if (rsp->status == NULL)
return cgi_error_memory();
}
}
+ rsp->reason = RSP_REASON_BLOCKED;
- return finish_http_response(rsp);
+ return finish_http_response(csp, rsp);
}
free_http_response(rsp);
return cgi_error_memory();
}
+ rsp->reason = RSP_REASON_UNTRUSTED;
- return finish_http_response(rsp);
+ return finish_http_response(csp, rsp);
}
#endif /* def FEATURE_TRUST */
free_http_response(rsp);
return cgi_error_memory();
}
+ rsp->reason = RSP_REASON_REDIRECTED;
freez(new_url);
- return finish_http_response(rsp);
+
+ return finish_http_response(csp, rsp);
}
}
return 0;
}
}
+
return 1;
}
#endif /* def FEATURE_TRUST */
* 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)
+ if (csp->content_type & (CT_GZIP | 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.
+ * in continuing since we can't filter.
+ *
+ * XXX: Actually the Accept-Encoding header may
+ * just be incorrect in which case we could continue
+ * with filtering.
+ *
+ * Unset CT_GZIP and CT_DEFLATE to remember not
+ * to modify the Content-Encoding header later.
*/
- csp->content_type |= CT_TABOO;
+ csp->content_type &= ~CT_GZIP;
+ csp->content_type &= ~CT_DEFLATE;
return(NULL);
}
log_error(LOG_LEVEL_RE_FILTER, "Decompressing successful");
{
for (p = csp->headers->first; (p != NULL) ; p = p->next)
{
- if (!strncmp("Max-Forwards:", p->str, 13)
- && (*(p->str+13) != '\0') && (atoi(p->str+13) == 0))
+ if (!strncmpic("Max-Forwards:", p->str, 13))
{
- /* FIXME: We could handle at least TRACE here,
- but that would require a verbatim copy of
- the request which we don't have anymore */
+ unsigned int max_forwards;
- log_error(LOG_LEVEL_HEADER, "Found Max-Forwards:0 in OPTIONS or TRACE request -- Returning 501");
-
- /* Get mem for response or fail*/
- if (NULL == (rsp = alloc_http_response()))
+ /*
+ * If it's a Max-Forwards value of zero,
+ * we have to intercept the request.
+ */
+ if (1 == sscanf(p->str+12, ": %u", &max_forwards) && max_forwards == 0)
{
- return cgi_error_memory();
- }
+ /*
+ * FIXME: We could handle at least TRACE here,
+ * but that would require a verbatim copy of
+ * the request which we don't have anymore
+ */
+ log_error(LOG_LEVEL_HEADER,
+ "Detected header \'%s\' in OPTIONS or TRACE request. Returning 501.",
+ p->str);
+
+ /* Get mem for response or fail*/
+ if (NULL == (rsp = alloc_http_response()))
+ {
+ return cgi_error_memory();
+ }
- if (NULL == (rsp->status = strdup("501 Not Implemented")))
- {
- free_http_response(rsp);
- return cgi_error_memory();
- }
+ if (NULL == (rsp->status = strdup("501 Not Implemented")))
+ {
+ free_http_response(rsp);
+ return cgi_error_memory();
+ }
- rsp->is_static = 1;
- return(finish_http_response(rsp));
+ rsp->is_static = 1;
+ rsp->reason = RSP_REASON_UNSUPPORTED;
+
+ return(finish_http_response(csp, rsp));
+ }
}
}
}