-const char parsers_rcs[] = "$Id: parsers.c,v 1.214 2010/06/13 12:26:32 fabiankeil Exp $";
+const char parsers_rcs[] = "$Id: parsers.c,v 1.218 2011/02/14 16:11:34 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/parsers.c,v $
* The second run is used to remove the Content-Encoding
* header if the decompression was successful.
*
+ * XXX: Doesn't properly deal with multiple or with
+ * unsupported but unknown encodings.
+ * Is case-sensitive but shouldn't be.
+ * The second run should be factored out into
+ * a different function.
+ *
* Parameters :
* 1 : csp = Current client state (buffers, headers, etc...)
* 2 : header = On input, pointer to header to modify.
log_error(LOG_LEVEL_HEADER, "Crunching: %s", *header);
freez(*header);
}
+ else if (strstr(*header, "sdch"))
+ {
+ /*
+ * Shared Dictionary Compression over HTTP isn't supported,
+ * filtering it anyway is pretty much guaranteed to mess up
+ * the encoding.
+ */
+ csp->content_type |= CT_TABOO;
+
+ /*
+ * Log a warning if the user expects the content to be filtered.
+ */
+ if ((csp->rlist != NULL) &&
+ (!list_is_empty(csp->action->multi[ACTION_MULTI_FILTER])))
+ {
+ log_error(LOG_LEVEL_INFO,
+ "SDCH-compressed content detected, content filtering disabled. "
+ "Consider suppressing SDCH offers made by the client.");
+ }
+ }
else if (strstr(*header, "gzip"))
{
/* Mark for gzip decompression */
csp->content_type |= CT_TABOO;
}
#else /* !defined(FEATURE_ZLIB) */
- if (strstr(*header, "gzip") || strstr(*header, "compress") || strstr(*header, "deflate"))
+ /*
+ * XXX: Using a black list here isn't the right approach.
+ *
+ * In case of SDCH, building with zlib support isn't
+ * going to help.
+ */
+ if (strstr(*header, "gzip") ||
+ strstr(*header, "compress") ||
+ strstr(*header, "deflate") ||
+ strstr(*header, "sdch"))
{
/*
* Body is compressed, turn off pcrs and gif filtering.
{
const char *newval;
char buf[BUFFER_SIZE];
-
+ time_t last_modified;
char newheader[50];
-#ifdef HAVE_GMTIME_R
- struct tm gmt;
-#endif
- struct tm *timeptr = NULL;
- time_t now, last_modified;
-
+
/*
* Are we messing with the Last-Modified header?
*/
const char *header_time = *header + sizeof("Last-Modified:");
log_error(LOG_LEVEL_HEADER, "Randomizing: %s", *header);
- now = time(NULL);
-#ifdef HAVE_GMTIME_R
- gmtime_r(&now, &gmt);
-#elif defined(MUTEX_LOCKS_AVAILABLE)
- privoxy_mutex_lock(&gmtime_mutex);
- gmtime(&now);
- privoxy_mutex_unlock(&gmtime_mutex);
-#else
- gmtime(&now);
-#endif
+
if (JB_ERR_OK != parse_header_time(header_time, &last_modified))
{
log_error(LOG_LEVEL_HEADER, "Couldn't parse: %s in %s (crunching!)", header_time, *header);
}
else
{
- long int rtime = (long int)difftime(now, last_modified);
+ time_t now;
+ struct tm *timeptr = NULL;
+ long int rtime;
+#ifdef HAVE_GMTIME_R
+ struct tm gmt;
+#endif
+ now = time(NULL);
+ rtime = (long int)difftime(now, last_modified);
if (rtime)
{
long int days, hours, minutes, seconds;
if ((csp->action->flags & ACTION_NO_COMPRESSION) != 0)
{
log_error(LOG_LEVEL_HEADER, "Suppressed offer to compress content");
-
freez(*header);
-
- /* Temporarily disable the correct behaviour to
- * work around a PHP bug.
- *
- * if (!strcmpic(csp->http->ver, "HTTP/1.1"))
- * {
- * *header = strdup("Accept-Encoding: identity;q=1.0, *;q=0");
- * if (*header == NULL)
- * {
- * return JB_ERR_MEMORY;
- * }
- * }
- *
- */
}
return JB_ERR_OK;
const char *host, const int parameter_conditional_block)
{
char *referer = strdup(*header);
- const size_t hostlenght = strlen(host);
+ const size_t hostlength = strlen(host);
const char *referer_url = NULL;
if (NULL == referer)
}
/* referer begins with 'Referer: http[s]://' */
- if ((hostlenght+17) < strlen(referer))
+ if ((hostlength+17) < strlen(referer))
{
/*
* Shorten referer to make sure the referer is blocked
* if www.example.org/www.example.com-shall-see-the-referer/
* links to www.example.com/
*/
- referer[hostlenght+17] = '\0';
+ referer[hostlength+17] = '\0';
}
referer_url = strstr(referer, "http://");
if ((NULL == referer_url) || (NULL == strstr(referer_url, host)))