From f5e468e33c017f857da32b17e2940b9e79c8f202 Mon Sep 17 00:00:00 2001 From: Fabian Keil Date: Sun, 28 Jan 2007 13:41:18 +0000 Subject: [PATCH] - Add HEAD support to finish_http_response. - Add error favicon to internal HTML error messages. --- cgi.c | 49 +++++++++++++++++++++++++++++++++++++++++-------- cgi.h | 10 +++++++--- filters.c | 14 +++++++++----- 3 files changed, 57 insertions(+), 16 deletions(-) diff --git a/cgi.c b/cgi.c index 7ca1d2cd..e377ad29 100644 --- a/cgi.c +++ b/cgi.c @@ -1,4 +1,4 @@ -const char cgi_rcs[] = "$Id: cgi.c,v 1.90 2007/01/25 13:47:26 fabiankeil Exp $"; +const char cgi_rcs[] = "$Id: cgi.c,v 1.91 2007/01/27 13:09:16 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/cgi.c,v $ @@ -38,6 +38,10 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.90 2007/01/25 13:47:26 fabiankeil Exp $"; * * Revisions : * $Log: cgi.c,v $ + * Revision 1.91 2007/01/27 13:09:16 fabiankeil + * Add new config option "templdir" to + * change the templates directory. + * * Revision 1.90 2007/01/25 13:47:26 fabiankeil * Added "forwarding-failed" template support for error_response(). * @@ -1066,7 +1070,7 @@ static struct http_response *dispatch_known_cgi(struct client_state * csp, if (!err) { /* It worked */ - return finish_http_response(rsp); + return finish_http_response(csp, rsp); } else { @@ -1454,7 +1458,7 @@ struct http_response *error_response(struct client_state *csp, return cgi_error_memory(); } - return finish_http_response(rsp); + return finish_http_response(csp, rsp); } @@ -1522,7 +1526,10 @@ void cgi_init_error_messages(void) "\r\n"; cgi_error_memory_response->body = "\r\n" - "500 Internal Privoxy Error\r\n" + "\r\n" + " 500 Internal Privoxy Error\r\n" + " " + "\r\n" "\r\n" "

500 Internal Privoxy Error

\r\n" "

Privoxy ran out of memory while processing your request.

\r\n" @@ -1586,7 +1593,10 @@ jb_err cgi_error_no_template(struct client_state *csp, "500 Internal Privoxy Error"; static const char body_prefix[] = "\r\n" - "500 Internal Privoxy Error\r\n" + "\r\n" + " 500 Internal Privoxy Error\r\n" + " " + "\r\n" "\r\n" "

500 Internal Privoxy Error

\r\n" "

Privoxy encountered an error while processing your request:

\r\n" @@ -1669,7 +1679,10 @@ jb_err cgi_error_unknown(struct client_state *csp, "500 Internal Privoxy Error"; static const char body_prefix[] = "\r\n" - "500 Internal Privoxy Error\r\n" + "\r\n" + " 500 Internal Privoxy Error\r\n" + " " + "\r\n" "\r\n" "

500 Internal Privoxy Error

\r\n" "

Privoxy encountered an error while processing your request:

\r\n" @@ -1912,6 +1925,8 @@ void get_http_time(int time_offset, char *buf) * * Description : Fill in the missing headers in an http response, * and flatten the headers to an http head. + * For HEAD requests the body is freed once + * the Content-Length header is set. * * Parameters : * 1 : rsp = pointer to http_response to be processed @@ -1920,7 +1935,7 @@ void get_http_time(int time_offset, char *buf) * On error, free()s rsp and returns cgi_error_memory() * *********************************************************************/ -struct http_response *finish_http_response(struct http_response *rsp) +struct http_response *finish_http_response(const struct client_state *csp, struct http_response *rsp) { char buf[BUFFER_SIZE]; jb_err err; @@ -1952,7 +1967,25 @@ struct http_response *finish_http_response(struct http_response *rsp) err = enlist(rsp->headers, buf); } - if (strncmpic(rsp->status, "302", 3)) + if (0 == strcmpic(csp->http->gpc, "head")) + { + /* + * The client only asked for the head. Dispose + * the body and log an offensive message. + * + * While it may seem to be a bit inefficient to + * prepare the body if it isn't needed, it's the + * only way to get the Content-Length right for + * dynamic pages. We could have disposed the body + * earlier, but not without duplicating the + * Content-Length setting code above. + */ + log_error(LOG_LEVEL_CGI, "Preparing to give head to %s.", csp->ip_addr_str); + freez(rsp->body); + rsp->content_length = 0; + } + + if ((rsp->status != NULL) && strncmpic(rsp->status, "302", 3)) { /* * If it's not a redirect without any content, diff --git a/cgi.h b/cgi.h index 64195031..73442cf1 100644 --- a/cgi.h +++ b/cgi.h @@ -1,6 +1,6 @@ #ifndef CGI_H_INCLUDED #define CGI_H_INCLUDED -#define CGI_H_VERSION "$Id: cgi.h,v 1.31 2006/07/18 14:48:45 david__schmidt Exp $" +#define CGI_H_VERSION "$Id: cgi.h,v 1.32 2006/12/17 17:53:39 fabiankeil Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/cgi.h,v $ @@ -11,7 +11,7 @@ * Functions declared include: * * - * Copyright : Written by and Copyright (C) 2001 the SourceForge + * Copyright : Written by and Copyright (C) 2001-2007 the SourceForge * Privoxy team. http://www.privoxy.org/ * * Based on the Internet Junkbuster originally written @@ -38,6 +38,9 @@ * * Revisions : * $Log: cgi.h,v $ + * Revision 1.32 2006/12/17 17:53:39 fabiankeil + * Suppress the toggle link if remote toggling is disabled. + * * Revision 1.31 2006/07/18 14:48:45 david__schmidt * Reorganizing the repository: swapping out what was HEAD (the old 3.1 branch) * with what was really the latest development (the v_3_0_branch branch) @@ -200,7 +203,8 @@ extern struct http_response * error_response(struct client_state *csp, extern struct http_response * alloc_http_response(void); extern void free_http_response(struct http_response *rsp); -extern struct http_response *finish_http_response(struct http_response *rsp); +extern struct http_response *finish_http_response(const struct client_state *csp, + struct http_response *rsp); extern struct map * default_exports(const struct client_state *csp, const char *caller); diff --git a/filters.c b/filters.c index 36eccf41..be4cb65f 100644 --- a/filters.c +++ b/filters.c @@ -1,4 +1,4 @@ -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.77 2007/01/12 15:36:44 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/filters.c,v $ @@ -40,6 +40,10 @@ const char filters_rcs[] = "$Id: filters.c,v 1.76 2007/01/01 19:36:37 fabiankeil * * Revisions : * $Log: filters.c,v $ + * 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). @@ -1014,7 +1018,7 @@ struct http_response *block_url(struct client_state *csp) } } - return finish_http_response(rsp); + return finish_http_response(csp, rsp); } @@ -1161,7 +1165,7 @@ struct http_response *trust_url(struct client_state *csp) return cgi_error_memory(); } - return finish_http_response(rsp); + return finish_http_response(csp, rsp); } #endif /* def FEATURE_TRUST */ @@ -1463,7 +1467,7 @@ struct http_response *redirect_url(struct client_state *csp) return cgi_error_memory(); } freez(new_url); - return finish_http_response(rsp); + return finish_http_response(csp, rsp); } } @@ -2259,7 +2263,7 @@ struct http_response *direct_response(struct client_state *csp) } rsp->is_static = 1; - return(finish_http_response(rsp)); + return(finish_http_response(csp, rsp)); } } } -- 2.39.2