X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=filters.c;h=748042c658ad6af4009f39dcc210b29032a90bb3;hp=c7e71f85ab2a9d0a632f7aafc72b11b80c639883;hb=a5a23ebe3374e91d7d59b707bb017982ab99990b;hpb=23f625f4848f55342283b6ebc471735c14360bb1 diff --git a/filters.c b/filters.c index c7e71f85..748042c6 100644 --- a/filters.c +++ b/filters.c @@ -42,18 +42,12 @@ #include #ifndef _WIN32 -#ifndef __OS2__ #include -#endif /* ndef __OS2__ */ #include #else #include #endif /* ndef _WIN32 */ -#ifdef __OS2__ -#include -#endif /* def __OS2__ */ - #include "project.h" #include "filters.h" #include "encode.h" @@ -72,6 +66,9 @@ #ifdef FEATURE_CLIENT_TAGS #include "client-tags.h" #endif +#ifdef FEATURE_HTTPS_INSPECTION +#include "ssl.h" +#endif #ifdef _WIN32 #include "win32.h" @@ -1200,7 +1197,6 @@ struct http_response *redirect_url(struct client_state *csp) */ char * redirect_mode; #endif /* def FEATURE_FAST_REDIRECTS */ - char *old_url = NULL; char *new_url = NULL; char *redirection_string; @@ -1226,8 +1222,35 @@ struct http_response *redirect_url(struct client_state *csp) if (*redirection_string == 's') { - old_url = csp->http->url; - new_url = rewrite_url(old_url, redirection_string); + char *requested_url; + +#ifdef FEATURE_HTTPS_INSPECTION + if (client_use_ssl(csp)) + { + jb_err err; + + requested_url = strdup_or_die("https://"); + err = string_append(&requested_url, csp->http->hostport); + if (!err) err = string_append(&requested_url, csp->http->path); + if (err) + { + log_error(LOG_LEVEL_FATAL, + "Failed to rebuild URL 'https://%s%s'", + csp->http->hostport, csp->http->path); + } + } + else +#endif + { + requested_url = csp->http->url; + } + new_url = rewrite_url(requested_url, redirection_string); +#ifdef FEATURE_HTTPS_INSPECTION + if (client_use_ssl(csp)) + { + freez(requested_url); + } +#endif } else { @@ -1241,6 +1264,8 @@ struct http_response *redirect_url(struct client_state *csp) #ifdef FEATURE_FAST_REDIRECTS if ((csp->action->flags & ACTION_FAST_REDIRECTS)) { + char *old_url; + redirect_mode = csp->action->string[ACTION_STRING_FAST_REDIRECTS]; /* @@ -1663,7 +1688,7 @@ static char *pcrs_filter_response(struct client_state *csp) if (b->dynamic) pcrs_free_joblist(joblist); log_error(LOG_LEVEL_RE_FILTER, - "filtering %s%s (size %d) with \'%s\' produced %d hits (new size %d).", + "filtering %s%s (size %lu) with \'%s\' produced %d hits (new size %lu).", csp->http->hostport, csp->http->path, prev_size, b->name, current_hits, size); #ifdef FEATURE_EXTENDED_STATISTICS update_filter_statistics(b->name, current_hits); @@ -1677,6 +1702,10 @@ static char *pcrs_filter_response(struct client_state *csp) */ if (!hits) { + if (old != csp->iob->cur && old != new) + { + freez(old); + } freez(new); return(NULL); } @@ -1829,7 +1858,7 @@ static char *execute_external_filter(const struct client_state *csp, */ if ((*size != 0) && fwrite(content, *size, 1, fp) != 1) { - log_error(LOG_LEVEL_ERROR, "fwrite(..., %d, 1, ..) failed: %E", *size); + log_error(LOG_LEVEL_ERROR, "fwrite(..., %lu, 1, ..) failed: %E", *size); unlink(file_name); fclose(fp); return NULL; @@ -1905,7 +1934,7 @@ static char *execute_external_filter(const struct client_state *csp, { log_error(LOG_LEVEL_RE_FILTER, "Executing '%s' resulted in return value %d. " - "Read %d of up to %d bytes.", name, (ret >> 8), new_size, *size); + "Read %lu of up to %lu bytes.", name, (ret >> 8), new_size, *size); } unlink(file_name); @@ -1965,7 +1994,8 @@ static char *gif_deanimate_response(struct client_state *csp) } else { - log_error(LOG_LEVEL_DEANIMATE, "Success! GIF shrunk from %d bytes to %d.", size, out->offset); + log_error(LOG_LEVEL_DEANIMATE, + "Success! GIF shrunk from %lu bytes to %lu.", size, out->offset); } csp->content_length = out->offset; csp->flags |= CSP_FLAG_MODIFIED; @@ -2071,8 +2101,8 @@ static jb_err remove_chunked_transfer_coding(char *buffer, size_t *size) { log_error(LOG_LEVEL_ERROR, "Chunk size %u exceeds buffered data left. " - "Already digested %u of %u buffered bytes.", - chunksize, (unsigned int)newsize, (unsigned int)*size); + "Already digested %lu of %lu buffered bytes.", + chunksize, newsize, *size); return JB_ERR_PARSE; } @@ -2126,7 +2156,8 @@ static jb_err remove_chunked_transfer_coding(char *buffer, size_t *size) } /* XXX: Should get its own loglevel. */ - log_error(LOG_LEVEL_RE_FILTER, "De-chunking successful. Shrunk from %d to %d", *size, newsize); + log_error(LOG_LEVEL_RE_FILTER, + "De-chunking successful. Shrunk from %lu to %lu", *size, newsize); *size = newsize; @@ -2320,20 +2351,7 @@ void get_url_actions(struct client_state *csp, struct http_request *http) struct url_actions *b; int i; -#ifdef FEATURE_HTTPS_INSPECTION - if (!csp->http->client_ssl) -#endif - { - /* - * When filtering TLS traffic this function gets called a - * second time after the encrypted headers have been received. - * - * Only initialize the first time. The second time we apply - * the newly set actions on top of the ones that were set - * the first time. - */ - init_current_action(csp->action); - } + init_current_action(csp->action); for (i = 0; i < MAX_AF_FILES; i++) { @@ -2688,7 +2706,7 @@ int content_requires_filtering(struct client_state *csp) * The server didn't bother to declare a MIME-Type. * Assume it's text that can be filtered. * - * This also regulary happens with 304 responses, + * This also regularly happens with 304 responses, * therefore logging anything here would cause * too much noise. */ @@ -2769,7 +2787,7 @@ struct filter_statistics_entry { char *filter; unsigned long long executions; - unsigned long long pages_modified; + unsigned long long response_bodies_modified; unsigned long long hits; struct filter_statistics_entry *next; @@ -2855,7 +2873,7 @@ void update_filter_statistics(const char *filter, int hits) entry->executions++; if (hits != 0) { - entry->pages_modified++; + entry->response_bodies_modified++; entry->hits += (unsigned)hits; } break; @@ -2877,14 +2895,15 @@ void update_filter_statistics(const char *filter, int hits) * Parameters : * 1 : filter = Name of the filter to get statistics for. * 2 : executions = Storage for the execution count. - * 3 : pages_modified = Storage for the number of modified pages. + * 3 : response_bodies_modified = Storage for the number + * of modified response bodies. * 4 : hits = Storage for the number of hits. * * Returns : void * *********************************************************************/ void get_filter_statistics(const char *filter, unsigned long long *executions, - unsigned long long *pages_modified, + unsigned long long *response_bodies_modified, unsigned long long *hits) { struct filter_statistics_entry *entry; @@ -2897,7 +2916,7 @@ void get_filter_statistics(const char *filter, unsigned long long *executions, if (!strcmp(entry->filter, filter)) { *executions = entry->executions; - *pages_modified = entry->pages_modified; + *response_bodies_modified = entry->response_bodies_modified; *hits = entry->hits; break; }