X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=filters.c;h=e58d7197c976d7512002532586c730f7fd6367d1;hb=7939028dfbc9fb296d46ff88d2d5d3febd777c9a;hp=be4cb65f8ce181c218c9b97648373ebaf35e236d;hpb=f5e468e33c017f857da32b17e2940b9e79c8f202;p=privoxy.git diff --git a/filters.c b/filters.c index be4cb65f..e58d7197 100644 --- a/filters.c +++ b/filters.c @@ -1,4 +1,4 @@ -const char filters_rcs[] = "$Id: filters.c,v 1.77 2007/01/12 15:36:44 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 $ @@ -13,7 +13,7 @@ const char filters_rcs[] = "$Id: filters.c,v 1.77 2007/01/12 15:36:44 fabiankeil * `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 @@ -40,6 +40,15 @@ const char filters_rcs[] = "$Id: filters.c,v 1.77 2007/01/12 15:36:44 fabiankeil * * 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. @@ -974,7 +983,7 @@ struct http_response *block_url(struct client_state *csp) } else { - rsp->status = strdup("404 Request for blocked URL"); + rsp->status = strdup("403 Request for blocked URL"); } if (rsp->status == NULL) @@ -1017,6 +1026,7 @@ struct http_response *block_url(struct client_state *csp) return cgi_error_memory(); } } + rsp->reason = RSP_REASON_BLOCKED; return finish_http_response(csp, rsp); @@ -1164,6 +1174,7 @@ struct http_response *trust_url(struct client_state *csp) free_http_response(rsp); return cgi_error_memory(); } + rsp->reason = RSP_REASON_UNTRUSTED; return finish_http_response(csp, rsp); } @@ -1466,7 +1477,9 @@ struct http_response *redirect_url(struct client_state *csp) free_http_response(rsp); return cgi_error_memory(); } + rsp->reason = RSP_REASON_REDIRECTED; freez(new_url); + return finish_http_response(csp, rsp); } } @@ -1656,6 +1669,7 @@ int is_untrusted_url(const struct client_state *csp) return 0; } } + return 1; } #endif /* def FEATURE_TRUST */ @@ -1749,19 +1763,24 @@ char *pcrs_filter_response(struct client_state *csp) * 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"); @@ -2241,29 +2260,42 @@ struct http_response *direct_response(struct client_state *csp) { 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 */ - - log_error(LOG_LEVEL_HEADER, "Found Max-Forwards:0 in OPTIONS or TRACE request -- Returning 501"); + unsigned int max_forwards; - /* 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(csp, rsp)); + rsp->is_static = 1; + rsp->reason = RSP_REASON_UNSUPPORTED; + + return(finish_http_response(csp, rsp)); + } } } }