X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=cgi.c;h=a55805b4ee248b91819a1561ddcfe141405919b4;hp=96af186c014d28f5010b080587f94d385cdade7e;hb=e017e65893248c76029eda74da488939e6f0fe62;hpb=22fdfb820f45adb31eb69b0b08e628c3512902d9 diff --git a/cgi.c b/cgi.c index 96af186c..a55805b4 100644 --- a/cgi.c +++ b/cgi.c @@ -1,4 +1,4 @@ -const char cgi_rcs[] = "$Id: cgi.c,v 1.131 2011/06/23 14:01:01 fabiankeil Exp $"; +const char cgi_rcs[] = "$Id: cgi.c,v 1.140 2011/07/08 13:28:11 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/cgi.c,v $ @@ -271,6 +271,13 @@ const char image_blank_data[] = const size_t image_pattern_length = sizeof(image_pattern_data) - 1; const size_t image_blank_length = sizeof(image_blank_data) - 1; +#ifdef FEATURE_COMPRESSION +/* + * Minimum length which a buffer has to reach before + * we bother to (re-)compress it. Completely arbitrary. + */ +const size_t LOWER_LENGTH_LIMIT_FOR_COMPRESSION = 1024U; +#endif static struct http_response cgi_error_memory_response[1]; @@ -551,7 +558,9 @@ static struct http_response *dispatch_known_cgi(struct client_state * csp, if (err && (err != JB_ERR_MEMORY)) { /* Unexpected error! Shouldn't get here */ - log_error(LOG_LEVEL_ERROR, "Unexpected CGI error %d in top-level handler. Please file a bug report!", err); + log_error(LOG_LEVEL_ERROR, + "Unexpected CGI error %d in top-level handler. " + "Please file a bug report!", err); err = cgi_error_unknown(csp, rsp, err); } if (!err) @@ -1041,17 +1050,17 @@ void cgi_init_error_messages(void) "Content-Type: text/html\r\n" "\r\n"; cgi_error_memory_response->body = - "\r\n" - "\r\n" - " 500 Internal Privoxy Error\r\n" + "\n" + "\n" + " 500 Internal Privoxy Error\n" " " - "\r\n" - "\r\n" - "

500 Internal Privoxy Error

\r\n" - "

Privoxy ran out of memory while processing your request.

\r\n" - "

Please contact your proxy administrator, or try again later

\r\n" - "\r\n" - "\r\n"; + "\n" + "\n" + "

500 Internal Privoxy Error

\n" + "

Privoxy ran out of memory while processing your request.

\n" + "

Please contact your proxy administrator, or try again later

\n" + "\n" + "\n"; cgi_error_memory_response->head_length = strlen(cgi_error_memory_response->head); @@ -1109,18 +1118,18 @@ jb_err cgi_error_no_template(const struct client_state *csp, static const char status[] = "500 Internal Privoxy Error"; static const char body_prefix[] = - "\r\n" - "\r\n" - " 500 Internal Privoxy Error\r\n" + "\n" + "\n" + " 500 Internal Privoxy Error\n" " " - "\r\n" - "\r\n" - "

500 Internal Privoxy Error

\r\n" - "

Privoxy encountered an error while processing your request:

\r\n" + "\n" + "\n" + "

500 Internal Privoxy Error

\n" + "

Privoxy encountered an error while processing your request:

\n" "

Could not load template file "; static const char body_suffix[] = - " or one of its included components.

\r\n" - "

Please contact your proxy administrator.

\r\n" + " or one of its included components.

\n" + "

Please contact your proxy administrator.

\n" "

If you are the proxy administrator, please put the required file(s)" "in the (confdir)/templates directory. The " "location of the (confdir) directory " @@ -1129,9 +1138,9 @@ jb_err cgi_error_no_template(const struct client_state *csp, #ifndef _WIN32 ", or /etc/privoxy/" #endif /* ndef _WIN32 */ - ").

\r\n" - "\r\n" - "\r\n"; + ").

\n" + "\n" + "\n"; const size_t body_size = strlen(body_prefix) + strlen(template_name) + strlen(body_suffix) + 1; assert(csp); @@ -1196,22 +1205,22 @@ jb_err cgi_error_unknown(const struct client_state *csp, static const char status[] = "500 Internal Privoxy Error"; static const char body_prefix[] = - "\r\n" - "\r\n" - " 500 Internal Privoxy Error\r\n" + "\n" + "\n" + " 500 Internal Privoxy Error\n" " " - "\r\n" - "\r\n" - "

500 Internal Privoxy Error

\r\n" - "

Privoxy encountered an error while processing your request:

\r\n" + "\n" + "\n" + "

500 Internal Privoxy Error

\n" + "

Privoxy encountered an error while processing your request:

\n" "

Unexpected internal error: "; static const char body_suffix[] = - "

\r\n" + "

\n" "

Please " "" - "file a bug report.

\r\n" - "\r\n" - "\r\n"; + "file a bug report.

\n" + "\n" + "\n"; /* Includes room for larger error numbers in the future. */ const size_t body_size = sizeof(body_prefix) + sizeof(body_suffix) + 5; assert(csp); @@ -1486,22 +1495,31 @@ static void get_locale_time(char *buf, size_t buffer_size) * Allocates a new buffer for the result, free'ing it is * up to the caller. * - * XXX: We should add a config option for the - * compression level. - * - * * Parameters : * 1 : buffer = buffer whose content should be compressed * 2 : buffer_length = length of the buffer + * 3 : compression_level = compression level for compress2() * * Returns : NULL on error, otherwise a pointer to the compressed * content of the input buffer. * *********************************************************************/ -char *compress_buffer(char *buffer, size_t *buffer_length) +char *compress_buffer(char *buffer, size_t *buffer_length, int compression_level) { char *compressed_buffer; - size_t new_length = *buffer_length; + size_t new_length; + assert(-1 <= compression_level && compression_level <= 9); + + /* + * If the compression level is 0 or if the entropy + * is high, the "compressing" data will take more + * room then the uncompressed data due to the zlib + * overhead. + * + * XXX: The overhead isn't constant and 30 bytes + * may not be enough for everybody + */ + new_length = *buffer_length + 30; compressed_buffer = malloc(new_length); if (NULL == compressed_buffer) @@ -1511,15 +1529,18 @@ char *compress_buffer(char *buffer, size_t *buffer_length) } if (Z_OK != compress2((Bytef *)compressed_buffer, &new_length, - (Bytef *)buffer, *buffer_length, Z_DEFAULT_COMPRESSION)) + (Bytef *)buffer, *buffer_length, compression_level)) { - log_error(LOG_LEVEL_ERROR, "Error in compress2()"); + log_error(LOG_LEVEL_ERROR, + "compress2() failed. Buffer size: %d, compression level: %d.", + new_length, compression_level); freez(compressed_buffer); return NULL; } log_error(LOG_LEVEL_RE_FILTER, - "Compressed content from %d to %d bytes.", *buffer_length, new_length); + "Compressed content from %d to %d bytes. Compression level: %d", + *buffer_length, new_length, compression_level); *buffer_length = new_length; @@ -1577,17 +1598,18 @@ struct http_response *finish_http_response(const struct client_state *csp, struc #ifdef FEATURE_COMPRESSION if (!err && (csp->flags & CSP_FLAG_CLIENT_SUPPORTS_DEFLATE) - && (rsp->content_length > LOWER_LENGTH_LIMIT_FOR_COMRPESSION)) + && (rsp->content_length > LOWER_LENGTH_LIMIT_FOR_COMPRESSION)) { char *compressed_content; - compressed_content = compress_buffer(rsp->body, &rsp->content_length); + compressed_content = compress_buffer(rsp->body, &rsp->content_length, + csp->config->compression_level); if (NULL != compressed_content) { freez(rsp->body); rsp->body = compressed_content; + err = enlist_unique_header(rsp->headers, "Content-Encoding", "deflate"); } - err = enlist_unique_header(rsp->headers, "Content-Encoding", "deflate"); } #endif @@ -2121,6 +2143,7 @@ struct map *default_exports(const struct client_state *csp, const char *caller) struct map * exports; int local_help_exists = 0; char *ip_address = NULL; + char *port = NULL; char *hostname = NULL; assert(csp); @@ -2133,12 +2156,12 @@ struct map *default_exports(const struct client_state *csp, const char *caller) if (csp->config->hostname) { - get_host_information(csp->cfd, &ip_address, NULL); + get_host_information(csp->cfd, &ip_address, &port, NULL); hostname = strdup(csp->config->hostname); } else { - get_host_information(csp->cfd, &ip_address, &hostname); + get_host_information(csp->cfd, &ip_address, &port, &hostname); } err = map(exports, "version", 1, html_encode(VERSION), 0); @@ -2146,6 +2169,8 @@ struct map *default_exports(const struct client_state *csp, const char *caller) if (!err) err = map(exports, "time", 1, html_encode(buf), 0); if (!err) err = map(exports, "my-ip-address", 1, html_encode(ip_address ? ip_address : "unknown"), 0); freez(ip_address); + if (!err) err = map(exports, "my-port", 1, html_encode(port ? port : "unkown"), 0); + freez(port); if (!err) err = map(exports, "my-hostname", 1, html_encode(hostname ? hostname : "unknown"), 0); freez(hostname); if (!err) err = map(exports, "homepage", 1, html_encode(HOME_PAGE_URL), 0); @@ -2170,9 +2195,6 @@ struct map *default_exports(const struct client_state *csp, const char *caller) if (!err) err = map_block_killer(exports, "can-toggle"); #endif - snprintf(buf, sizeof(buf), "%d", csp->config->hport); - if (!err) err = map(exports, "my-port", 1, buf, 1); - if(!strcmp(CODE_STATUS, "stable")) { if (!err) err = map_block_killer(exports, "unstable");