projects
/
privoxy.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Let the dok-webserver target inject the new logo into the homepage
[privoxy.git]
/
parsers.c
diff --git
a/parsers.c
b/parsers.c
index
f83fa04
..
eab5e76
100644
(file)
--- a/
parsers.c
+++ b/
parsers.c
@@
-68,7
+68,7
@@
#include <brotli/decode.h>
#endif
#include <brotli/decode.h>
#endif
-#if !defined(_WIN32)
&& !defined(__OS2__)
+#if !defined(_WIN32)
#include <unistd.h>
#endif
#include <unistd.h>
#endif
@@
-87,6
+87,9
@@
#include "list.h"
#include "actions.h"
#include "filters.h"
#include "list.h"
#include "actions.h"
#include "filters.h"
+#ifdef FEATURE_HTTPS_INSPECTION
+#include "ssl.h"
+#endif
#ifndef HAVE_STRPTIME
#include "strptime.h"
#ifndef HAVE_STRPTIME
#include "strptime.h"
@@
-138,10
+141,10
@@
static jb_err server_save_content_length(struct client_state *csp, char **header
static jb_err server_keep_alive(struct client_state *csp, char **header);
static jb_err server_proxy_connection(struct client_state *csp, char **header);
static jb_err client_keep_alive(struct client_state *csp, char **header);
static jb_err server_keep_alive(struct client_state *csp, char **header);
static jb_err server_proxy_connection(struct client_state *csp, char **header);
static jb_err client_keep_alive(struct client_state *csp, char **header);
-static jb_err client_save_content_length(struct client_state *csp, char **header);
static jb_err client_proxy_connection(struct client_state *csp, char **header);
#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
static jb_err client_proxy_connection(struct client_state *csp, char **header);
#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
+static jb_err client_save_content_length(struct client_state *csp, char **header);
static jb_err client_host_adder (struct client_state *csp);
static jb_err client_xtra_adder (struct client_state *csp);
static jb_err client_x_forwarded_for_adder(struct client_state *csp);
static jb_err client_host_adder (struct client_state *csp);
static jb_err client_xtra_adder (struct client_state *csp);
static jb_err client_x_forwarded_for_adder(struct client_state *csp);
@@
-185,9
+188,9
@@
static const struct parsers client_patterns[] = {
{ "TE:", 3, client_te },
{ "Host:", 5, client_host },
{ "if-modified-since:", 18, client_if_modified_since },
{ "TE:", 3, client_te },
{ "Host:", 5, client_host },
{ "if-modified-since:", 18, client_if_modified_since },
+ { "Content-Length:", 15, client_save_content_length },
#ifdef FEATURE_CONNECTION_KEEP_ALIVE
{ "Keep-Alive:", 11, client_keep_alive },
#ifdef FEATURE_CONNECTION_KEEP_ALIVE
{ "Keep-Alive:", 11, client_keep_alive },
- { "Content-Length:", 15, client_save_content_length },
{ "Proxy-Connection:", 17, client_proxy_connection },
#else
{ "Keep-Alive:", 11, crumble },
{ "Proxy-Connection:", 17, client_proxy_connection },
#else
{ "Keep-Alive:", 11, crumble },
@@
-323,7
+326,7
@@
jb_err add_to_iob(struct iob *iob, const size_t buffer_limit, char *src, long n)
if (need > buffer_limit)
{
log_error(LOG_LEVEL_INFO,
if (need > buffer_limit)
{
log_error(LOG_LEVEL_INFO,
- "Buffer limit reached while extending the buffer (iob). Needed: %
d. Limit: %d
",
+ "Buffer limit reached while extending the buffer (iob). Needed: %
lu. Limit: %lu
",
need, buffer_limit);
return JB_ERR_MEMORY;
}
need, buffer_limit);
return JB_ERR_MEMORY;
}
@@
-381,8
+384,7
@@
jb_err add_to_iob(struct iob *iob, const size_t buffer_limit, char *src, long n)
* Parameters :
* 1 : iob = I/O buffer to clear.
*
* Parameters :
* 1 : iob = I/O buffer to clear.
*
- * Returns : JB_ERR_OK on success, JB_ERR_MEMORY if out-of-memory
- * or buffer limit reached.
+ * Returns : N/A
*
*********************************************************************/
void clear_iob(struct iob *iob)
*
*********************************************************************/
void clear_iob(struct iob *iob)
@@
-438,7
+440,7
@@
static jb_err decompress_iob_with_brotli(struct client_state *csp)
if (decoded_buffer == NULL)
{
log_error(LOG_LEVEL_ERROR,
if (decoded_buffer == NULL)
{
log_error(LOG_LEVEL_ERROR,
- "Failed to allocate %
d
bytes for Brotli decompression",
+ "Failed to allocate %
lu
bytes for Brotli decompression",
decoded_buffer_size);
return JB_ERR_MEMORY;
}
decoded_buffer_size);
return JB_ERR_MEMORY;
}
@@
-459,7
+461,7
@@
static jb_err decompress_iob_with_brotli(struct client_state *csp)
csp->iob->size = decoded_buffer_size;
log_error(LOG_LEVEL_RE_FILTER,
csp->iob->size = decoded_buffer_size;
log_error(LOG_LEVEL_RE_FILTER,
- "Decompression successful. Old size: %
d, new size: %d
.",
+ "Decompression successful. Old size: %
lu, new size: %lu
.",
encoded_size, decoded_size);
return JB_ERR_OK;
encoded_size, decoded_size);
return JB_ERR_OK;
@@
-524,7
+526,7
@@
jb_err decompress_iob(struct client_state *csp)
* but it should(?) be valid for deflated data also.
*/
log_error(LOG_LEVEL_ERROR,
* but it should(?) be valid for deflated data also.
*/
log_error(LOG_LEVEL_ERROR,
- "Insufficient data to start decompression. Bytes in buffer: %d",
+ "Insufficient data to start decompression. Bytes in buffer: %
l
d",
csp->iob->eod - csp->iob->cur);
return JB_ERR_COMPRESS;
}
csp->iob->eod - csp->iob->cur);
return JB_ERR_COMPRESS;
}
@@
-725,6
+727,7
@@
jb_err decompress_iob(struct client_state *csp)
{
log_error(LOG_LEVEL_ERROR, "Buffer limit reached while decompressing iob");
freez(buf);
{
log_error(LOG_LEVEL_ERROR, "Buffer limit reached while decompressing iob");
freez(buf);
+ inflateEnd(&zstr);
return JB_ERR_MEMORY;
}
return JB_ERR_MEMORY;
}
@@
-743,6
+746,7
@@
jb_err decompress_iob(struct client_state *csp)
{
log_error(LOG_LEVEL_ERROR, "Out of memory decompressing iob");
freez(buf);
{
log_error(LOG_LEVEL_ERROR, "Out of memory decompressing iob");
freez(buf);
+ inflateEnd(&zstr);
return JB_ERR_MEMORY;
}
else
return JB_ERR_MEMORY;
}
else
@@
-813,7
+817,7
@@
jb_err decompress_iob(struct client_state *csp)
* Make sure the new uncompressed iob obeys some minimal
* consistency conditions.
*/
* Make sure the new uncompressed iob obeys some minimal
* consistency conditions.
*/
- if ((csp->iob->buf <=
csp->iob->cur)
+ if ((csp->iob->buf <= csp->iob->cur)
&& (csp->iob->cur <= csp->iob->eod)
&& (csp->iob->eod <= csp->iob->buf + csp->iob->size))
{
&& (csp->iob->cur <= csp->iob->eod)
&& (csp->iob->eod <= csp->iob->buf + csp->iob->size))
{
@@
-821,7
+825,7
@@
jb_err decompress_iob(struct client_state *csp)
if (new_size > (size_t)0)
{
log_error(LOG_LEVEL_RE_FILTER,
if (new_size > (size_t)0)
{
log_error(LOG_LEVEL_RE_FILTER,
- "Decompression successful. Old size: %
d, new size: %d
.",
+ "Decompression successful. Old size: %
lu, new size: %lu
.",
old_size, new_size);
}
else
old_size, new_size);
}
else
@@
-834,10
+838,7
@@
jb_err decompress_iob(struct client_state *csp)
else
{
/* It seems that zlib did something weird. */
else
{
/* It seems that zlib did something weird. */
- log_error(LOG_LEVEL_ERROR,
- "Unexpected error decompressing the buffer (iob): %d==%d, %d>%d, %d<%d",
- csp->iob->cur, csp->iob->buf + skip_size, csp->iob->eod, csp->iob->buf,
- csp->iob->eod, csp->iob->buf + csp->iob->size);
+ log_error(LOG_LEVEL_ERROR, "Inconsistent buffer after decompression");
return JB_ERR_COMPRESS;
}
return JB_ERR_COMPRESS;
}
@@
-1515,7
+1516,7
@@
static jb_err header_tagger(struct client_state *csp, char *header)
assert(NULL != header);
log_error(LOG_LEVEL_ERROR,
"Problems with tagger \'%s\' and header \'%s\': %s",
assert(NULL != header);
log_error(LOG_LEVEL_ERROR,
"Problems with tagger \'%s\' and header \'%s\': %s",
- b->name,
*
header, pcrs_strerror(hits));
+ b->name, header, pcrs_strerror(hits));
}
freez(modified_tag);
}
}
freez(modified_tag);
}
@@
-1546,7
+1547,7
@@
static jb_err header_tagger(struct client_state *csp, char *header)
log_error(LOG_LEVEL_ERROR,
"Insufficient memory to add tag \'%s\', "
"based on tagger \'%s\' and header \'%s\'",
log_error(LOG_LEVEL_ERROR,
"Insufficient memory to add tag \'%s\', "
"based on tagger \'%s\' and header \'%s\'",
- tag, b->name,
*
header);
+ tag, b->name, header);
}
else
{
}
else
{
@@
-1666,7
+1667,7
@@
static jb_err filter_header(struct client_state *csp, char **header)
continue;
}
continue;
}
- log_error(LOG_LEVEL_RE_FILTER, "filtering \'%s\' (size %
d
) with \'%s\' ...",
+ log_error(LOG_LEVEL_RE_FILTER, "filtering \'%s\' (size %
lu
) with \'%s\' ...",
*header, size, b->name);
/* Apply all jobs from the joblist */
*header, size, b->name);
/* Apply all jobs from the joblist */
@@
-1700,7
+1701,8
@@
static jb_err filter_header(struct client_state *csp, char **header)
if (b->dynamic) pcrs_free_joblist(joblist);
if (b->dynamic) pcrs_free_joblist(joblist);
- log_error(LOG_LEVEL_RE_FILTER, "... produced %d hits (new size %d).", current_hits, size);
+ log_error(LOG_LEVEL_RE_FILTER,
+ "... produced %d hits (new size %lu).", current_hits, size);
hits += current_hits;
}
hits += current_hits;
}
@@
-1848,6
+1850,7
@@
static jb_err server_proxy_connection(struct client_state *csp, char **header)
csp->flags |= CSP_FLAG_SERVER_PROXY_CONNECTION_HEADER_SET;
return JB_ERR_OK;
}
csp->flags |= CSP_FLAG_SERVER_PROXY_CONNECTION_HEADER_SET;
return JB_ERR_OK;
}
+#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
/*********************************************************************
/*********************************************************************
@@
-1880,6
+1883,7
@@
static jb_err proxy_authentication(struct client_state *csp, char **header)
}
}
+#ifdef FEATURE_CONNECTION_KEEP_ALIVE
/*********************************************************************
*
* Function : client_keep_alive
/*********************************************************************
*
* Function : client_keep_alive
@@
-1946,6
+1950,7
@@
static jb_err client_keep_alive(struct client_state *csp, char **header)
return JB_ERR_OK;
}
return JB_ERR_OK;
}
+#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
/*********************************************************************
/*********************************************************************
@@
-2018,8
+2023,6
@@
static jb_err client_save_content_length(struct client_state *csp, char **header
return JB_ERR_OK;
}
return JB_ERR_OK;
}
-#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
-
/*********************************************************************
/*********************************************************************
@@
-2048,7
+2051,11
@@
static jb_err client_connection(struct client_state *csp, char **header)
{
#ifdef FEATURE_CONNECTION_KEEP_ALIVE
if ((csp->config->feature_flags & RUNTIME_FEATURE_CONNECTION_SHARING)
{
#ifdef FEATURE_CONNECTION_KEEP_ALIVE
if ((csp->config->feature_flags & RUNTIME_FEATURE_CONNECTION_SHARING)
- && !(csp->flags & CSP_FLAG_SERVER_SOCKET_TAINTED))
+ && !(csp->flags & CSP_FLAG_SERVER_SOCKET_TAINTED)
+#ifdef FEATURE_HTTPS_INSPECTION
+ && !client_use_ssl(csp)
+#endif
+ )
{
if (!strcmpic(csp->http->version, "HTTP/1.1"))
{
{
if (!strcmpic(csp->http->version, "HTTP/1.1"))
{
@@
-2900,7
+2907,7
@@
static jb_err server_last_modified(struct client_state *csp, char **header)
seconds = rtime % 60;
log_error(LOG_LEVEL_HEADER,
seconds = rtime % 60;
log_error(LOG_LEVEL_HEADER,
- "Randomized: %s (added %
d da%s %d hou%s %d minut%s %
d second%s",
+ "Randomized: %s (added %
ld da%s %ld hou%s %ld minut%s %l
d second%s",
*header, days, (days == 1) ? "y" : "ys", hours, (hours == 1) ? "r" : "rs",
minutes, (minutes == 1) ? "e" : "es", seconds, (seconds == 1) ? ")" : "s)");
}
*header, days, (days == 1) ? "y" : "ys", hours, (hours == 1) ? "r" : "rs",
minutes, (minutes == 1) ? "e" : "es", seconds, (seconds == 1) ? ")" : "s)");
}
@@
-3552,7
+3559,7
@@
static jb_err client_if_modified_since(struct client_state *csp, char **header)
if (rtime)
{
if (rtime)
{
- log_error(LOG_LEVEL_HEADER, "Randomizing: %s (random range: %d minut%s)",
+ log_error(LOG_LEVEL_HEADER, "Randomizing: %s (random range: %
l
d minut%s)",
*header, rtime, (rtime == 1 || rtime == -1) ? "e": "es");
if (negative_range)
{
*header, rtime, (rtime == 1 || rtime == -1) ? "e": "es");
if (negative_range)
{
@@
-3563,8
+3570,8
@@
static jb_err client_if_modified_since(struct client_state *csp, char **header)
}
else
{
}
else
{
- log_error(LOG_LEVEL_ERROR,
"Random range is 0. Assuming time transformation test.",
-
*header
);
+ log_error(LOG_LEVEL_ERROR,
+
"Random range is 0. Assuming time transformation test."
);
}
tm += rtime * (negative_range ? -1 : 1);
timeptr = privoxy_gmtime_r(&tm, &gmt);
}
tm += rtime * (negative_range ? -1 : 1);
timeptr = privoxy_gmtime_r(&tm, &gmt);
@@
-3592,7
+3599,7
@@
static jb_err client_if_modified_since(struct client_state *csp, char **header)
seconds = rtime % 60;
log_error(LOG_LEVEL_HEADER,
seconds = rtime % 60;
log_error(LOG_LEVEL_HEADER,
- "Randomized: %s (%s %
d hou%s %d minut%s %
d second%s",
+ "Randomized: %s (%s %
ld hou%s %ld minut%s %l
d second%s",
*header, (negative_range) ? "subtracted" : "added", hours,
(hours == 1) ? "r" : "rs", minutes, (minutes == 1) ? "e" : "es",
seconds, (seconds == 1) ? ")" : "s)");
*header, (negative_range) ? "subtracted" : "added", hours,
(hours == 1) ? "r" : "rs", minutes, (minutes == 1) ? "e" : "es",
seconds, (seconds == 1) ? ")" : "s)");
@@
-3934,7
+3941,12
@@
static jb_err server_proxy_connection_adder(struct client_state *csp)
&& !(csp->flags & CSP_FLAG_SERVER_SOCKET_TAINTED)
&& !(csp->flags & CSP_FLAG_SERVER_PROXY_CONNECTION_HEADER_SET)
&& ((csp->flags & CSP_FLAG_SERVER_CONTENT_LENGTH_SET)
&& !(csp->flags & CSP_FLAG_SERVER_SOCKET_TAINTED)
&& !(csp->flags & CSP_FLAG_SERVER_PROXY_CONNECTION_HEADER_SET)
&& ((csp->flags & CSP_FLAG_SERVER_CONTENT_LENGTH_SET)
- || (csp->flags & CSP_FLAG_CHUNKED)))
+ || (csp->flags & CSP_FLAG_CHUNKED))
+#ifdef FEATURE_HTTPS_INSPECTION
+ && !client_use_ssl(csp)
+ && !csp->http->ssl
+#endif
+ )
{
log_error(LOG_LEVEL_HEADER, "Adding: %s", proxy_connection_header);
err = enlist(csp->headers, proxy_connection_header);
{
log_error(LOG_LEVEL_HEADER, "Adding: %s", proxy_connection_header);
err = enlist(csp->headers, proxy_connection_header);
@@
-4055,7
+4067,8
@@
static jb_err server_http(struct client_state *csp, char **header)
return JB_ERR_PARSE;
}
return JB_ERR_PARSE;
}
- if (csp->http->status == 206)
+ if (csp->http->status == 101 ||
+ csp->http->status == 206)
{
csp->content_type = CT_TABOO;
}
{
csp->content_type = CT_TABOO;
}
@@
-4485,7
+4498,7
@@
static jb_err parse_header_time(const char *header_time, time_t *result)
if (*result != result2)
{
log_error(LOG_LEVEL_ERROR, "strftime() and strptime() disagree. "
if (*result != result2)
{
log_error(LOG_LEVEL_ERROR, "strftime() and strptime() disagree. "
- "Format: '%s'. In: '%s', out: '%s'. %
d != %
d. Rejecting.",
+ "Format: '%s'. In: '%s', out: '%s'. %
ld != %l
d. Rejecting.",
time_formats[i], header_time, recreated_date, *result, result2);
continue;
}
time_formats[i], header_time, recreated_date, *result, result2);
continue;
}
@@
-4574,7
+4587,11
@@
jb_err get_destination_from_headers(const struct list *headers, struct http_requ
return JB_ERR_PARSE;
}
return JB_ERR_PARSE;
}
- p = strdup_or_die(host);
+ p = string_tolower(host);
+ if (p == NULL)
+ {
+ return JB_ERR_MEMORY;
+ }
chomp(p);
q = strdup_or_die(p);
chomp(p);
q = strdup_or_die(p);
@@
-4661,7
+4678,11
@@
jb_err get_destination_from_https_headers(const struct list *headers, struct htt
return JB_ERR_PARSE;
}
return JB_ERR_PARSE;
}
- p = strdup_or_die(host);
+ p = string_tolower(host);
+ if (p == NULL)
+ {
+ return JB_ERR_MEMORY;
+ }
chomp(p);
q = strdup_or_die(p);
chomp(p);
q = strdup_or_die(p);
@@
-4872,7
+4893,6
@@
static void create_content_length_header(unsigned long long content_length,
}
}
-#ifdef FEATURE_CONNECTION_KEEP_ALIVE
/*********************************************************************
*
* Function : get_expected_content_length
/*********************************************************************
*
* Function : get_expected_content_length
@@
-4904,7
+4924,7
@@
unsigned long long get_expected_content_length(struct list *headers)
return content_length;
}
return content_length;
}
-#endif
+
/*
Local Variables:
/*
Local Variables: