-const char parsers_rcs[] = "$Id: parsers.c,v 1.226 2011/08/31 13:35:21 fabiankeil Exp $";
+const char parsers_rcs[] = "$Id: parsers.c,v 1.239 2011/12/31 14:49:07 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/parsers.c,v $
*
* Purpose : Declares functions to parse/crunch headers and pages.
- * Functions declared include:
- * `add_to_iob', `client_cookie_adder', `client_from',
- * `client_referrer', `client_send_cookie', `client_ua',
- * `client_uagent', `client_x_forwarded',
- * `client_x_forwarded_adder', `client_xtra_adder',
- * `content_type', `crumble', `destroy_list', `enlist',
- * `flush_socket', ``get_header', `sed', `filter_header'
- * `server_content_encoding', `server_content_disposition',
- * `server_last_modified', `client_accept_language',
- * `crunch_client_header', `client_if_modified_since',
- * `client_if_none_match', `get_destination_from_headers',
- * `parse_header_time', `decompress_iob' and `server_set_cookie'.
- *
- * Copyright : Written by and Copyright (C) 2001-2009 the
+ *
+ * Copyright : Written by and Copyright (C) 2001-2011 the
* Privoxy team. http://www.privoxy.org/
*
* Based on the Internet Junkbuster originally written
client_host_adder,
client_x_forwarded_for_adder,
client_xtra_adder,
- /* Temporarily disabled: client_accept_encoding_adder, */
client_connection_header_adder,
NULL
};
log_error(LOG_LEVEL_HEADER,
"Removing \'%s\' to imply keep-alive.", *header);
freez(*header);
+ /*
+ * While we imply keep-alive to the server,
+ * we have to remember that the client didn't.
+ */
+ csp->flags &= ~CSP_FLAG_CLIENT_CONNECTION_KEEP_ALIVE;
}
else
{
static jb_err server_last_modified(struct client_state *csp, char **header)
{
const char *newval;
- char buf[BUFFER_SIZE];
time_t last_modified;
char newheader[50];
/*
* Setting Last-Modified Header to now.
*/
+ char buf[30];
get_http_time(0, buf, sizeof(buf));
freez(*header);
*header = strdup("Last-Modified: ");
}
-#if 0
-/*********************************************************************
- *
- * Function : client_accept_encoding_adder
- *
- * Description : Add an Accept-Encoding header to the client's request
- * that disables compression if the action applies, and
- * the header is not already there. Called from `sed'.
- * Note: For HTTP/1.0, the absence of the header is enough.
- *
- * Parameters :
- * 1 : csp = Current client state (buffers, headers, etc...)
- *
- * Returns : JB_ERR_OK on success, or
- * JB_ERR_MEMORY on out-of-memory error.
- *
- *********************************************************************/
-static jb_err client_accept_encoding_adder(struct client_state *csp)
-{
- if ( ((csp->action->flags & ACTION_NO_COMPRESSION) != 0)
- && (!strcmpic(csp->http->ver, "HTTP/1.1")) )
- {
- return enlist_unique(csp->headers, "Accept-Encoding: identity;q=1.0, *;q=0", 16);
- }
-
- return JB_ERR_OK;
-}
-#endif
-
-
/*********************************************************************
*
* Function : client_xtra_adder
static jb_err parse_header_time(const char *header_time, time_t *result)
{
struct tm gmt;
-
/*
- * Zero out gmt to prevent time zone offsets.
- *
- * While this is only necessary on some platforms
- * (mingw32 for example), I don't know how to
- * detect these automatically and doing it everywhere
- * shouldn't hurt.
+ * Checking for two-digit years first in an
+ * attempt to work around GNU libc's strptime()
+ * reporting negative year values when using %Y.
*/
- memset(&gmt, 0, sizeof(gmt));
-
- /* Tue, 02 Jun 2037 20:00:00 */
- if ((NULL == strptime(header_time, "%a, %d %b %Y %H:%M:%S", &gmt))
- /* Tue, 02-Jun-2037 20:00:00 */
- && (NULL == strptime(header_time, "%a, %d-%b-%Y %H:%M:%S", &gmt))
- /* Tue, 02-Jun-37 20:00:00 */
- && (NULL == strptime(header_time, "%a, %d-%b-%y %H:%M:%S", &gmt))
- /* Tuesday, 02-Jun-2037 20:00:00 */
- && (NULL == strptime(header_time, "%A, %d-%b-%Y %H:%M:%S", &gmt))
- /* Tuesday Jun 02 20:00:00 2037 */
- && (NULL == strptime(header_time, "%A %b %d %H:%M:%S %Y", &gmt)))
+ static const char * const time_formats[] = {
+ /* Tue, 02-Jun-37 20:00:00 */
+ "%a, %d-%b-%y %H:%M:%S",
+ /* Tue, 02 Jun 2037 20:00:00 */
+ "%a, %d %b %Y %H:%M:%S",
+ /* Tue, 02-Jun-2037 20:00:00 */
+ "%a, %d-%b-%Y %H:%M:%S",
+ /* Tuesday, 02-Jun-2037 20:00:00 */
+ "%A, %d-%b-%Y %H:%M:%S",
+ /* Tuesday Jun 02 20:00:00 2037 */
+ "%A %b %d %H:%M:%S %Y"
+ };
+ unsigned int i;
+
+ for (i = 0; i < SZ(time_formats); i++)
{
- return JB_ERR_PARSE;
- }
+ /*
+ * Zero out gmt to prevent time zone offsets.
+ * Documented to be required for GNU libc.
+ */
+ memset(&gmt, 0, sizeof(gmt));
- *result = timegm(&gmt);
+ if (NULL != strptime(header_time, time_formats[i], &gmt))
+ {
+ /* Sanity check for GNU libc. */
+ if (gmt.tm_year < 0)
+ {
+ log_error(LOG_LEVEL_HEADER,
+ "Failed to parse '%s' using '%s'. Moving on.",
+ header_time, time_formats[i]);
+ continue;
+ }
+ *result = timegm(&gmt);
+ return JB_ERR_OK;
+ }
+ }
- return JB_ERR_OK;
+ return JB_ERR_PARSE;
}
* Function : create_forged_referrer
*
* Description : Helper for client_referrer to forge a referer as
- * 'http://[hostname:port/' to fool stupid
+ * 'http://hostname[:port]/' to fool stupid
* checks for in-site links
*
* Parameters :