-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 $
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];
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)
"Content-Type: text/html\r\n"
"\r\n";
cgi_error_memory_response->body =
- "<html>\r\n"
- "<head>\r\n"
- " <title>500 Internal Privoxy Error</title>\r\n"
+ "<html>\n"
+ "<head>\n"
+ " <title>500 Internal Privoxy Error</title>\n"
" <link rel=\"shortcut icon\" href=\"" CGI_PREFIX "error-favicon.ico\" type=\"image/x-icon\">"
- "</head>\r\n"
- "<body>\r\n"
- "<h1>500 Internal Privoxy Error</h1>\r\n"
- "<p>Privoxy <b>ran out of memory</b> while processing your request.</p>\r\n"
- "<p>Please contact your proxy administrator, or try again later</p>\r\n"
- "</body>\r\n"
- "</html>\r\n";
+ "</head>\n"
+ "<body>\n"
+ "<h1>500 Internal Privoxy Error</h1>\n"
+ "<p>Privoxy <b>ran out of memory</b> while processing your request.</p>\n"
+ "<p>Please contact your proxy administrator, or try again later</p>\n"
+ "</body>\n"
+ "</html>\n";
cgi_error_memory_response->head_length =
strlen(cgi_error_memory_response->head);
static const char status[] =
"500 Internal Privoxy Error";
static const char body_prefix[] =
- "<html>\r\n"
- "<head>\r\n"
- " <title>500 Internal Privoxy Error</title>\r\n"
+ "<html>\n"
+ "<head>\n"
+ " <title>500 Internal Privoxy Error</title>\n"
" <link rel=\"shortcut icon\" href=\"" CGI_PREFIX "error-favicon.ico\" type=\"image/x-icon\">"
- "</head>\r\n"
- "<body>\r\n"
- "<h1>500 Internal Privoxy Error</h1>\r\n"
- "<p>Privoxy encountered an error while processing your request:</p>\r\n"
+ "</head>\n"
+ "<body>\n"
+ "<h1>500 Internal Privoxy Error</h1>\n"
+ "<p>Privoxy encountered an error while processing your request:</p>\n"
"<p><b>Could not load template file <code>";
static const char body_suffix[] =
- "</code> or one of its included components.</b></p>\r\n"
- "<p>Please contact your proxy administrator.</p>\r\n"
+ "</code> or one of its included components.</b></p>\n"
+ "<p>Please contact your proxy administrator.</p>\n"
"<p>If you are the proxy administrator, please put the required file(s)"
"in the <code><i>(confdir)</i>/templates</code> directory. The "
"location of the <code><i>(confdir)</i></code> directory "
#ifndef _WIN32
", or <code>/etc/privoxy/</code>"
#endif /* ndef _WIN32 */
- ").</p>\r\n"
- "</body>\r\n"
- "</html>\r\n";
+ ").</p>\n"
+ "</body>\n"
+ "</html>\n";
const size_t body_size = strlen(body_prefix) + strlen(template_name) + strlen(body_suffix) + 1;
assert(csp);
static const char status[] =
"500 Internal Privoxy Error";
static const char body_prefix[] =
- "<html>\r\n"
- "<head>\r\n"
- " <title>500 Internal Privoxy Error</title>\r\n"
+ "<html>\n"
+ "<head>\n"
+ " <title>500 Internal Privoxy Error</title>\n"
" <link rel=\"shortcut icon\" href=\"" CGI_PREFIX "error-favicon.ico\" type=\"image/x-icon\">"
- "</head>\r\n"
- "<body>\r\n"
- "<h1>500 Internal Privoxy Error</h1>\r\n"
- "<p>Privoxy encountered an error while processing your request:</p>\r\n"
+ "</head>\n"
+ "<body>\n"
+ "<h1>500 Internal Privoxy Error</h1>\n"
+ "<p>Privoxy encountered an error while processing your request:</p>\n"
"<p><b>Unexpected internal error: ";
static const char body_suffix[] =
- "</b></p>\r\n"
+ "</b></p>\n"
"<p>Please "
"<a href=\"http://sourceforge.net/tracker/?group_id=11118&atid=111118\">"
- "file a bug report</a>.</p>\r\n"
- "</body>\r\n"
- "</html>\r\n";
+ "file a bug report</a>.</p>\n"
+ "</body>\n"
+ "</html>\n";
/* Includes room for larger error numbers in the future. */
const size_t body_size = sizeof(body_prefix) + sizeof(body_suffix) + 5;
assert(csp);
* 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)
}
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;
#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
struct map * exports;
int local_help_exists = 0;
char *ip_address = NULL;
+ char *port = NULL;
char *hostname = NULL;
assert(csp);
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);
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);
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");