X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=filters.c;h=2dd6503c05600c96a6b995169080170d0fdf7794;hp=95fbe8d72f59a63cce2ffbb91878d7f8378cd930;hb=16ba041753d4716294b37fa5f05259b1b69ed64f;hpb=73b7af6379688bc06717396e36bfdf55a994af95 diff --git a/filters.c b/filters.c index 95fbe8d7..2dd6503c 100644 --- a/filters.c +++ b/filters.c @@ -1246,8 +1246,9 @@ struct http_response *redirect_url(struct client_state *csp) } new_url = rewrite_url(requested_url, redirection_string); #ifdef FEATURE_HTTPS_INSPECTION - if (client_use_ssl(csp)) + if (requested_url != csp->http->url) { + assert(client_use_ssl(csp)); freez(requested_url); } #endif @@ -1276,19 +1277,7 @@ struct http_response *redirect_url(struct client_state *csp) new_url = get_last_url(old_url, redirect_mode); freez(old_url); } - - /* - * Disable redirect checkers, so that they - * will be only run more than once if the user - * also enables them through tags. - * - * From a performance point of view - * it doesn't matter, but the duplicated - * log messages are annoying. - */ - csp->action->flags &= ~ACTION_FAST_REDIRECTS; #endif /* def FEATURE_FAST_REDIRECTS */ - csp->action->flags &= ~ACTION_REDIRECT; /* Did any redirect action trigger? */ if (new_url) @@ -1704,8 +1693,8 @@ static char *pcrs_filter_impl(const struct client_state *csp, int filter_respons } else { - log_error(LOG_LEVEL_RE_FILTER, - "filtering client %s request body (size %lu) with \'%s\' produced %d hits (new size %lu).", + log_error(LOG_LEVEL_RE_FILTER, "filtering request body from client %s " + "(size %lu) with \'%s\' produced %d hits (new size %lu).", csp->ip_addr_str, prev_size, b->name, current_hits, size); } #ifdef FEATURE_EXTENDED_STATISTICS @@ -2191,7 +2180,9 @@ static jb_err remove_chunked_transfer_coding(char *buffer, size_t *size) */ if (NULL == (from_p = strstr(from_p, "\r\n"))) { - log_error(LOG_LEVEL_ERROR, "Parse error while stripping \"chunked\" transfer coding"); + log_error(LOG_LEVEL_ERROR, + "Failed to strip \"chunked\" transfer coding. " + "Line with chunk size doesn't seem to end properly."); return JB_ERR_PARSE; } from_p += 2; @@ -2206,7 +2197,8 @@ static jb_err remove_chunked_transfer_coding(char *buffer, size_t *size) if (from_p + chunksize >= end_of_buffer) { log_error(LOG_LEVEL_ERROR, - "End of chunk is beyond the end of the buffer."); + "Failed to decode content for filtering. " + "One chunk end is beyond the end of the buffer."); return JB_ERR_PARSE; } @@ -2415,21 +2407,20 @@ char *execute_content_filters(struct client_state *csp) * Function : execute_client_body_filters * * Description : Executes client body filters for the request that is buffered - * in the client_iob. Upon success moves client_iob cur pointer - * to the end of the processed data. + * in the client_iob. The client_iob is updated with the filtered + * content. * * Parameters : * 1 : csp = Current client state (buffers, headers, etc...) * 2 : content_length = content length. Upon successful filtering * the passed value is updated with the new content length. * - * Returns : Pointer to the modified buffer, or - * NULL if filtering failed or wasn't necessary. + * Returns : 1 if the content has been filterd. 0 if it hasn't. * *********************************************************************/ -char *execute_client_body_filters(struct client_state *csp, size_t *content_length) +int execute_client_body_filters(struct client_state *csp, size_t *content_length) { - char *ret; + char *filtered_content; assert(client_body_filters_enabled(csp->action)); @@ -2438,15 +2429,22 @@ char *execute_client_body_filters(struct client_state *csp, size_t *content_leng /* * No content, no filtering necessary. */ - return NULL; + return 0; } - ret = pcrs_filter_request_body(csp, csp->client_iob->cur, content_length); - if (ret != NULL) + filtered_content = pcrs_filter_request_body(csp, csp->client_iob->cur, content_length); + if (filtered_content != NULL) { - csp->client_iob->cur = csp->client_iob->eod; + freez(csp->client_iob->buf); + csp->client_iob->buf = filtered_content; + csp->client_iob->cur = csp->client_iob->buf; + csp->client_iob->eod = csp->client_iob->cur + *content_length; + csp->client_iob->size = *content_length; + + return 1; } - return ret; + + return 0; } @@ -3093,14 +3091,14 @@ void register_block_reason_for_statistics(const char *block_reason) { struct block_statistics_entry *entry; - privoxy_mutex_lock(&block_statistics_mutex); + privoxy_mutex_lock(&block_reason_statistics_mutex); if (block_statistics == NULL) { block_statistics = zalloc_or_die(sizeof(struct block_statistics_entry)); entry = block_statistics; entry->block_reason = strdup_or_die(block_reason); - privoxy_mutex_unlock(&block_statistics_mutex); + privoxy_mutex_unlock(&block_reason_statistics_mutex); return; } entry = block_statistics; @@ -3120,7 +3118,7 @@ void register_block_reason_for_statistics(const char *block_reason) entry = entry->next; } - privoxy_mutex_unlock(&block_statistics_mutex); + privoxy_mutex_unlock(&block_reason_statistics_mutex); } @@ -3141,7 +3139,7 @@ static void increment_block_reason_counter(const char *block_reason) { struct block_statistics_entry *entry; - privoxy_mutex_lock(&block_statistics_mutex); + privoxy_mutex_lock(&block_reason_statistics_mutex); entry = block_statistics; while (entry != NULL) @@ -3154,7 +3152,7 @@ static void increment_block_reason_counter(const char *block_reason) entry = entry->next; } - privoxy_mutex_unlock(&block_statistics_mutex); + privoxy_mutex_unlock(&block_reason_statistics_mutex); } @@ -3177,7 +3175,7 @@ void get_block_reason_count(const char *block_reason, unsigned long long *count) { struct block_statistics_entry *entry; - privoxy_mutex_lock(&block_statistics_mutex); + privoxy_mutex_lock(&block_reason_statistics_mutex); entry = block_statistics; while (entry != NULL) @@ -3190,7 +3188,7 @@ void get_block_reason_count(const char *block_reason, unsigned long long *count) entry = entry->next; } - privoxy_mutex_unlock(&block_statistics_mutex); + privoxy_mutex_unlock(&block_reason_statistics_mutex); }