X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=cgi.c;h=e377ad2931899e12434c2784688b50f8afbef874;hb=460cbef0b136baa4ca9d590884503859dac16661;hp=925063d5a32b30fbd8629762467b019e06ad00ca;hpb=933b48ce6989346cf7c3afcfd00894152f7fd191;p=privoxy.git diff --git a/cgi.c b/cgi.c index 925063d5..e377ad29 100644 --- a/cgi.c +++ b/cgi.c @@ -1,4 +1,4 @@ -const char cgi_rcs[] = "$Id: cgi.c,v 1.89 2007/01/23 15:51:16 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,13 @@ const char cgi_rcs[] = "$Id: cgi.c,v 1.89 2007/01/23 15:51:16 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(). + * * Revision 1.89 2007/01/23 15:51:16 fabiankeil * Add favicon delivery functions. * @@ -1063,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 { @@ -1451,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); } @@ -1519,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" @@ -1583,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" @@ -1666,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" @@ -1909,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 @@ -1917,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; @@ -1949,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, @@ -2109,9 +2145,8 @@ void free_http_response(struct http_response *rsp) * Function : template_load * * Description : CGI support function that loads a given HTML - * template from the confdir, ignoring comment - * lines and following #include statements up to - * a depth of 1. + * template, ignoring comment lines and following + * #include statements up to a depth of 1. * * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) @@ -2158,11 +2193,23 @@ jb_err template_load(struct client_state *csp, char **template_ptr, } } - /* Generate full path */ + /* + * Generate full path using either templdir + * or confdir/templates as base directory. + */ + if (NULL != csp->config->templdir) + { + templates_dir_path = strdup(csp->config->templdir); + } + else + { + templates_dir_path = make_path(csp->config->confdir, "templates"); + } - templates_dir_path = make_path(csp->config->confdir, "templates"); if (templates_dir_path == NULL) { + log_error(LOG_LEVEL_ERROR, "Out of memory while generating template path for %s.", + templatename); return JB_ERR_MEMORY; } @@ -2170,6 +2217,8 @@ jb_err template_load(struct client_state *csp, char **template_ptr, free(templates_dir_path); if (full_path == NULL) { + log_error(LOG_LEVEL_ERROR, "Out of memory while generating full template path for %s.", + templatename); return JB_ERR_MEMORY; } @@ -2178,6 +2227,7 @@ jb_err template_load(struct client_state *csp, char **template_ptr, file_buffer = strdup(""); if (file_buffer == NULL) { + log_error(LOG_LEVEL_ERROR, "Not enough free memory to buffer %s.", full_path); free(full_path); return JB_ERR_MEMORY; }