X-Git-Url: http://www.privoxy.org/gitweb/?a=blobdiff_plain;f=parsers.c;h=e5898046adfa6b412ddaa38abb83dd9ddaf9b258;hb=af1726ac139dcb270201a2f65dc68bb0063771aa;hp=1a0323c135f3317be5b4f6d3097fb4535d017f8a;hpb=e72b401da5537a14b29e945944926373cb251825;p=privoxy.git diff --git a/parsers.c b/parsers.c index 1a0323c1..e5898046 100644 --- a/parsers.c +++ b/parsers.c @@ -1,4 +1,4 @@ -const char parsers_rcs[] = "$Id: parsers.c,v 1.156 2009/05/13 18:22:45 fabiankeil Exp $"; +const char parsers_rcs[] = "$Id: parsers.c,v 1.162 2009/05/25 15:40:52 fabiankeil Exp $"; /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/parsers.c,v $ @@ -471,7 +471,7 @@ jb_err decompress_iob(struct client_state *csp) */ int skip_bytes; skip_bytes = *cur++; - skip_bytes = *cur++ << 8; + skip_bytes += *cur++ << 8; assert(skip_bytes == *csp->iob->cur - 2 + ((*csp->iob->cur - 1) << 8)); @@ -1562,30 +1562,32 @@ static jb_err filter_header(struct client_state *csp, char **header) *********************************************************************/ static jb_err server_connection(struct client_state *csp, char **header) { - /* Do we have a 'Connection: close' header? */ - if (strcmpic(*header, "Connection: close")) + if (!strcmpic(*header, "Connection: keep-alive")) { #ifdef FEATURE_CONNECTION_KEEP_ALIVE - if ((csp->config->feature_flags & - RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE) - && !strcmpic(*header, "Connection: keep-alive")) + if ((csp->config->feature_flags & RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE)) { - /* Remember to keep the connection alive. */ csp->flags |= CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE; } - log_error(LOG_LEVEL_HEADER, - "Keeping the server header '%s' around.", *header); -#else - char *old_header = *header; - *header = strdup("Connection: close"); - if (header == NULL) - { - return JB_ERR_MEMORY; + if ((csp->flags & CSP_FLAG_CLIENT_CONNECTION_KEEP_ALIVE)) + { + log_error(LOG_LEVEL_HEADER, + "Keeping the server header '%s' around.", *header); } - log_error(LOG_LEVEL_HEADER, "Replaced: \'%s\' with \'%s\'", old_header, *header); - freez(old_header); + else #endif /* FEATURE_CONNECTION_KEEP_ALIVE */ + { + char *old_header = *header; + + *header = strdup("Connection: close"); + if (header == NULL) + { + return JB_ERR_MEMORY; + } + log_error(LOG_LEVEL_HEADER, "Replaced: \'%s\' with \'%s\'", old_header, *header); + freez(old_header); + } } /* Signal server_connection_adder() to return early. */ @@ -1617,8 +1619,8 @@ static jb_err server_keep_alive(struct client_state *csp, char **header) unsigned int keep_alive_timeout; const char *timeout_position = strstr(*header, "timeout="); - if ((NULL != timeout_position) - && (1 != sscanf(timeout_position, "timeout=%u", &keep_alive_timeout))) + if ((NULL == timeout_position) + || (1 != sscanf(timeout_position, "timeout=%u", &keep_alive_timeout))) { log_error(LOG_LEVEL_ERROR, "Couldn't parse: %s", *header); } @@ -1672,22 +1674,27 @@ static jb_err client_connection(struct client_state *csp, char **header) if (strcmpic(*header, wanted_header)) { #ifdef FEATURE_CONNECTION_KEEP_ALIVE - log_error(LOG_LEVEL_HEADER, - "Keeping the client header '%s' around. " - "The connection will not be kept alive.", - *header); -#else - char *old_header = *header; - - *header = strdup(wanted_header); - if (header == NULL) - { - return JB_ERR_MEMORY; + if (!(csp->config->feature_flags & RUNTIME_FEATURE_CONNECTION_SHARING)) + { + log_error(LOG_LEVEL_HEADER, + "Keeping the client header '%s' around. " + "The connection will not be kept alive.", + *header); } - log_error(LOG_LEVEL_HEADER, - "Replaced: \'%s\' with \'%s\'", old_header, *header); - freez(old_header); + else #endif /* def FEATURE_CONNECTION_KEEP_ALIVE */ + { + char *old_header = *header; + + *header = strdup(wanted_header); + if (header == NULL) + { + return JB_ERR_MEMORY; + } + log_error(LOG_LEVEL_HEADER, + "Replaced: \'%s\' with \'%s\'", old_header, *header); + freez(old_header); + } } #ifdef FEATURE_CONNECTION_KEEP_ALIVE else @@ -2272,13 +2279,13 @@ static jb_err server_last_modified(struct client_state *csp, char **header) log_error(LOG_LEVEL_HEADER, "Randomizing: %s", *header); now = time(NULL); #ifdef HAVE_GMTIME_R - timeptr = gmtime_r(&now, &gmt); + gmtime_r(&now, &gmt); #elif FEATURE_PTHREAD privoxy_mutex_lock(&gmtime_mutex); - timeptr = gmtime(&now); + gmtime(&now); privoxy_mutex_unlock(&gmtime_mutex); #else - timeptr = gmtime(&now); + gmtime(&now); #endif if (JB_ERR_OK != parse_header_time(header_time, &last_modified)) { @@ -3425,6 +3432,12 @@ static jb_err client_connection_header_adder(struct client_state *csp) return JB_ERR_OK; } + if ((csp->config->feature_flags & RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE) + && (csp->http->ssl == 0)) + { + csp->flags |= CSP_FLAG_CLIENT_CONNECTION_KEEP_ALIVE; + } + log_error(LOG_LEVEL_HEADER, "Adding: %s", wanted_header); return enlist(csp->headers, wanted_header);