-const char parsers_rcs[] = "$Id: parsers.c,v 1.146 2008/10/12 16:46:35 fabiankeil Exp $";
+const char parsers_rcs[] = "$Id: parsers.c,v 1.150 2008/12/04 18:12:19 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/parsers.c,v $
* `client_if_none_match', `get_destination_from_headers',
* `parse_header_time', `decompress_iob' and `server_set_cookie'.
*
- * Copyright : Written by and Copyright (C) 2001-2008 the SourceForge
+ * Copyright : Written by and Copyright (C) 2001-2009 the
* Privoxy team. http://www.privoxy.org/
*
* Based on the Internet Junkbuster originally written
*
* Revisions :
* $Log: parsers.c,v $
+ * Revision 1.150 2008/12/04 18:12:19 fabiankeil
+ * Fix some cparser warnings.
+ *
+ * Revision 1.149 2008/11/21 18:39:53 fabiankeil
+ * In case of CONNECT requests there's no point
+ * in trying to keep the connection alive.
+ *
+ * Revision 1.148 2008/11/16 12:43:49 fabiankeil
+ * Turn keep-alive support into a runtime feature
+ * that is disabled by setting keep-alive-timeout
+ * to a negative value.
+ *
+ * Revision 1.147 2008/11/04 17:20:31 fabiankeil
+ * HTTP/1.1 responses without Connection
+ * header imply keep-alive. Act accordingly.
+ *
* Revision 1.146 2008/10/12 16:46:35 fabiankeil
* Remove obsolete warning about delayed delivery with chunked
* transfer encoding and FEATURE_CONNECTION_KEEP_ALIVE enabled.
static jb_err create_fake_referrer(char **header, const char *fake_referrer);
static jb_err handle_conditional_hide_referrer_parameter(char **header,
const char *host, const int parameter_conditional_block);
+static const char *get_appropiate_connection_header(const struct client_state *csp);
/*
* List of functions to run on a list of headers.
cur = csp->iob->cur;
- if (bufsize < 10)
+ if (bufsize < (size_t)10)
{
/*
* This is to protect the parsing of gzipped data,
*/
assert(zstr.avail_out == tmpbuf + bufsize - (char *)zstr.next_out);
assert((char *)zstr.next_out == tmpbuf + ((char *)oldnext_out - buf));
- assert(zstr.avail_out > 0);
+ assert(zstr.avail_out > 0U);
buf = tmpbuf;
}
&& (csp->iob->eod <= csp->iob->buf + csp->iob->size))
{
const size_t new_size = (size_t)(csp->iob->eod - csp->iob->cur);
- if (new_size > 0)
+ if (new_size > (size_t)0)
{
log_error(LOG_LEVEL_RE_FILTER,
"Decompression successful. Old size: %d, new size: %d.",
if (strcmpic(*header, "Connection: close"))
{
#ifdef FEATURE_CONNECTION_KEEP_ALIVE
- if (!strcmpic(*header, "Connection: keep-alive"))
+ if ((csp->config->feature_flags &
+ RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE)
+ && !strcmpic(*header, "Connection: keep-alive"))
{
/* Remember to keep the connection alive. */
csp->flags |= CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE;
static jb_err client_connection(struct client_state *csp, char **header)
{
char *old_header = *header;
-#ifdef FEATURE_CONNECTION_KEEP_ALIVE
- static const char wanted_header[] = "Connection: keep-alive";
-#else
- static const char wanted_header[] = "Connection: close";
-#endif /* FEATURE_CONNECTION_KEEP_ALIVE */
+ const char *wanted_header = get_appropiate_connection_header(csp);
if (strcmpic(*header, wanted_header))
{
*********************************************************************/
static jb_err crumble(struct client_state *csp, char **header)
{
+ (void)csp;
log_error(LOG_LEVEL_HEADER, "crumble crunched: %s!", *header);
freez(*header);
return JB_ERR_OK;
(0 == strcmpic(csp->http->gpc, "options")))
{
assert(*(*header+12) == ':');
- if (1 == sscanf(*header+12, ": %u", &max_forwards))
+ if (1 == sscanf(*header+12, ": %d", &max_forwards))
{
if (max_forwards > 0)
{
- snprintf(*header, strlen(*header)+1, "Max-Forwards: %u", --max_forwards);
- log_error(LOG_LEVEL_HEADER, "Max-Forwards value for %s request reduced to %u.",
+ snprintf(*header, strlen(*header)+1, "Max-Forwards: %d", --max_forwards);
+ log_error(LOG_LEVEL_HEADER,
+ "Max-Forwards value for %s request reduced to %d.",
csp->http->gpc, max_forwards);
}
else if (max_forwards < 0)
/*
* XXX: if we downgraded the response, this check will fail.
*/
- if ((NULL != response_status_line)
+ if ((csp->config->feature_flags &
+ RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE)
+ && (NULL != response_status_line)
&& !strncmpic(response_status_line, "HTTP/1.1", 8))
{
log_error(LOG_LEVEL_HEADER, "A HTTP/1.1 response "
*********************************************************************/
static jb_err client_connection_header_adder(struct client_state *csp)
{
-#ifdef FEATURE_CONNECTION_KEEP_ALIVE
- static const char wanted_header[] = "Connection: keep-alive";
-#else
- static const char wanted_header[] = "Connection: close";
-#endif /* FEATURE_CONNECTION_KEEP_ALIVE */
const unsigned int flags = csp->flags;
+ const char *wanted_header = get_appropiate_connection_header(csp);
if (!(flags & CSP_FLAG_CLIENT_HEADER_PARSING_DONE)
&& (flags & CSP_FLAG_CLIENT_CONNECTION_HEADER_SET))
{
char *referer = strdup(*header);
const size_t hostlenght = strlen(host);
+ const char *referer_url = NULL;
if (NULL == referer)
{
}
/* referer begins with 'Referer: http[s]://' */
- if (hostlenght < (strlen(referer)-17))
+ if ((hostlenght+17) < strlen(referer))
{
/*
* Shorten referer to make sure the referer is blocked
*/
referer[hostlenght+17] = '\0';
}
- if (NULL == strstr(referer, host))
+ referer_url = strstr(referer, "http://");
+ if ((NULL == referer_url) || (NULL == strstr(referer_url, host)))
{
- /* Host has changed */
+ /* Host has changed, Referer is invalid or a https URL. */
if (parameter_conditional_block)
{
log_error(LOG_LEVEL_HEADER, "New host is: %s. Crunching %s!", host, *header);
}
+
+/*********************************************************************
+ *
+ * Function : get_appropiate_connection_header
+ *
+ * Description : Returns an appropiate Connection header
+ * depending on whether or not we try to keep
+ * the connection to the server alive.
+ *
+ * Parameters :
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ *
+ * Returns : Pointer to statically allocated header buffer.
+ *
+ *********************************************************************/
+static const char *get_appropiate_connection_header(const struct client_state *csp)
+{
+ static const char connection_keep_alive[] = "Connection: keep-alive";
+ static const char connection_close[] = "Connection: close";
+
+ if ((csp->config->feature_flags & RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE)
+ && (csp->http->ssl == 0))
+ {
+ return connection_keep_alive;
+ }
+ return connection_close;
+}
/*
Local Variables:
tab-width: 3