# Note: GNUmakefile is built automatically from GNUmakefile.in
#
-# Written by and Copyright (C) 2001-2018 members of the
+# Written by and Copyright (C) 2001-2020 members of the
# Privoxy team. https://www.privoxy.org/
#
# Based on the Internet Junkbuster originally written
for i in `find . -type f -a -not \( -path "*/CVS*" -o -name ".*" \
-o -path "*/debian/*" -o -path "*/actions/*" -o -name "*.php" -o \
- -name "PACKAGERS" -o -path "*.git/*" \) | sort`; do \
+ -name "PACKAGERS" -o -path "*.git/*" \
+ -o -path "*/doc/webserver/feeds*" \) | sort`; do \
files="$$files privoxy-$(VERSION)-$(CODE_STATUS)/$$i"; \
done && \
cd .. && $(TAR) -cvhf privoxy-$(VERSION)-$(CODE_STATUS)-src.tar $$files ; \
$(ECHO) "#mtree 2.0" > $(MTREE_SPEC_FILE)
for i in `find . -type f -a -not \( -path "*/CVS*" -o -name ".*" \
-o -path "*/debian/*" -o -path "*/actions/*" -o -name "*.php" -o \
- -name "PACKAGERS" -o -path "*.git/*" -o -name "*.spec" \) | env -i sort`; do \
+ -name "PACKAGERS" -o -path "*.git/*" -o -name "*.spec" \
+ -o -path "*/doc/webserver/feeds*" \) | env -i sort`; do \
$(ECHO) "privoxy-$(VERSION)-$(CODE_STATUS)/$$i time=$(SOURCE_DATE_EPOCH) type=file uname=privoxy gname=privoxy mode=0555"; \
done >> $(MTREE_SPEC_FILE)
$(RM) ../privoxy-$(VERSION)-$(CODE_STATUS)
s/\.\d\. //;\
s/__copy/©/;\
s@(<SUB)@<p style="text-align: center">\1@; s@(</SUB)@\1></p@;\
- s@(Privoxy is a non-caching)@<img src="images/privoxy.png" align="right">\n\1@;' \
+ s@(Privoxy is a non-caching)@<img src="images/privoxy.png" align="right" alt="Privoxy logo">\n\1@;' \
doc/webserver/index.html && $(RM) doc/webserver/*.bak
# privoxy-index.html for local documentation:
When building from a source tarball, first unpack the source:
- tar xzvf privoxy-3.0.29-stable-src.tar.gz
- cd privoxy-3.0.29-stable
+ tar xzvf privoxy-3.0.30-beta-src.tar.gz
+ cd privoxy-3.0.30-beta
To build the development version, you can get the source code by doing:
*
*********************************************************************/
-This README is included with Privoxy 3.0.29. See https://www.privoxy.org/ for
-more information. The current code maturity level is "stable".
+This README is included with the development version of Privoxy 3.0.30. See
+https://www.privoxy.org/ for more information. The current code maturity level
+is "UNRELEASED", but seems stable to us :).
-------------------------------------------------------------------------------
Helping hands and donations are welcome:
- * https://www.privoxy.org/faq/general.html#PARTICIPATE
+ * https://www.privoxy.org/participate
- * https://www.privoxy.org/faq/general.html#DONATE
+ * https://www.privoxy.org/donate
-------------------------------------------------------------------------------
The actions list can be configured via the web interface accessed via http://
p.p/, as well other options.
+All configuration files are subject to unannounced changes during the
+development process.
+
-------------------------------------------------------------------------------
5. DOCUMENTATION
-There should be documentation in the 'doc' subdirectory. In particular, see the
-User Manual there, the FAQ, and those interested in Privoxy development, should
-look at developer-manual.
+There should be documentation in the 'doc' subdirectory, but it may not be
+completed at this point. In particular, see the User Manual there, the FAQ, and
+those interested in Privoxy development, should look at developer-manual.
-The source and configuration files are all well commented. The main
-configuration files are: 'config', 'default.action', and 'default.filter'.
+The most up to date source of information on the current development version,
+may still be either comments in the source code, or the included configuration
+files. The source and configuration files are all well commented. The main
+configuration files are: 'config', 'default.action', and 'default.filter' in
+the top-level source directory.
Included documentation may vary according to platform and packager. All
documentation is posted on https://www.privoxy.org, in case you don't have it,
(variables too). Could probably reuse large parts of Privoxy-Filter-Test.
Note that there is currently work in progress to leverage curl's
test suite, patches have been submitted upstream:
- http://curl.haxx.se/mail/lib-2014-06/0070.html
+ https://curl.se/mail/lib-2014-06/0070.html
3) Fix some more XXX: comments.
168) Add a privacy policy.
+169) Preserve all relevant copyright and license statements in binary
+ packages we distribute.
+
+170) Serve the ca-cert-file through the CGI interface so client's
+ can conveniently import it (insecurely).
+
+171) Create a "view page using Privoxy" website where users can input
+ an URL and get a screenshot of a browser fetching the URL
+ through Privoxy.
+
+172) Create a public git repository for Privoxy-Filter-Test.
+
##########################################################################
Hosting wish list (relevant for #53)
DEFINE_CGI_PARAM_RADIO ("set-image-blocker", ACTION_IMAGE_BLOCKER, ACTION_STRING_IMAGE_BLOCKER, "pattern", 1)
DEFINE_CGI_PARAM_RADIO ("set-image-blocker", ACTION_IMAGE_BLOCKER, ACTION_STRING_IMAGE_BLOCKER, "blank", 0)
DEFINE_CGI_PARAM_CUSTOM ("set-image-blocker", ACTION_IMAGE_BLOCKER, ACTION_STRING_IMAGE_BLOCKER, CGI_PREFIX "send-banner?type=pattern")
+DEFINE_ACTION_MULTI ("suppress-tag", ACTION_MULTI_SUPPRESS_TAG)
#if DEFINE_ACTION_ALIAS
case FT_EXTERNAL_CONTENT_FILTER:
return "external content filter";
#endif
+ case FT_SUPPRESS_TAG:
+ return "suppress tag filter";
case FT_INVALID_FILTER:
return "invalid filter type";
}
log_error(LOG_LEVEL_ERROR, "Denying access to %s. No referrer found.",
csp->http->url);
}
- else if ((0 == strncmp(referrer, CGI_PREFIX, sizeof(CGI_PREFIX)-1))
+ else if ((0 == strncmp(referrer, CGI_PREFIX_HTTP, sizeof(CGI_PREFIX_HTTP)-1))
#ifdef FEATURE_HTTPS_INSPECTION
|| (0 == strncmp(referrer, CGI_PREFIX_HTTPS, sizeof(CGI_PREFIX_HTTPS)-1))
|| (0 == strncmp(referrer, alt_prefix_https, strlen(alt_prefix_https)))
if (!err) err = map(exports, "homepage", 1, html_encode(HOME_PAGE_URL), 0);
if (!err)
{
- err = map(exports, "default-cgi", 1, html_encode(
-#ifdef FEATURE_HTTPS_INSPECTION
- client_use_ssl(csp) ? CGI_PREFIX_HTTPS :
-#endif
- CGI_PREFIX), 0);
+ err = map(exports, "default-cgi", 1, html_encode(CGI_PREFIX), 0);
}
if (!err) err = map(exports, "menu", 1, make_menu(csp, caller), 0);
if (!err) err = map(exports, "code-status", 1, CODE_STATUS, 1);
/* Manual is delivered by Privoxy. */
if (!err)
{
- err = map(exports, "user-manual", 1, html_encode(
-#ifdef FEATURE_HTTPS_INSPECTION
- client_use_ssl(csp) ? CGI_PREFIX_HTTPS"user-manual/" :
-#endif
- CGI_PREFIX"user-manual/"), 0);
+ err = map(exports, "user-manual", 1, html_encode(CGI_PREFIX"user-manual/"), 0);
}
}
if (!err) err = map(exports, "actions-help-prefix", 1, ACTIONS_HELP_PREFIX ,1);
* the "blocked" template's JavaScript.
*/
string_append(&result, "<li><a href=\"");
- html_encoded_prefix = html_encode(
-#ifdef FEATURE_HTTPS_INSPECTION
- client_use_ssl(csp) ? CGI_PREFIX_HTTPS :
-#endif
- CGI_PREFIX);
+ html_encoded_prefix = html_encode(CGI_PREFIX);
if (html_encoded_prefix == NULL)
{
return NULL;
"E", "EXTERNAL-CONTENT-FILTER"
},
#endif
+ {
+ ACTION_MULTI_SUPPRESS_TAG,
+ "suppress-tag-params", "suppress-tag",
+ "suppress-tag-all", "suppress_tag_all",
+ "U", "SUPPRESS-TAG"
+ },
};
/* FIXME: Following non-static functions should be prototyped in .h or made static */
const struct action_spec *action);
static jb_err actions_from_radio(const struct map * parameters,
struct action_spec *action);
+static jb_err action_render_string_filters_template(struct map * exports,
+ const struct action_spec *action,
+ const char* flter_template,
+ const struct filter_type_info *type);
static jb_err map_copy_parameter_html(struct map *out,
const struct map *parameters)
{
struct map * exports;
+ char *filter_template;
unsigned sectionid;
struct editable_file * file;
struct file_line * cur_line;
return JB_ERR_MEMORY;
}
+ err = template_load(csp, &filter_template, "edit-actions-for-url-string-filter", 0);
+ if (err)
+ {
+ edit_free_file(file);
+ free_map(exports);
+ return cgi_error_no_template(csp, rsp, "edit-actions-for-url-string-filter");
+ }
+
err = map(exports, "f", 1, stringify(file->identifier), 0);
if (!err) err = map(exports, "v", 1, file->version_str, 1);
if (!err) err = map(exports, "s", 1, url_encode(lookup(parameters, "s")), 0);
if (!err) err = actions_to_radio(exports, cur_line->data.action);
+ if (!err) err = action_render_string_filters_template(exports, cur_line->data.action, filter_template,
+ &filter_type_info[FT_SUPPRESS_TAG]);
+ freez(filter_template);
+
/*
* XXX: Some browsers (at least IE6 and IE7) have an artificial URL
* length limitation and ignore clicks on the Submit buttons if
/*
* List available filters and their settings.
*/
- char *filter_template;
int filter_identifier = 0;
char *prepared_templates[MAX_FILTER_TYPES];
if (filter_line == NULL) err = JB_ERR_MEMORY;
}
if (!err) err = template_fill(&filter_line, line_exports);
- string_join(&prepared_templates[type], filter_line);
+ if (!err) err = string_join(&prepared_templates[type], filter_line);
free_map(line_exports);
}
}
}
+ /* process existing suppress tag */
+ for (filter_identifier = 0; !err; filter_identifier++)
+ {
+ char key_value[30];
+ char key_name[30];
+ char old_name[30];
+ char key_type[30];
+ const char *name, *new_name;
+ char value; /*
+ * Filter state. Valid states are: 'Y' (active),
+ * 'N' (inactive) and 'X' (no change).
+ * XXX: bad name.
+ */
+ char type; /*
+ * Abbreviated filter type. Valid types are: 'U' (suppress tag).
+ */
+ int multi_action_index = 0;
+
+ /* Generate the keys */
+ snprintf(key_value, sizeof(key_value), "string_filter_r%x", filter_identifier);
+ snprintf(key_name, sizeof(key_name), "string_filter_n%x", filter_identifier);
+ snprintf(old_name, sizeof(old_name), "string_filter_o%x", filter_identifier);
+ snprintf(key_type, sizeof(key_type), "string_filter_t%x", filter_identifier);
+
+ err = get_string_param(parameters, old_name, &name);
+ if (err) break;
+
+ if (name == NULL)
+ {
+ /* The filter identifier isn't present: we're done! */
+ break;
+ }
+
+ err = get_string_param(parameters, key_name, &new_name);
+ if (err) break;
+ if (new_name == NULL) new_name = name;
+
+ type = get_char_param(parameters, key_type);
+ switch (type)
+ {
+ case 'U':
+ multi_action_index = ACTION_MULTI_SUPPRESS_TAG;
+ break;
+ default:
+ log_error(LOG_LEVEL_ERROR,
+ "Unknown filter type: %c for filter %s. Filter ignored.", type, name);
+ continue;
+ }
+ assert(multi_action_index);
+
+ value = get_char_param(parameters, key_value);
+ if (value == 'X' || value == 'Y' || value == 'N')
+ {
+ list_remove_item(cur_line->data.action->multi_add[multi_action_index], name);
+ list_remove_item(cur_line->data.action->multi_remove[multi_action_index], name);
+ }
+
+ if (value == 'Y')
+ {
+ err = enlist(cur_line->data.action->multi_add[multi_action_index], new_name);
+ }
+ else if (value == 'N')
+ {
+ err = enlist(cur_line->data.action->multi_remove[multi_action_index], new_name);
+ }
+ }
+
+ /* process new string filters */
+ for (filter_identifier = 0; !err; filter_identifier++)
+ {
+ char key_value[30];
+ char key_name[30];
+ char key_type[30];
+ const char *name;
+ char value; /*
+ * Filter state. Valid states are: 'Y' (active),
+ * 'N' (inactive) and 'X' (no change).
+ * XXX: bad name.
+ */
+ char type; /*
+ * Abbreviated filter type. Valid types are: 'U' (suppress tag).
+ */
+ int multi_action_index = 0;
+
+ /* Generate the keys */
+ snprintf(key_value, sizeof(key_value), "new_string_filter_r%x", filter_identifier);
+ snprintf(key_name, sizeof(key_name), "new_string_filter_n%x", filter_identifier);
+ snprintf(key_type, sizeof(key_type), "new_string_filter_t%x", filter_identifier);
+
+ err = get_string_param(parameters, key_name, &name);
+ if (err) break;
+
+ if (name == NULL)
+ {
+ /* The filter identifier isn't present: we've done! */
+ break;
+ }
+
+ type = get_char_param(parameters, key_type);
+ switch (type)
+ {
+ case 'U':
+ multi_action_index = ACTION_MULTI_SUPPRESS_TAG;
+ break;
+ default:
+ log_error(LOG_LEVEL_ERROR,
+ "Unknown filter type: %c for filter %s. Filter ignored.", type, name);
+ continue;
+ }
+ assert(multi_action_index);
+
+ value = get_char_param(parameters, key_value);
+ if (value == 'Y')
+ {
+ list_remove_item(cur_line->data.action->multi_add[multi_action_index], name);
+ if (!err) err = enlist(cur_line->data.action->multi_add[multi_action_index], name);
+ list_remove_item(cur_line->data.action->multi_remove[multi_action_index], name);
+ }
+ else if (value == 'N')
+ {
+ list_remove_item(cur_line->data.action->multi_add[multi_action_index], name);
+ list_remove_item(cur_line->data.action->multi_remove[multi_action_index], name);
+ if (!err) err = enlist(cur_line->data.action->multi_remove[multi_action_index], name);
+ }
+ /* nothing to do if the value is 'X' */
+ }
+
if (err)
{
/* Out of memory */
return JB_ERR_OK;
}
+/*********************************************************************
+ *
+ * Function : action_render_string_filters_template
+ *
+ * Description : Converts a actionsfile entry into HTML template for actions with string
+ * filters (currently SUPPRESS-TAG actions only)
+ *
+ * Parameters :
+ * 1 : exports = List of substitutions to add to.
+ * 2 : action = Action to read
+ * 3 : filter_template = template to fill
+ * 4 : type = filter type info for rendered values/macro name
+ *
+ * Returns : JB_ERR_OK on success
+ * JB_ERR_MEMORY on out-of-memory
+ *
+ *********************************************************************/
+static jb_err action_render_string_filters_template(struct map * exports,
+ const struct action_spec *action,
+ const char* filter_template,
+ const struct filter_type_info *type)
+{
+ jb_err err = JB_ERR_OK;
+ int filter_identifier = 0;
+ char *prepared_template = strdup("");
+
+ struct action_multi {
+ char radio;
+ struct list_entry *list;
+ };
+
+ struct action_multi desc[] = {
+ { 'y', action->multi_add[type->multi_action_index][0].first },
+ { 'n', action->multi_remove[type->multi_action_index][0].first }
+ };
+
+ for (int i=0; i < SZ(desc); ++i)
+ {
+ const char radio = desc[i].radio;
+ struct list_entry *entry = desc[i].list;
+ for (;(!err) && (entry != NULL); entry = entry->next)
+ {
+ char number[20];
+ struct map *line_exports;
+
+ /* Generate a unique serial number */
+ snprintf(number, sizeof(number), "%x", filter_identifier++);
+
+ line_exports = new_map();
+ if (line_exports == NULL)
+ {
+ err = JB_ERR_MEMORY;
+ }
+ else
+ {
+ char *filter_line;
+ if (!err) err = map(line_exports, "index", 1, number, 1);
+ if (!err) err = map(line_exports, "name", 1, entry->str, 1);
+ if (!err) err = map_radio(line_exports, "this-filter", "ynx", radio);
+ if (!err) err = map(line_exports, "filter-type", 1, type->type, 1);
+ if (!err) err = map(line_exports, "abbr-filter-type", 1, type->abbr_type, 1);
+ if (!err) err = map(line_exports, "anchor", 1, type->anchor, 1);
+ if (!err)
+ {
+ filter_line = strdup(filter_template);
+ if (filter_line == NULL) err = JB_ERR_MEMORY;
+ }
+ if (!err) err = template_fill(&filter_line, line_exports);
+ if (!err) err = string_join(&prepared_template, filter_line);
+
+ free_map(line_exports);
+ }
+ }
+ }
+ if (!err) map(exports, type->macro_name, 1, prepared_template, 1);
+ freez(prepared_template);
+ return err;
+}
/*********************************************************************
*
}
if (map(exports, "processed-request", 1,
- html_encode_and_free_original(list_to_text(csp->headers)), 0))
+ html_encode_and_free_original(
+#ifdef FEATURE_HTTPS_INSPECTION
+ csp->http->ssl ?
+ list_to_text(csp->https_headers) :
+#endif
+ list_to_text(csp->headers)
+ ), 0))
{
free_map(exports);
return JB_ERR_MEMORY;
AC_SUBST(PTHREAD_ONLY)
-dnl =================================================================
-dnl On most platforms select() does not support fd numbers above
-dnl FD_SETSIZE, as a result Privoxy can't handle more than
-dnl approximately FD_SETSIZE/2 client connections.
-dnl On some platforms the value can be changed at compile time,
-dnl on others it's hardcoded and requires recompilation of the OS.
-dnl Only relevant if select() is actually being used.
-dnl =================================================================
-AC_ARG_WITH(fdsetsize,
- [ --with-fdsetsize=n Optimistically redefine FD_SETSIZE with the intend to change the number of connections Privoxy can handle. Dangerous if the platform doesn't support this. Pointless if Privoxy can use poll() instead of select().],
- [
- if test "x$withval" != "xyes"; then
- AC_DEFINE_UNQUOTED(FD_SETSIZE,$with_fdsetsize,[Relevant for select(). Not honoured by all OS.])
- echo "Redefining FD_SETSIZE to $with_fdsetsize."
- AC_MSG_WARN(On platforms that don't support FD_SETSIZE redefinition it may cause memory corruption.)
- else
- AC_MSG_ERROR(--with-fdsetsize used without value)
- fi
- ]
-)
-
dnl =================================================================
dnl Support for thread-safe versions of gethostbyaddr, gethostbyname,
dnl gmtime and localtime
belco24.de/
# URL = https://www.tagesschau.de/multimedia/bilder/banner-zak-kostopoulos-101~_v-mittel16x9.jpg
.tagesschau.de/
+# URL = https://metrics.sr.ht/graph
+metrics.sr.ht/
#############################################################################
# (Note #2: Is 'sex' a rude word?!)
s%^.*(?<!middle)(?<!sus)(?<!es)sex.*$%<html><head><title>Blocked</title></head><body>\
-<h3>Blocked by Privoxy's crude-parental filter due to possible adult content.</h3></body></html>%is
+<h3>Blocked by <a href="http://p.p/">Privoxy's</a> crude-parental filter due to possible adult content.</h3></body></html>%is
s+^.*warez.*$+<html><head><title>No Warez</title></head><body><h3>You're not searching for illegal stuff, are you?</h3></body></html>+is
# Remove by description
-s/^.*\
+s@^.*\
(?:(suck|lick|tongue|rub|fuck|fingering|finger|chicks?)\s*)?\
(?:(her|your|my|hard|with|big|wet|tight|pink|hot|moist|young|teen)\s*)+\
(dicks?|penis|cocks?|balls?|tits?|pussy|cunt|clit|ass|mouth).*$\
-/This page has been blocked by Privoxy's crude-parental content filter\
-/is
+@This page has been blocked by <a href="http://p.p/">Privoxy's</a> crude-parental content filter\
+@is
#Remove by link text
-s/^.*\
+s@^.*\
(download|broadband|view|watch|free|get|extreem)?\s*\
(sex|xxx|porn|cumshot|fuck(ing|s)?|anal|ass|asian|adult|Amateur|org(y|ies)|close ups?|hand?job|nail(ed)?)+\s*\
(movies?|pics?|videos?|dvds?|dvd's|links?).*$\
-/This page has been blocked by Privoxy's crude-parental content filter\
-/is
+@This page has been blocked by <a href="http://p.p/">Privoxy's</a> crude-parental content filter\
+@is
#Remove by age disclaimer
-s/^.*\
+s@^.*\
(models?|chicks?|girls?|women|persons)\s*\
(who|are|were)+ (over|at least) (16|18|21) years (old|of age).*$\
-/This page has been blocked by Privoxy's crude-parental content filter\
-/is
+@This page has been blocked by <a href="http://p.p/">Privoxy's</a> crude-parental content filter\
+@is
#Remove by regulations
-s/^.*(Section 2257|18 U.?S.?C.? 2257).*$\
-/This page has been blocked by Privoxy's crude-parental content filter\
-/is
+s@^.*(Section 2257|18 U.?S.?C.? 2257).*$\
+@This page has been blocked by <a href="http://p.p/">Privoxy's</a> crude-parental content filter\
+@is
#################################################################################
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!entity % dummy "IGNORE">
<!entity authors SYSTEM "p-authors.sgml">
-<!entity p-version "3.0.29">
-<!entity p-status "stable">
-<!entity % p-not-stable "IGNORE">
-<!entity % p-stable "INCLUDE">
+<!entity p-version "3.0.30">
+<!entity p-status "UNRELEASED">
+<!entity % p-not-stable "INCLUDE">
+<!entity % p-stable "IGNORE">
<!entity % p-text "INCLUDE"> <!-- define we are a text only doc -->
<!entity % p-authors-formal "INCLUDE"> <!-- include additional text, etc -->
]>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN"[
<!entity % dummy "IGNORE">
<!entity config SYSTEM "p-config.sgml">
-<!entity p-version "3.0.29">
-<!entity p-status "stable">
-<!entity % p-not-stable "IGNORE">
+<!entity p-version "3.0.30">
+<!entity p-status "UNRELEASED">
+<!entity % p-not-stable "INCLUDE">
<!entity % user-man "IGNORE">
<!entity % config-file "IGNORE">
<!entity my-app "<application>Privoxy</application>">
<!entity p-intro SYSTEM "privoxy.sgml">
<!entity history SYSTEM "history.sgml">
<!entity seealso SYSTEM "seealso.sgml">
-<!entity p-version "3.0.29">
-<!entity p-status "stable">
-<!entity % p-not-stable "IGNORE">
-<!entity % p-stable "INCLUDE">
+<!entity p-version "3.0.30">
+<!entity p-status "UNRELEASED">
+<!entity % p-not-stable "INCLUDE">
+<!entity % p-stable "IGNORE">
<!entity % p-text "IGNORE"> <!-- define we are not a text only doc -->
<!entity % p-doc "INCLUDE"> <!-- and we are a formal doc -->
<!entity % seealso-extra "INCLUDE"> <!-- extra stuff from seealso.sgml -->
-->
<para>
<application>Privoxy</application>, as an heir to
- <application>Junkbuster</application>, is a Free Software project
- and the code is licensed under the GNU General Public License version 2.
+ <application>Junkbuster</application>, is a <ulink
+ url="https://www.privoxy.org/user-manual/copyright.html">Free Software</ulink> project.
As such, <application>Privoxy</application> development is potentially open
to anyone who has the time, knowledge, and desire to contribute
in any capacity. Our goals are simply to continue the mission,
such changes are fully tested ought they be pushed back to the central
repository master branch.
</para>
+ <para>
+ Before pushing stuff, please rebase it on a current master so we get
+ an uncomplicated commit history. Avoid merges where possible.
+ </para>
<!--
<para>
Branches are used to fork a sub-development path from the main trunk.
Note that near a major public release, we get more cautious.
There is always the possibility to submit a patch to the <ulink
url="https://sourceforge.net/p/ijbswa/patches/">patch
- tracker</ulink> instead.
+ tracker</ulink> or the <ulink
+ url="https://lists.privoxy.org/mailman/listinfo/privoxy-devel">privoxy-devel mailing list</ulink>
+ instead.
</para>
</listitem>
</itemizedlist>
<orderedlist numeration="arabic">
<listitem><para>
First, build the docs by running <computeroutput>make
- dok</computeroutput>.
+ dok dok-tidy</computeroutput>.
</para></listitem>
<listitem><para>
Run <computeroutput>make webserver</computeroutput> which copies all
<!-- ~~~~~ New section ~~~~~ -->
- <sect2><title>Privoxy Custom Entities</title>
+ <sect2 id="custom-entities"><title>Privoxy Custom Entities</title>
<para>
<application>Privoxy</application> documentation is using
a number of customized <quote>entities</quote> to facilitate
</sect2>
<!-- XXX: Document how to write test reports and where to send them -->
+ <!-- ~~~~~ New section ~~~~~ -->
+ <sect2 id="privoxy-regression-test"><title>Testing with <application>Privoxy-Regression-Test</application></title>
+ <para>
+ If you compiled, packaged or merely installed Privoxy, it is recommended to run
+ <application>Privoxy-Regression-Test</application> to verify that at least
+ the tested parts of <application>Privoxy</application> are working as expected.
+ </para>
+ <para>
+ This is actually pretty easy. For details, please see
+ <command>perldoc privoxy-regression-test.pl</command>.
+ </para>
+ </sect2>
+
<!-- ~~~~~ New section ~~~~~ -->
<sect2 id="fuzzing"><title>Fuzzing Privoxy</title>
<para>
<!entity history SYSTEM "history.sgml">
<!entity copyright SYSTEM "copyright.sgml">
<!entity license SYSTEM "license.sgml">
-<!entity p-version "3.0.29">
-<!entity p-status "stable">
-<!entity % p-not-stable "IGNORE">
-<!entity % p-stable "INCLUDE">
+<!entity p-version "3.0.30">
+<!entity p-status "UNRELEASED">
+<!entity % p-not-stable "INCLUDE">
+<!entity % p-stable "IGNORE">
<!entity % p-text "IGNORE"> <!-- define we are not a text only doc -->
<!entity % p-doc "INCLUDE"> <!-- and we are a formal doc -->
<!entity % p-supp-userman "INCLUDE"> <!-- Include all from supported.sgml -->
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!entity % dummy "IGNORE">
<!entity buildsource SYSTEM "buildsource.sgml">
-<!entity p-version "3.0.29">
-<!entity p-status "stable">
-<!entity % p-stable "INCLUDE">
-<!entity % p-not-stable "IGNORE">
+<!entity p-version "3.0.30">
+<!entity p-status "UNRELEASED">
+<!entity % p-stable "IGNORE">
+<!entity % p-not-stable "INCLUDE">
<!entity % p-alpha "IGNORE">
<!entity % p-beta "IGNORE">
<!entity % p-text "INCLUDE"> <!-- define we are a text only doc -->
<term>Notes:</term>
<listitem>
<para>
- This directive specifies the name of the CA key file
- in ".pem" format. See the <ulink url="#CA-CERT-FILE">ca-cert-file</ulink>
- for a command to generate it.
+ This directive specifies the name of the CA key file in ".pem" format.
+ The <ulink url="#CA-CERT-FILE">ca-cert-file section</ulink> contains
+ a command to generate it.
</para>
</listitem>
</varlistentry>
<!entity copyright SYSTEM "copyright.sgml">
<!entity license SYSTEM "license.sgml">
<!entity authors SYSTEM "p-authors.sgml">
-<!entity p-version "3.0.29">
-<!entity p-status "stable">
-<!entity % p-not-stable "IGNORE">
-<!entity % p-stable "INCLUDE">
+<!entity p-version "3.0.30">
+<!entity p-status "UNRELEASED">
+<!entity % p-not-stable "INCLUDE">
+<!entity % p-stable "IGNORE">
<!entity % p-text "IGNORE"> <!-- define we are not a text only doc -->
<!entity % p-authors-formal "IGNORE"> <!-- exclude additional formatting -->
<!entity my-copy "(C)"> <!-- db2man barfs on copyright symbol -->
<itemizedlist>
<listitem>
<para>
- <ulink url="https://www.privoxy.org/faq/general.html#PARTICIPATE">
- https://www.privoxy.org/faq/general.html#PARTICIPATE</ulink>
+ <ulink url="https://www.privoxy.org/participate">https://www.privoxy.org/participate</ulink>
</para>
</listitem>
<listitem>
<para>
- <ulink url="https://www.privoxy.org/faq/general.html#DONATE">
- https://www.privoxy.org/faq/general.html#DONATE</ulink>
+ <ulink url="https://www.privoxy.org/donate">https://www.privoxy.org/donate</ulink>
</para>
</listitem>
</itemizedlist>
<!entity p-intro SYSTEM "privoxy.sgml">
<!entity contacting SYSTEM "contacting.sgml">
<!entity buildsource SYSTEM "buildsource.sgml">
-<!entity p-version "3.0.29">
-<!entity p-status "stable">
-<!entity % p-not-stable "IGNORE">
-<!entity % p-stable "INCLUDE">
+<!entity p-version "3.0.30">
+<!entity p-status "UNRELEASED">
+<!entity % p-not-stable "INCLUDE">
+<!entity % p-stable "IGNORE">
<!entity % p-text "INCLUDE"> <!-- define we are a text only doc -->
<!entity % p-doc "IGNORE"> <!-- and never a text doc -->
<!entity % p-readme "INCLUDE"> <!-- all your README belong to us -->
-->
<para>
At present, <application>Privoxy</application> is known to run on
- Windows 95 and later versions (98, ME, 2000, XP, Vista, Windows 7 etc.),
+ Windows 95 and later versions (98, ME, 2000, XP, Vista, Windows 7, Windows 10 etc.),
GNU/Linux (RedHat, SuSE, Debian, Fedora, Gentoo, Slackware and others),
Mac OS X (10.4 and upwards on PPC and Intel processors),
Haiku,
<!entity p-authors SYSTEM "p-authors.sgml">
<!entity config SYSTEM "p-config.sgml">
<!entity changelog SYSTEM "changelog.sgml">
-<!entity p-version "3.0.29">
-<!entity p-status "stable">
+<!entity p-version "3.0.30">
+<!entity p-status "UNRELEASED">
<!entity % p-authors-formal "INCLUDE"> <!-- include additional text, etc -->
-<!entity % p-not-stable "IGNORE">
-<!entity % p-stable "INCLUDE">
+<!entity % p-not-stable "INCLUDE">
+<!entity % p-stable "IGNORE">
<!entity % p-text "IGNORE"> <!-- define we are not a text only doc -->
<!entity % p-doc "INCLUDE"> <!-- and we are a formal doc -->
<!entity % p-readme "IGNORE">
<varlistentry>
<term>Example usage:</term>
<listitem>
- <screen>+hide-user-agent{Netscape 6.1 (X11; I; Linux 2.4.18 i686)}</screen>
+ <screen>+hide-user-agent{Mozilla/5.0 (X11; ElectroBSD i386; rv:78.0) Gecko/20100101 Firefox/78.0}</screen>
</listitem>
</varlistentry>
</variablelist>
</sect3>
+<!-- ~~~~~ New section ~~~~~ -->
+<sect3 renderas="sect4" id="suppress-tag">
+<title>suppress-tag</title>
+
+<variablelist>
+ <varlistentry>
+ <term>Typical use:</term>
+ <listitem>
+ <para>
+ Suppress client or server tag.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Effect:</term>
+ <listitem>
+ <para>
+ Server or client tags to which this action applies are not added to the request,
+ thus making all actions that are specific to these request tags inactive.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Type:</term>
+ <!-- boolean, parameterized, Multi-value -->
+ <listitem>
+ <para>Multi-value.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Parameter:</term>
+ <listitem>
+ <para>
+ The result tag of a server-header or client-header tagger, as defined in one of the
+ <link linkend="filter-file">filter files</link>.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Example usage (section):</term>
+ <listitem>
+ <screen>
+# Suppress tag produced by range-requests client-header tagger for requests coming from address 10.0.0.1
+{+suppress-tag{RANGE-REQUEST}}
+TAG:^IP-ADDRESS: 10\.0\.0\.1$
+</screen>
+ </listitem>
+ </varlistentry>
+
+</variablelist>
+</sect3>
+
+
<!-- ~~~~~ New section ~~~~~ -->
<sect3 renderas="sect4" id="session-cookies-only">
<title>session-cookies-only</title>
<!entity history SYSTEM "history.sgml">
<!entity copyright SYSTEM "copyright.sgml">
<!entity license SYSTEM "license.sgml">
-<!entity p-version "3.0.29">
-<!entity p-status "stable">
-<!entity % p-not-stable "IGNORE">
-<!entity % p-stable "INCLUDE">
+<!entity p-version "3.0.30">
+<!entity p-status "UNRELEASED">
+<!entity % p-not-stable "INCLUDE">
+<!entity % p-stable "IGNORE">
<!entity my-copy "©"> <!-- kludge for docbook2man -->
<!entity % p-homepage "IGNORE"> <!-- toggle for webserver index.html -->
<!entity % p-index "IGNORE"> <!-- toggle for local doc index -->
<p>How do you update the webserver (i.e. the pages on privoxy.org)?</p>
<ol type="1">
<li>
- <p>First, build the docs by running <samp class="COMPUTEROUTPUT">make dok</samp>.</p>
+ <p>First, build the docs by running <samp class="COMPUTEROUTPUT">make dok dok-tidy</samp>.</p>
</li>
<li>
<p>Run <samp class="COMPUTEROUTPUT">make webserver</samp> which copies all files from <samp class=
</ul>
</div>
<div class="SECT2">
- <h2 class="SECT2"><a name="AEN205" id="AEN205">3.3. Privoxy Custom Entities</a></h2>
+ <h2 class="SECT2"><a name="CUSTOM-ENTITIES" id="CUSTOM-ENTITIES">3.3. Privoxy Custom Entities</a></h2>
<p><span class="APPLICATION">Privoxy</span> documentation is using a number of customized <span class=
"QUOTE">"entities"</span> to facilitate documentation maintenance.</p>
<p>We are using a set of <span class="QUOTE">"boilerplate"</span> files with generic text, that is used by
<tbody>
<tr>
<td><span class="emphasis"><i class="EMPHASIS">p-version</i></span>: the <span class=
- "APPLICATION">Privoxy</span> version string, e.g. <span class="QUOTE">"3.0.29"</span>.</td>
+ "APPLICATION">Privoxy</span> version string, e.g. <span class="QUOTE">"3.0.30"</span>.</td>
</tr>
<tr>
<td><span class="emphasis"><i class="EMPHASIS">p-status</i></span>: the project status, either
<p>Whilst the central repository contains only the master branch, developers are of course free to create
branches in their local repositories as they develop features, fixes, or update the target-dependent tools. Only
once such changes are fully tested ought they be pushed back to the central repository master branch.</p>
+ <p>Before pushing stuff, please rebase it on a current master so we get an uncomplicated commit history. Avoid
+ merges where possible.</p>
<p>At one time there were two distinct branches: stable and unstable. The more drastic changes were to be in the
unstable branch. These branches have now been merged to minimize time and effort of maintaining two branches.</p>
</div>
</li>
<li>
<p>Note that near a major public release, we get more cautious. There is always the possibility to submit a
- patch to the <a href="https://sourceforge.net/p/ijbswa/patches/" target="_top">patch tracker</a> instead.</p>
+ patch to the <a href="https://sourceforge.net/p/ijbswa/patches/" target="_top">patch tracker</a> or the
+ <a href="https://lists.privoxy.org/mailman/listinfo/privoxy-devel" target="_top">privoxy-devel mailing
+ list</a> instead.</p>
</li>
</ul>
</div>
helpful!) reading for anyone who wants to join the team. Note that it's currently out of date and may not be
entirely correct. As always, patches are welcome.</p>
<p>Please note that this document is constantly evolving. This copy represents the state at the release of
- version 3.0.29. You can find the latest version of the this manual at <a href=
+ version 3.0.30. You can find the latest version of the this manual at <a href=
"https://www.privoxy.org/developer-manual/" target="_top">https://www.privoxy.org/developer-manual/</a>.
Please have a look at the <a href="https://www.privoxy.org/user-manual/contact.html" target="_top">contact
section in the user manual</a> if you are interested in contacting the developers.</p>
<dt>3.1. <a href="documentation.html#SGML">Quickstart to Docbook and SGML</a></dt>
<dt>3.2. <a href="documentation.html#DOCSTYLE"><span class="APPLICATION">Privoxy</span> Documentation
Style</a></dt>
- <dt>3.3. <a href="documentation.html#AEN205">Privoxy Custom Entities</a></dt>
+ <dt>3.3. <a href="documentation.html#CUSTOM-ENTITIES">Privoxy Custom Entities</a></dt>
</dl>
</dd>
<dt>4. <a href="coding.html">Coding Guidelines</a></dt>
<dd>
<dl>
<dt>5.1. <a href="testing.html#TESTING-PLAN">Testplan for releases</a></dt>
- <dt>5.2. <a href="testing.html#FUZZING">Fuzzing Privoxy</a></dt>
+ <dt>5.2. <a href="testing.html#PRIVOXY-REGRESSION-TEST">Testing with <span class=
+ "APPLICATION">Privoxy-Regression-Test</span></a></dt>
+ <dt>5.3. <a href="testing.html#FUZZING">Fuzzing Privoxy</a></dt>
</dl>
</dd>
<dt>6. <a href="newrelease.html">Releasing a New Version</a></dt>
</div>
<div class="SECT1">
<h1 class="SECT1"><a name="INTRODUCTION" id="INTRODUCTION">1. Introduction</a></h1>
- <p><span class="APPLICATION">Privoxy</span>, as an heir to <span class="APPLICATION">Junkbuster</span>, is a Free
- Software project and the code is licensed under the GNU General Public License version 2. As such, <span class=
- "APPLICATION">Privoxy</span> development is potentially open to anyone who has the time, knowledge, and desire to
- contribute in any capacity. Our goals are simply to continue the mission, to improve <span class=
+ <p><span class="APPLICATION">Privoxy</span>, as an heir to <span class="APPLICATION">Junkbuster</span>, is a
+ <a href="https://www.privoxy.org/user-manual/copyright.html" target="_top">Free Software</a> project. As such,
+ <span class="APPLICATION">Privoxy</span> development is potentially open to anyone who has the time, knowledge, and
+ desire to contribute in any capacity. Our goals are simply to continue the mission, to improve <span class=
"APPLICATION">Privoxy</span>, and to make it available to as wide an audience as possible.</p>
<p>One does not have to be a programmer to contribute. Packaging, testing, documenting and porting, are all
important jobs as well.</p>
<table border="0" bgcolor="#E0E0E0" width="100%">
<tr>
<td>
- <pre class="PROGRAMLISTING"> debchange -v 3.0.29-stable-1 "New upstream version"</pre>
+ <pre class="PROGRAMLISTING"> debchange -v 3.0.30-UNRELEASED-1 "New upstream version"</pre>
</td>
</tr>
</table>
</td>
</tr>
</table>
- <p>This will create <tt class="FILENAME">../privoxy_3.0.29-stable-1_i386.deb</tt> which can be uploaded. To
+ <p>This will create <tt class="FILENAME">../privoxy_3.0.30-UNRELEASED-1_i386.deb</tt> which can be uploaded. To
upload the package to Sourceforge, simply issue</p>
<table border="0" bgcolor="#E0E0E0" width="100%">
<tr>
"_top">https://sourceforge.net/project/admin/editpackages.php?group_id=11118</a>, making sure you are logged in.
Find your target platform in the second column, and click <tt class="LITERAL">Add Release</tt>. You will then
need to create a new release for your package, using the format of <tt class="LITERAL">$VERSION
- ($CODE_STATUS)</tt>, e.g. <span class="emphasis"><i class="EMPHASIS">3.0.29 (beta)</i></span>.</p>
+ ($CODE_STATUS)</tt>, e.g. <span class="emphasis"><i class="EMPHASIS">3.0.30 (beta)</i></span>.</p>
<p>Now just follow the prompts. Be sure to add any appropriate Release notes. You should see your freshly
uploaded packages in <span class="QUOTE">"Step 2. Add Files To This Release"</span>. Check the appropriate
box(es). Remember at each step to hit the <span class="QUOTE">"Refresh/Submit"</span> buttons! You should now see
</ol>
</div>
<div class="SECT2">
- <h2 class="SECT2"><a name="FUZZING" id="FUZZING">5.2. Fuzzing Privoxy</a></h2>
+ <h2 class="SECT2"><a name="PRIVOXY-REGRESSION-TEST" id="PRIVOXY-REGRESSION-TEST">5.2. Testing with <span class=
+ "APPLICATION">Privoxy-Regression-Test</span></a></h2>
+ <p>If you compiled, packaged or merely installed Privoxy, it is recommended to run <span class=
+ "APPLICATION">Privoxy-Regression-Test</span> to verify that at least the tested parts of <span class=
+ "APPLICATION">Privoxy</span> are working as expected.</p>
+ <p>This is actually pretty easy. For details, please see <b class="COMMAND">perldoc
+ privoxy-regression-test.pl</b>.</p>
+ </div>
+ <div class="SECT2">
+ <h2 class="SECT2"><a name="FUZZING" id="FUZZING">5.3. Fuzzing Privoxy</a></h2>
<p>To make fuzzing more convenient, Privoxy can be configured with --enable-fuzz which will result in the --fuzz
option becoming available.</p>
<p>Example (tested on ElectroBSD):</p>
<p>Helping hands and donations are welcome:</p>
<ul>
<li>
- <p><a href="https://www.privoxy.org/faq/general.html#PARTICIPATE" target=
- "_top">https://www.privoxy.org/faq/general.html#PARTICIPATE</a></p>
+ <p><a href="https://www.privoxy.org/participate" target=
+ "_top">https://www.privoxy.org/participate</a></p>
</li>
<li>
- <p><a href="https://www.privoxy.org/faq/general.html#DONATE" target=
- "_top">https://www.privoxy.org/faq/general.html#DONATE</a></p>
+ <p><a href="https://www.privoxy.org/donate" target="_top">https://www.privoxy.org/donate</a></p>
</li>
</ul>
<p>Please note that this document is a work in progress. This copy represents the state at the release of
- version 3.0.29. You can find the latest version of the document at <a href="https://www.privoxy.org/faq/"
+ version 3.0.30. You can find the latest version of the document at <a href="https://www.privoxy.org/faq/"
target="_top">https://www.privoxy.org/faq/</a>. Please see the <a href="contact.html">Contact section</a> if
you want to contact the developers.</p>
</div>
<div class="SECT2">
<h3 class="SECT2"><a name="WHICHOS" id="WHICHOS">2.2. Which operating systems are supported?</a></h3>
<p>At present, <span class="APPLICATION">Privoxy</span> is known to run on Windows 95 and later versions (98, ME,
- 2000, XP, Vista, Windows 7 etc.), GNU/Linux (RedHat, SuSE, Debian, Fedora, Gentoo, Slackware and others), Mac OS
- X (10.4 and upwards on PPC and Intel processors), Haiku, DragonFly, ElectroBSD, FreeBSD, NetBSD, OpenBSD,
- Solaris, and various other flavors of Unix.</p>
+ 2000, XP, Vista, Windows 7, Windows 10 etc.), GNU/Linux (RedHat, SuSE, Debian, Fedora, Gentoo, Slackware and
+ others), Mac OS X (10.4 and upwards on PPC and Intel processors), Haiku, DragonFly, ElectroBSD, FreeBSD, NetBSD,
+ OpenBSD, Solaris, and various other flavors of Unix.</p>
<p>But any operating system that runs TCP/IP, can conceivably take advantage of <span class=
"APPLICATION">Privoxy</span> in a networked situation where <span class="APPLICATION">Privoxy</span> would run as
a server on a LAN gateway. Then only the <span class="QUOTE">"gateway"</span> needs to be running one of the
<div>
<div class="ABSTRACT">
<a name="AEN4" id="AEN4"></a>
- <p><img src="images/privoxy.png" align="right"> Privoxy is a non-caching web proxy with advanced filtering
- capabilities for enhancing privacy, modifying web page data and HTTP headers, controlling access, and
- removing ads and other obnoxious Internet junk. Privoxy has a flexible configuration and can be customized to
- suit individual needs and tastes. It has application for both stand-alone systems and multi-user
- networks.</p>
+ <p><img src="images/privoxy.png" align="right" alt="Privoxy logo"> Privoxy is a non-caching web proxy with
+ advanced filtering capabilities for enhancing privacy, modifying web page data and HTTP headers, controlling
+ access, and removing ads and other obnoxious Internet junk. Privoxy has a flexible configuration and can be
+ customized to suit individual needs and tastes. It has application for both stand-alone systems and
+ multi-user networks.</p>
<p>Privoxy is Free Software and licensed under the GNU GPLv2 or later.</p>
<p>Privoxy is an associated project of Software in the Public Interest (SPI).</p>
<p>Helping hands and donations are welcome:</p>
<ul>
<li>
- <p><a href="https://www.privoxy.org/faq/general.html#PARTICIPATE" target=
- "_top">https://www.privoxy.org/faq/general.html#PARTICIPATE</a></p>
+ <p><a href="https://www.privoxy.org/participate" target=
+ "_top">https://www.privoxy.org/participate</a></p>
</li>
<li>
- <p><a href="https://www.privoxy.org/faq/general.html#DONATE" target=
- "_top">https://www.privoxy.org/faq/general.html#DONATE</a></p>
+ <p><a href="https://www.privoxy.org/donate" target="_top">https://www.privoxy.org/donate</a></p>
</li>
</ul>
- <p>The most recent release is <a href="announce.txt" target="_top">3.0.29 (stable)</a>.</p>
+ <p>The most recent release is <a href="announce.txt" target="_top">3.0.30 (UNRELEASED)</a>.</p>
</div>
</div>
<hr>
<div class="ARTICLE">
<div class="TITLEPAGE">
<h1 class="TITLE"><a name="AEN2" id="AEN2">Privoxy - The Privacy Enhancing Proxy</a></h1>
- <h2 class="SUBTITLE">Project Index Page v3.0.29</h2>
+ <h2 class="SUBTITLE">Project Index Page v3.0.30</h2>
<div>
<div class="ABSTRACT">
<a name="AEN5" id="AEN5"></a>
<p>Helping hands and donations are welcome:</p>
<ul>
<li>
- <p><a href="https://www.privoxy.org/faq/general.html#PARTICIPATE" target=
- "_top">https://www.privoxy.org/faq/general.html#PARTICIPATE</a></p>
+ <p><a href="https://www.privoxy.org/participate" target=
+ "_top">https://www.privoxy.org/participate</a></p>
</li>
<li>
- <p><a href="https://www.privoxy.org/faq/general.html#DONATE" target=
- "_top">https://www.privoxy.org/faq/general.html#DONATE</a></p>
+ <p><a href="https://www.privoxy.org/donate" target="_top">https://www.privoxy.org/donate</a></p>
</li>
</ul>
</div>
"Andreas Oesterhelt"></a></td>
<td><a href="04rodney.jpg"><img src="04rodney_t.jpg" width="80" height="80" border="0" title=
"Rodney Stromlund"></a></td>
- </tr>
- <tr>
<td><a href="05david.jpg"><img src="05david_t.jpg" width="80" height="80" border="0" title=
"David Schmidt"></a></td>
- <td><a href="06member.jpg"><img src="06member_t.jpg" width="80" height="80" border="0" title="N/A"></a></td>
- <td><a href="07member.jpg"><img src="07member_t.jpg" width="80" height="80" border="0" title="N/A"></a></td>
- <td><a href="08member.jpg"><img src="08member_t.jpg" width="80" height="80" border="0" title="N/A"></a></td>
</tr>
</table>
</body>
<head>
<title>Actions Files</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.79">
- <link rel="HOME" title="Privoxy 3.0.29 User Manual" href="index.html">
+ <link rel="HOME" title="Privoxy 3.0.30 User Manual" href="index.html">
<link rel="PREVIOUS" title="The Main Configuration File" href="config.html">
<link rel="NEXT" title="Filter Files" href="filter-file.html">
<link rel="STYLESHEET" type="text/css" href="../p_doc.css">
<div class="NAVHEADER">
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
- <th colspan="3" align="center">Privoxy 3.0.29 User Manual</th>
+ <th colspan="3" align="center">Privoxy 3.0.30 User Manual</th>
</tr>
<tr>
<td width="10%" align="left" valign="bottom"><a href="config.html" accesskey="P">Prev</a></td>
<table border="0" bgcolor="#E0E0E0" width="90%">
<tr>
<td>
- <pre class="SCREEN">+hide-user-agent{Netscape 6.1 (X11; I; Linux 2.4.18 i686)}</pre>
+ <pre class=
+ "SCREEN">+hide-user-agent{Mozilla/5.0 (X11; ElectroBSD i386; rv:78.0) Gecko/20100101 Firefox/78.0}</pre>
</td>
</tr>
</table>
</div>
</div>
<div class="SECT3">
- <h4 class="SECT3"><a name="SESSION-COOKIES-ONLY" id="SESSION-COOKIES-ONLY">8.5.37.
+ <h4 class="SECT3"><a name="SUPPRESS-TAG" id="SUPPRESS-TAG">8.5.37. suppress-tag</a></h4>
+ <div class="VARIABLELIST">
+ <dl>
+ <dt>Typical use:</dt>
+ <dd>
+ <p>Suppress client or server tag.</p>
+ </dd>
+ <dt>Effect:</dt>
+ <dd>
+ <p>Server or client tags to which this action applies are not added to the request, thus making all
+ actions that are specific to these request tags inactive.</p>
+ </dd>
+ <dt>Type:</dt>
+ <dd>
+ <p>Multi-value.</p>
+ </dd>
+ <dt>Parameter:</dt>
+ <dd>
+ <p>The result tag of a server-header or client-header tagger, as defined in one of the <a href=
+ "filter-file.html">filter files</a>.</p>
+ </dd>
+ <dt>Example usage (section):</dt>
+ <dd>
+ <table border="0" bgcolor="#E0E0E0" width="90%">
+ <tr>
+ <td>
+ <pre class=
+ "SCREEN"># Suppress tag produced by range-requests client-header tagger for requests coming from address 10.0.0.1
+{+suppress-tag{RANGE-REQUEST}}
+TAG:^IP-ADDRESS: 10\.0\.0\.1$</pre>
+ </td>
+ </tr>
+ </table>
+ </dd>
+ </dl>
+ </div>
+ </div>
+ <div class="SECT3">
+ <h4 class="SECT3"><a name="SESSION-COOKIES-ONLY" id="SESSION-COOKIES-ONLY">8.5.38.
session-cookies-only</a></h4>
<div class="VARIABLELIST">
<dl>
</div>
</div>
<div class="SECT3">
- <h4 class="SECT3"><a name="SET-IMAGE-BLOCKER" id="SET-IMAGE-BLOCKER">8.5.38. set-image-blocker</a></h4>
+ <h4 class="SECT3"><a name="SET-IMAGE-BLOCKER" id="SET-IMAGE-BLOCKER">8.5.39. set-image-blocker</a></h4>
<div class="VARIABLELIST">
<dl>
<dt>Typical use:</dt>
</div>
</div>
<div class="SECT3">
- <h3 class="SECT3"><a name="SUMMARY" id="SUMMARY">8.5.39. Summary</a></h3>
+ <h3 class="SECT3"><a name="SUMMARY" id="SUMMARY">8.5.40. Summary</a></h3>
<p>Note that many of these actions have the potential to cause a page to misbehave, possibly even not to
display at all. There are many ways a site designer may choose to design his site, and what HTTP header
content, and other criteria, he may depend on. There is no way to have hard and fast rules for all sites. See
<head>
<title>Appendix</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.79">
- <link rel="HOME" title="Privoxy 3.0.29 User Manual" href="index.html">
+ <link rel="HOME" title="Privoxy 3.0.30 User Manual" href="index.html">
<link rel="PREVIOUS" title="See Also" href="seealso.html">
<link rel="STYLESHEET" type="text/css" href="../p_doc.css">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<div class="NAVHEADER">
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
- <th colspan="3" align="center">Privoxy 3.0.29 User Manual</th>
+ <th colspan="3" align="center">Privoxy 3.0.30 User Manual</th>
</tr>
<tr>
<td width="10%" align="left" valign="bottom"><a href="seealso.html" accesskey="P">Prev</a></td>
these. If not, you will get a friendly error message. Internet access is not necessary either.</p>
<ul>
<li>
- <p>Privoxy main page:</p><a name="AEN6380" id="AEN6380"></a>
+ <p>Privoxy main page:</p><a name="AEN6409" id="AEN6409"></a>
<blockquote class="BLOCKQUOTE">
<p><a href="http://config.privoxy.org/" target="_top">http://config.privoxy.org/</a></p>
</blockquote>
"APPLICATION">Privoxy</span>)</p>
</li>
<li>
- <p>View and toggle client tags:</p><a name="AEN6388" id="AEN6388"></a>
+ <p>View and toggle client tags:</p><a name="AEN6417" id="AEN6417"></a>
<blockquote class="BLOCKQUOTE">
<p><a href="http://config.privoxy.org/client-tags" target=
"_top">http://config.privoxy.org/client-tags</a></p>
</li>
<li>
<p>Show information about the current configuration, including viewing and editing of actions
- files:</p><a name="AEN6393" id="AEN6393"></a>
+ files:</p><a name="AEN6422" id="AEN6422"></a>
<blockquote class="BLOCKQUOTE">
<p><a href="http://config.privoxy.org/show-status" target=
"_top">http://config.privoxy.org/show-status</a></p>
</blockquote>
</li>
<li>
- <p>Show the browser's request headers:</p><a name="AEN6398" id="AEN6398"></a>
+ <p>Show the browser's request headers:</p><a name="AEN6427" id="AEN6427"></a>
<blockquote class="BLOCKQUOTE">
<p><a href="http://config.privoxy.org/show-request" target=
"_top">http://config.privoxy.org/show-request</a></p>
</blockquote>
</li>
<li>
- <p>Show which actions apply to a URL and why:</p><a name="AEN6403" id="AEN6403"></a>
+ <p>Show which actions apply to a URL and why:</p><a name="AEN6432" id="AEN6432"></a>
<blockquote class="BLOCKQUOTE">
<p><a href="http://config.privoxy.org/show-url-info" target=
"_top">http://config.privoxy.org/show-url-info</a></p>
<li>
<p>Toggle Privoxy on or off. This feature can be turned off/on in the main <tt class="FILENAME">config</tt>
file. When toggled <span class="QUOTE">"off"</span>, <span class="QUOTE">"Privoxy"</span> continues to run,
- but only as a pass-through proxy, with no actions taking place:</p><a name="AEN6411" id="AEN6411"></a>
+ but only as a pass-through proxy, with no actions taking place:</p><a name="AEN6440" id="AEN6440"></a>
<blockquote class="BLOCKQUOTE">
<p><a href="http://config.privoxy.org/toggle" target="_top">http://config.privoxy.org/toggle</a></p>
</blockquote>
- <p>Short cuts. Turn off, then on:</p><a name="AEN6415" id="AEN6415"></a>
+ <p>Short cuts. Turn off, then on:</p><a name="AEN6444" id="AEN6444"></a>
<blockquote class="BLOCKQUOTE">
<p><a href="http://config.privoxy.org/toggle?set=disable" target=
"_top">http://config.privoxy.org/toggle?set=disable</a></p>
- </blockquote><a name="AEN6418" id="AEN6418"></a>
+ </blockquote><a name="AEN6447" id="AEN6447"></a>
<blockquote class="BLOCKQUOTE">
<p><a href="http://config.privoxy.org/toggle?set=enable" target=
"_top">http://config.privoxy.org/toggle?set=enable</a></p>
<head>
<title>The Main Configuration File</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.79">
- <link rel="HOME" title="Privoxy 3.0.29 User Manual" href="index.html">
+ <link rel="HOME" title="Privoxy 3.0.30 User Manual" href="index.html">
<link rel="PREVIOUS" title="Privoxy Configuration" href="configuration.html">
<link rel="NEXT" title="Actions Files" href="actions-file.html">
<link rel="STYLESHEET" type="text/css" href="../p_doc.css">
<div class="NAVHEADER">
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
- <th colspan="3" align="center">Privoxy 3.0.29 User Manual</th>
+ <th colspan="3" align="center">Privoxy 3.0.30 User Manual</th>
</tr>
<tr>
<td width="10%" align="left" valign="bottom"><a href="configuration.html" accesskey="P">Prev</a></td>
</dd>
<dt>Notes:</dt>
<dd>
- <p>This directive specifies the name of the CA key file in ".pem" format. See the <a href="#CA-CERT-FILE"
- target="_top">ca-cert-file</a> for a command to generate it.</p>
+ <p>This directive specifies the name of the CA key file in ".pem" format. The <a href="#CA-CERT-FILE"
+ target="_top">ca-cert-file section</a> contains a command to generate it.</p>
</dd>
<dt>Example:</dt>
<dd>
<head>
<title>Privoxy Configuration</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.79">
- <link rel="HOME" title="Privoxy 3.0.29 User Manual" href="index.html">
+ <link rel="HOME" title="Privoxy 3.0.30 User Manual" href="index.html">
<link rel="PREVIOUS" title="Starting Privoxy" href="startup.html">
<link rel="NEXT" title="The Main Configuration File" href="config.html">
<link rel="STYLESHEET" type="text/css" href="../p_doc.css">
<div class="NAVHEADER">
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
- <th colspan="3" align="center">Privoxy 3.0.29 User Manual</th>
+ <th colspan="3" align="center">Privoxy 3.0.30 User Manual</th>
</tr>
<tr>
<td width="10%" align="left" valign="bottom"><a href="startup.html" accesskey="P">Prev</a></td>
<tr>
<td>
<pre class="SCREEN"> </pre>
- <h2 class="BRIDGEHEAD"><a name="AEN952"></a> Privoxy Menu</h2>
+ <h2 class="BRIDGEHEAD"><a name="AEN955"></a> Privoxy Menu</h2>
<pre><br></pre>
<table border="0">
<tbody>
</tr>
<tr>
<td> ▪ <a href=
- "https://www.privoxy.org/3.0.29/user-manual/" target="_top">Documentation</a></td>
+ "https://www.privoxy.org/3.0.30/user-manual/" target="_top">Documentation</a></td>
</tr>
</tbody>
</table>
<h2 class="SECT2"><a name="CONFOVERVIEW">6.2. Configuration Files Overview</a></h2>
<p>For Unix, *BSD and GNU/Linux, all configuration files are located in <tt class="FILENAME">/etc/privoxy/</tt>
by default. For MS Windows these are all in the same directory as the <span class="APPLICATION">Privoxy</span>
- executable.</p>
+ executable. The name and number of configuration files has changed from previous versions, and is subject to
+ change as development progresses.</p>
<p>The installed defaults provide a reasonable starting point, though some settings may be aggressive by some
standards. For the time being, the principle configuration files are:</p>
<ul>
listening address of <span class="APPLICATION">Privoxy</span>, these <span class="QUOTE">"wake up"</span>
requests must obviously be sent to the <span class="emphasis"><i class="EMPHASIS">old</i></span> listening
address.</p>
+ <p>While under development, the configuration content is subject to change. The below documentation may not be
+ accurate by the time you read this. Also, what constitutes a <span class="QUOTE">"default"</span> setting, may
+ change, so please check all your configuration files on important issues.</p>
</div>
</div>
<div class="NAVFOOTER">
<head>
<title>Contacting the Developers, Bug Reporting and Feature Requests</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.79">
- <link rel="HOME" title="Privoxy 3.0.29 User Manual" href="index.html">
+ <link rel="HOME" title="Privoxy 3.0.30 User Manual" href="index.html">
<link rel="PREVIOUS" title="Privoxy's Template Files" href="templates.html">
<link rel="NEXT" title="Privoxy Copyright, License and History" href="copyright.html">
<link rel="STYLESHEET" type="text/css" href="../p_doc.css">
<div class="NAVHEADER">
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
- <th colspan="3" align="center">Privoxy 3.0.29 User Manual</th>
+ <th colspan="3" align="center">Privoxy 3.0.30 User Manual</th>
</tr>
<tr>
<td width="10%" align="left" valign="bottom"><a href="templates.html" accesskey="P">Prev</a></td>
<head>
<title>Privoxy Copyright, License and History</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.79">
- <link rel="HOME" title="Privoxy 3.0.29 User Manual" href="index.html">
+ <link rel="HOME" title="Privoxy 3.0.30 User Manual" href="index.html">
<link rel="PREVIOUS" title="Contacting the Developers, Bug Reporting and Feature Requests" href="contact.html">
<link rel="NEXT" title="See Also" href="seealso.html">
<link rel="STYLESHEET" type="text/css" href="../p_doc.css">
<div class="NAVHEADER">
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
- <th colspan="3" align="center">Privoxy 3.0.29 User Manual</th>
+ <th colspan="3" align="center">Privoxy 3.0.30 User Manual</th>
</tr>
<tr>
<td width="10%" align="left" valign="bottom"><a href="contact.html" accesskey="P">Prev</a></td>
<head>
<title>Filter Files</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.79">
- <link rel="HOME" title="Privoxy 3.0.29 User Manual" href="index.html">
+ <link rel="HOME" title="Privoxy 3.0.30 User Manual" href="index.html">
<link rel="PREVIOUS" title="Actions Files" href="actions-file.html">
<link rel="NEXT" title="Privoxy's Template Files" href="templates.html">
<link rel="STYLESHEET" type="text/css" href="../p_doc.css">
<div class="NAVHEADER">
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
- <th colspan="3" align="center">Privoxy 3.0.29 User Manual</th>
+ <th colspan="3" align="center">Privoxy 3.0.30 User Manual</th>
</tr>
<tr>
<td width="10%" align="left" valign="bottom"><a href="actions-file.html" accesskey="P">Prev</a></td>
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
- <title>Privoxy 3.0.29 User Manual</title>
+ <title>Privoxy 3.0.30 User Manual</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.79">
<link rel="NEXT" title="Introduction" href="introduction.html">
<link rel="STYLESHEET" type="text/css" href="../p_doc.css">
<body class="ARTICLE" bgcolor="#EEEEEE" text="#000000" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="ARTICLE">
<div class="TITLEPAGE">
- <h1 class="TITLE"><a name="AEN2" id="AEN2">Privoxy 3.0.29 User Manual</a></h1>
+ <h1 class="TITLE"><a name="AEN2" id="AEN2">Privoxy 3.0.30 User Manual</a></h1>
<p class="PUBDATE"><sub><a href="copyright.html">Copyright</a> © 2001-2020 by <a href=
"https://www.privoxy.org/" target="_top">Privoxy Developers</a></sub><br></p>
<div>
<p>Helping hands and donations are welcome:</p>
<ul>
<li>
- <p><a href="https://www.privoxy.org/faq/general.html#PARTICIPATE" target=
- "_top">https://www.privoxy.org/faq/general.html#PARTICIPATE</a></p>
+ <p><a href="https://www.privoxy.org/participate" target=
+ "_top">https://www.privoxy.org/participate</a></p>
</li>
<li>
- <p><a href="https://www.privoxy.org/faq/general.html#DONATE" target=
- "_top">https://www.privoxy.org/faq/general.html#DONATE</a></p>
+ <p><a href="https://www.privoxy.org/donate" target="_top">https://www.privoxy.org/donate</a></p>
</li>
</ul>
<p>You can find the latest version of the <i class="CITETITLE">Privoxy User Manual</i> at <a href=
<dt>8.5.34. <a href="actions-file.html#REDIRECT">redirect</a></dt>
<dt>8.5.35. <a href="actions-file.html#SERVER-HEADER-FILTER">server-header-filter</a></dt>
<dt>8.5.36. <a href="actions-file.html#SERVER-HEADER-TAGGER">server-header-tagger</a></dt>
- <dt>8.5.37. <a href="actions-file.html#SESSION-COOKIES-ONLY">session-cookies-only</a></dt>
- <dt>8.5.38. <a href="actions-file.html#SET-IMAGE-BLOCKER">set-image-blocker</a></dt>
- <dt>8.5.39. <a href="actions-file.html#SUMMARY">Summary</a></dt>
+ <dt>8.5.37. <a href="actions-file.html#SUPPRESS-TAG">suppress-tag</a></dt>
+ <dt>8.5.38. <a href="actions-file.html#SESSION-COOKIES-ONLY">session-cookies-only</a></dt>
+ <dt>8.5.39. <a href="actions-file.html#SET-IMAGE-BLOCKER">set-image-blocker</a></dt>
+ <dt>8.5.40. <a href="actions-file.html#SUMMARY">Summary</a></dt>
</dl>
</dd>
<dt>8.6. <a href="actions-file.html#ALIASES">Aliases</a></dt>
<head>
<title>Installation</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.79">
- <link rel="HOME" title="Privoxy 3.0.29 User Manual" href="index.html">
+ <link rel="HOME" title="Privoxy 3.0.30 User Manual" href="index.html">
<link rel="PREVIOUS" title="Introduction" href="introduction.html">
<link rel="NEXT" title="What's New in this Release" href="whatsnew.html">
<link rel="STYLESHEET" type="text/css" href="../p_doc.css">
<div class="NAVHEADER">
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
- <th colspan="3" align="center">Privoxy 3.0.29 User Manual</th>
+ <th colspan="3" align="center">Privoxy 3.0.30 User Manual</th>
</tr>
<tr>
<td width="10%" align="left" valign="bottom"><a href="introduction.html" accesskey="P">Prev</a></td>
<table border="0" bgcolor="#E0E0E0" width="100%">
<tr>
<td>
- <pre class="SCREEN"> tar xzvf privoxy-3.0.29-stable-src.tar.gz
- cd privoxy-3.0.29-stable</pre>
+ <pre class="SCREEN"> tar xzvf privoxy-3.0.30-beta-src.tar.gz
+ cd privoxy-3.0.30-beta</pre>
</td>
</tr>
</table>
<head>
<title>Introduction</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.79">
- <link rel="HOME" title="Privoxy 3.0.29 User Manual" href="index.html">
- <link rel="PREVIOUS" title="Privoxy 3.0.29 User Manual" href="index.html">
+ <link rel="HOME" title="Privoxy 3.0.30 User Manual" href="index.html">
+ <link rel="PREVIOUS" title="Privoxy 3.0.30 User Manual" href="index.html">
<link rel="NEXT" title="Installation" href="installation.html">
<link rel="STYLESHEET" type="text/css" href="../p_doc.css">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<div class="NAVHEADER">
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
- <th colspan="3" align="center">Privoxy 3.0.29 User Manual</th>
+ <th colspan="3" align="center">Privoxy 3.0.30 User Manual</th>
</tr>
<tr>
<td width="10%" align="left" valign="bottom"><a href="index.html" accesskey="P">Prev</a></td>
</div>
<div class="SECT1">
<h1 class="SECT1"><a name="INTRODUCTION" id="INTRODUCTION">1. Introduction</a></h1>
- <p>This documentation is included with the current stable version of <span class="APPLICATION">Privoxy</span>,
- 3.0.29.</p>
+ <p>This documentation is included with the current UNRELEASED version of <span class="APPLICATION">Privoxy</span>,
+ 3.0.30, and is mostly complete at this point. The most up to date reference for the time being is still the
+ comments in the source files and in the individual configuration files. Development of a new version is currently
+ nearing completion, and includes significant changes and enhancements over earlier versions.</p>
+ <p>Since this is a UNRELEASED version, not all new features are well tested. This documentation may be slightly out
+ of sync as a result (especially with <a href="https://www.privoxy.org/gitweb/?p=privoxy.git;a=summary" target=
+ "_top">git sources</a>). And there <span class="emphasis"><i class="EMPHASIS">may be</i></span> bugs, though
+ hopefully not many!</p>
<div class="SECT2">
<h2 class="SECT2"><a name="FEATURES" id="FEATURES">1.1. Features</a></h2>
<p>In addition to the core features of ad blocking and <a href="https://en.wikipedia.org/wiki/Browser_cookie"
target="_top">cookie</a> management, <span class="APPLICATION">Privoxy</span> provides many supplemental
- features, that give the end-user more control, more privacy and more freedom:</p>
+ features, some of them currently under development, that give the end-user more control, more privacy and more
+ freedom:</p>
<ul>
<li>
<p>Supports "Connection: keep-alive". Outgoing connections can be kept alive independently from the
<td width="33%" align="right" valign="top"><a href="installation.html" accesskey="N">Next</a></td>
</tr>
<tr>
- <td width="33%" align="left" valign="top">Privoxy 3.0.29 User Manual</td>
+ <td width="33%" align="left" valign="top">Privoxy 3.0.30 User Manual</td>
<td width="34%" align="center" valign="top"> </td>
<td width="33%" align="right" valign="top">Installation</td>
</tr>
<head>
<title>Quickstart to Using Privoxy</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.79">
- <link rel="HOME" title="Privoxy 3.0.29 User Manual" href="index.html">
+ <link rel="HOME" title="Privoxy 3.0.30 User Manual" href="index.html">
<link rel="PREVIOUS" title="What's New in this Release" href="whatsnew.html">
<link rel="NEXT" title="Starting Privoxy" href="startup.html">
<link rel="STYLESHEET" type="text/css" href="../p_doc.css">
<div class="NAVHEADER">
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
- <th colspan="3" align="center">Privoxy 3.0.29 User Manual</th>
+ <th colspan="3" align="center">Privoxy 3.0.30 User Manual</th>
</tr>
<tr>
<td width="10%" align="left" valign="bottom"><a href="whatsnew.html" accesskey="P">Prev</a></td>
<p>Find <tt class="FILENAME">user.action</tt> in the top section, and click on <span class=
"QUOTE">"<span class="GUIBUTTON">Edit</span>"</span>:</p>
<div class="FIGURE">
- <a name="AEN719" id="AEN719"></a>
+ <a name="AEN722" id="AEN722"></a>
<p><b>Figure 1. Actions Files in Use</b></p>
<div class="MEDIAOBJECT">
<p><img src="files-in-use.jpg"></p>
<head>
<title>See Also</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.79">
- <link rel="HOME" title="Privoxy 3.0.29 User Manual" href="index.html">
+ <link rel="HOME" title="Privoxy 3.0.30 User Manual" href="index.html">
<link rel="PREVIOUS" title="Privoxy Copyright, License and History" href="copyright.html">
<link rel="NEXT" title="Appendix" href="appendix.html">
<link rel="STYLESHEET" type="text/css" href="../p_doc.css">
<div class="NAVHEADER">
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
- <th colspan="3" align="center">Privoxy 3.0.29 User Manual</th>
+ <th colspan="3" align="center">Privoxy 3.0.30 User Manual</th>
</tr>
<tr>
<td width="10%" align="left" valign="bottom"><a href="copyright.html" accesskey="P">Prev</a></td>
<head>
<title>Starting Privoxy</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.79">
- <link rel="HOME" title="Privoxy 3.0.29 User Manual" href="index.html">
+ <link rel="HOME" title="Privoxy 3.0.30 User Manual" href="index.html">
<link rel="PREVIOUS" title="Quickstart to Using Privoxy" href="quickstart.html">
<link rel="NEXT" title="Privoxy Configuration" href="configuration.html">
<link rel="STYLESHEET" type="text/css" href="../p_doc.css">
<div class="NAVHEADER">
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
- <th colspan="3" align="center">Privoxy 3.0.29 User Manual</th>
+ <th colspan="3" align="center">Privoxy 3.0.30 User Manual</th>
</tr>
<tr>
<td width="10%" align="left" valign="bottom"><a href="quickstart.html" accesskey="P">Prev</a></td>
<p>Please note that <span class="APPLICATION">Privoxy</span> can only proxy HTTP and HTTPS traffic. It will not
work with FTP or other protocols.</p>
<div class="FIGURE">
- <a name="AEN773" id="AEN773"></a>
+ <a name="AEN776" id="AEN776"></a>
<p><b>Figure 2. Proxy Configuration Showing Mozilla Firefox HTTP and HTTPS (SSL) Settings</b></p>
<div class="MEDIAOBJECT">
<p><img src="proxy_setup.jpg"></p>
protocols"</span> is <span class="emphasis"><i class="EMPHASIS">UNCHECKED</i></span>. You want only HTTP and HTTPS
(SSL)!</p>
<div class="FIGURE">
- <a name="AEN815" id="AEN815"></a>
+ <a name="AEN818" id="AEN818"></a>
<p><b>Figure 3. Proxy Configuration Showing Internet Explorer HTTP and HTTPS (Secure) Settings</b></p>
<div class="MEDIAOBJECT">
<p><img src="proxy2.jpg"></p>
<head>
<title>Privoxy's Template Files</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.79">
- <link rel="HOME" title="Privoxy 3.0.29 User Manual" href="index.html">
+ <link rel="HOME" title="Privoxy 3.0.30 User Manual" href="index.html">
<link rel="PREVIOUS" title="Filter Files" href="filter-file.html">
<link rel="NEXT" title="Contacting the Developers, Bug Reporting and Feature Requests" href="contact.html">
<link rel="STYLESHEET" type="text/css" href="../p_doc.css">
<div class="NAVHEADER">
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
- <th colspan="3" align="center">Privoxy 3.0.29 User Manual</th>
+ <th colspan="3" align="center">Privoxy 3.0.30 User Manual</th>
</tr>
<tr>
<td width="10%" align="left" valign="bottom"><a href="filter-file.html" accesskey="P">Prev</a></td>
<head>
<title>What's New in this Release</title>
<meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.79">
- <link rel="HOME" title="Privoxy 3.0.29 User Manual" href="index.html">
+ <link rel="HOME" title="Privoxy 3.0.30 User Manual" href="index.html">
<link rel="PREVIOUS" title="Installation" href="installation.html">
<link rel="NEXT" title="Quickstart to Using Privoxy" href="quickstart.html">
<link rel="STYLESHEET" type="text/css" href="../p_doc.css">
<div class="NAVHEADER">
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
- <th colspan="3" align="center">Privoxy 3.0.29 User Manual</th>
+ <th colspan="3" align="center">Privoxy 3.0.30 User Manual</th>
</tr>
<tr>
<td width="10%" align="left" valign="bottom"><a href="installation.html" accesskey="P">Prev</a></td>
char service[6];
int retval;
jb_socket fd;
-#ifdef HAVE_POLL
struct pollfd poll_fd[1];
-#else
- fd_set wfds;
- struct timeval timeout;
-#endif
#if !defined(_WIN32) && !defined(__BEOS__)
int flags;
#endif
continue;
}
-#ifndef HAVE_POLL
-#ifndef _WIN32
- if (fd >= FD_SETSIZE)
- {
- log_error(LOG_LEVEL_ERROR,
- "Server socket number too high to use select(): %d >= %d",
- fd, FD_SETSIZE);
- close_socket(fd);
- freeaddrinfo(result);
- return JB_INVALID_SOCKET;
- }
-#endif
-#endif
-
#ifdef FEATURE_EXTERNAL_FILTERS
mark_socket_for_close_on_execute(fd);
#endif
}
#endif /* !defined(_WIN32) && !defined(__BEOS__) */
-#ifdef HAVE_POLL
poll_fd[0].fd = fd;
poll_fd[0].events = POLLOUT;
}
}
else if (retval > 0)
-#else
- /* wait for connection to complete */
- FD_ZERO(&wfds);
- FD_SET(fd, &wfds);
-
- memset(&timeout, 0, sizeof(timeout));
- timeout.tv_sec = 30;
-
- /* MS Windows uses int, not SOCKET, for the 1st arg of select(). Weird! */
- if ((select((int)fd + 1, NULL, &wfds, NULL, &timeout) > 0)
- && FD_ISSET(fd, &wfds))
-#endif
{
socklen_t optlen = sizeof(socket_error);
if (!getsockopt(fd, SOL_SOCKET, SO_ERROR, &socket_error, &optlen))
struct sockaddr_in inaddr;
jb_socket fd;
unsigned int addr;
-#ifdef HAVE_POLL
struct pollfd poll_fd[1];
-#else
- fd_set wfds;
- struct timeval tv[1];
-#endif
#if !defined(_WIN32) && !defined(__BEOS__)
int flags;
#endif
return(JB_INVALID_SOCKET);
}
-#ifndef HAVE_POLL
-#ifndef _WIN32
- if (fd >= FD_SETSIZE)
- {
- log_error(LOG_LEVEL_ERROR,
- "Server socket number too high to use select(): %d >= %d",
- fd, FD_SETSIZE);
- close_socket(fd);
- return JB_INVALID_SOCKET;
- }
-#endif
-#endif
-
set_no_delay_flag(fd);
#if !defined(_WIN32) && !defined(__BEOS__)
}
#endif /* !defined(_WIN32) && !defined(__BEOS__) */
-#ifdef HAVE_POLL
poll_fd[0].fd = fd;
poll_fd[0].events = POLLOUT;
if (poll(poll_fd, 1, 30000) <= 0)
-#else
- /* wait for connection to complete */
- FD_ZERO(&wfds);
- FD_SET(fd, &wfds);
-
- tv->tv_sec = 30;
- tv->tv_usec = 0;
-
- /* MS Windows uses int, not SOCKET, for the 1st arg of select(). Weird! */
- if (select((int)fd + 1, NULL, &wfds, NULL, tv) <= 0)
-#endif
{
close_socket(fd);
return(JB_INVALID_SOCKET);
{
int n;
char buf[10];
-#ifdef HAVE_POLL
struct pollfd poll_fd[1];
poll_fd[0].fd = fd;
poll_fd[0].events = POLLIN;
n = poll(poll_fd, 1, seconds_to_wait * 1000);
-#else
- fd_set rfds;
- struct timeval timeout;
-
- memset(&timeout, 0, sizeof(timeout));
- timeout.tv_sec = seconds_to_wait;
-
- FD_ZERO(&rfds);
- FD_SET(fd, &rfds);
-
- n = select(fd+1, &rfds, NULL, NULL, &timeout);
-#endif
/*
* XXX: Do we care about the different error conditions?
int retval;
int i;
int max_selected_socket;
-#ifdef HAVE_POLL
struct pollfd poll_fds[MAX_LISTENING_SOCKETS];
nfds_t polled_sockets;
-#else
- fd_set selected_fds;
-#endif
jb_socket fd;
const char *host_addr;
size_t listen_addr_size;
c_length = sizeof(client);
-#ifdef HAVE_POLL
memset(poll_fds, 0, sizeof(poll_fds));
polled_sockets = 0;
-#else
- /*
- * Wait for a connection on any socket.
- * Return immediately if no socket is listening.
- * XXX: Why not treat this as fatal error?
- */
- FD_ZERO(&selected_fds);
-#endif
max_selected_socket = 0;
for (i = 0; i < MAX_LISTENING_SOCKETS; i++)
{
if (JB_INVALID_SOCKET != fds[i])
{
-#ifdef HAVE_POLL
poll_fds[i].fd = fds[i];
poll_fds[i].events = POLLIN;
polled_sockets++;
-#else
- FD_SET(fds[i], &selected_fds);
-#endif
if (max_selected_socket < fds[i] + 1)
{
max_selected_socket = fds[i] + 1;
}
do
{
-#ifdef HAVE_POLL
retval = poll(poll_fds, polled_sockets, -1);
-#else
- retval = select(max_selected_socket, &selected_fds, NULL, NULL, NULL);
-#endif
} while (retval < 0 && errno == EINTR);
if (retval <= 0)
{
if (0 == retval)
{
log_error(LOG_LEVEL_ERROR,
- "Waiting on new client failed because select(2) returned 0."
+ "Waiting on new client failed because poll(2) returned 0."
" This should not happen.");
}
else
{
log_error(LOG_LEVEL_ERROR,
- "Waiting on new client failed because of problems in select(2): "
+ "Waiting on new client failed because of problems in poll(2): "
"%s.", strerror(errno));
}
return 0;
}
-#ifdef HAVE_POLL
for (i = 0; i < MAX_LISTENING_SOCKETS && (poll_fds[i].revents == 0); i++);
-#else
- for (i = 0; i < MAX_LISTENING_SOCKETS && !FD_ISSET(fds[i], &selected_fds);
- i++);
-#endif
if (i >= MAX_LISTENING_SOCKETS)
{
log_error(LOG_LEVEL_ERROR,
- "select(2) reported connected clients (number = %u, "
+ "poll(2) reported connected clients (number = %u, "
"descriptor boundary = %u), but none found.",
retval, max_selected_socket);
return 0;
}
#endif
-#ifndef HAVE_POLL
-#ifndef _WIN32
- if (afd >= FD_SETSIZE)
- {
- log_error(LOG_LEVEL_ERROR,
- "Client socket number too high to use select(): %d >= %d",
- afd, FD_SETSIZE);
- close_socket(afd);
- return 0;
- }
-#endif
-#endif
-
#ifdef FEATURE_EXTERNAL_FILTERS
mark_socket_for_close_on_execute(afd);
#endif
{
char buf[10];
int no_data_waiting;
-#ifdef HAVE_POLL
int poll_result;
struct pollfd poll_fd[1];
return FALSE;
}
no_data_waiting = !(poll_fd[0].revents & POLLIN);
-#else
- fd_set readable_fds;
- struct timeval timeout;
- int ret;
-
- memset(&timeout, '\0', sizeof(timeout));
- FD_ZERO(&readable_fds);
- FD_SET(sfd, &readable_fds);
-
- ret = select((int)sfd+1, &readable_fds, NULL, NULL, &timeout);
- if (ret < 0)
- {
- log_error(LOG_LEVEL_CONNECT, "select() on socket %d failed: %E", sfd);
- return FALSE;
- }
- no_data_waiting = !FD_ISSET(sfd, &readable_fds);
-#endif /* def HAVE_POLL */
return (no_data_waiting || (1 == recv(sfd, buf, 1, MSG_PEEK)));
}
#else
#include <poll.h>
#endif /* def __GLIBC__ */
-#else
-# ifndef FD_ZERO
-# include <select.h>
-# endif
-#warning poll() appears to be unavailable. Your platform will become unsupported in the future.
#endif /* HAVE_POLL */
#endif
char *hdr;
char *p;
int n;
-#ifdef HAVE_POLL
struct pollfd poll_fds[2];
-#else
- fd_set rfds;
- jb_socket maxfd;
- struct timeval timeout;
-#endif
int server_body;
int ms_iis5_hack = 0;
unsigned long long byte_count = 0;
http = csp->http;
-#ifndef HAVE_POLL
- maxfd = (csp->cfd > csp->server_connection.sfd) ?
- csp->cfd : csp->server_connection.sfd;
-#endif
-
/* pass data between the client and server
* until one or the other shuts down the connection.
*/
for (;;)
{
-#ifndef HAVE_POLL
- FD_ZERO(&rfds);
-#ifdef FEATURE_CONNECTION_KEEP_ALIVE
- if (!watch_client_socket)
- {
- maxfd = csp->server_connection.sfd;
- }
- else
-#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
- {
- FD_SET(csp->cfd, &rfds);
- }
-
- FD_SET(csp->server_connection.sfd, &rfds);
-#endif /* ndef HAVE_POLL */
-
#ifdef FEATURE_CONNECTION_KEEP_ALIVE
if ((csp->flags & CSP_FLAG_CHUNKED)
&& !(csp->flags & CSP_FLAG_CONTENT_LENGTH_SET)
}
#endif /* FEATURE_CONNECTION_KEEP_ALIVE */
-#ifdef HAVE_POLL
poll_fds[0].fd = csp->cfd;
#ifdef FEATURE_CONNECTION_KEEP_ALIVE
if (!watch_client_socket)
poll_fds[1].fd = csp->server_connection.sfd;
poll_fds[1].events = POLLIN;
n = poll(poll_fds, 2, csp->config->socket_timeout * 1000);
-#else
- timeout.tv_sec = csp->config->socket_timeout;
- timeout.tv_usec = 0;
- n = select((int)maxfd + 1, &rfds, NULL, NULL, &timeout);
-#endif /* def HAVE_POLL */
/*server or client not responding in timeout */
if (n == 0)
}
else if (n < 0)
{
-#ifdef HAVE_POLL
log_error(LOG_LEVEL_ERROR, "poll() failed!: %E");
-#else
- log_error(LOG_LEVEL_ERROR, "select() failed!: %E");
-#endif
mark_server_socket_tainted(csp);
#ifdef FEATURE_HTTPS_INSPECTION
close_client_and_server_ssl_connections(csp);
* XXX: Make sure the client doesn't use pipelining
* behind Privoxy's back.
*/
-#ifdef HAVE_POLL
if ((poll_fds[0].revents & (POLLERR|POLLHUP|POLLNVAL)) != 0)
{
log_error(LOG_LEVEL_CONNECT,
}
if (poll_fds[0].revents != 0)
-#else
- if (FD_ISSET(csp->cfd, &rfds))
-#endif /* def HAVE_POLL*/
{
int max_bytes_to_read = (int)csp->receive_buffer_size;
{
/*
* If the next request is already waiting, we have
- * to stop select()ing the client socket. Otherwise
+ * to stop poll()ing the client socket. Otherwise
* we would always return right away and get nothing
* else done.
*/
* If `hdr' is null, then it's the header otherwise it's the body.
* FIXME: Does `hdr' really mean `host'? No.
*/
-#ifdef HAVE_POLL
if (poll_fds[1].revents != 0)
-#else
- if (FD_ISSET(csp->server_connection.sfd, &rfds))
-#endif /* HAVE_POLL */
{
#ifdef FEATURE_CONNECTION_KEEP_ALIVE
/*
use_ssl_tunnel = 1;
}
- if (http->ssl && csp->action->flags & ACTION_IGNORE_CERTIFICATE_ERRORS)
+ if (http->ssl && (csp->action->flags & ACTION_IGNORE_CERTIFICATE_ERRORS))
{
csp->dont_verify_certificate = 1;
}
return JB_INVALID_SOCKET;
}
-#ifndef HAVE_POLL
-#ifndef _WIN32
- if (bfd >= FD_SETSIZE)
- {
- log_error(LOG_LEVEL_FATAL,
- "Bind socket number too high to use select(): %d >= %d",
- bfd, FD_SETSIZE);
- }
-#endif
-#endif
-
if (haddr == NULL)
{
log_error(LOG_LEVEL_INFO, "Listening on port %d on all IP addresses",
{
int max_client_connections = parse_numeric_value(cmd, arg);
-#if !defined(_WIN32) && !defined(HAVE_POLL)
- /*
- * Reject values below 1 for obvious reasons and values above
- * FD_SETSIZE/2 because Privoxy needs two sockets to serve
- * client connections that need forwarding.
- *
- * We ignore the fact that the first three file descriptors
- * are usually set to /dev/null, one is used for logging
- * and yet another file descriptor is required to load
- * config files.
- */
- if ((max_client_connections < 1) || (FD_SETSIZE/2 < max_client_connections))
- {
- log_error(LOG_LEVEL_FATAL, "max-client-connections value %d"
- " is invalid. Value needs to be above 1 and below %d"
- " (FD_SETSIZE/2).", max_client_connections, FD_SETSIZE/2);
- }
-#else
- /*
- * The Windows libc uses FD_SETSIZE for an array used
- * by select(), but has no problems with file descriptors
- * above the limit as long as no more than FD_SETSIZE are
- * passed to select().
- * https://msdn.microsoft.com/en-us/library/windows/desktop/ms739169%28v=vs.85%29.aspx
- *
- * On platforms were we use poll() we don't have to enforce
- * an upper connection limit either.
- */
if (max_client_connections < 1)
{
log_error(LOG_LEVEL_FATAL, "max-client-connections value"
" has to be a number above 1. %d is invalid.",
max_client_connections);
}
-#endif
+
config->max_client_connections = max_client_connections;
break;
}
continue;
}
+ if (list_contains_item(csp->action->multi[ACTION_MULTI_SUPPRESS_TAG], tag))
+ {
+ log_error(LOG_LEVEL_HEADER,
+ "Tagger \'%s\' didn't add tag \'%s\': suppressed",
+ b->name, tag);
+ freez(tag);
+ continue;
+ }
+
if (!list_contains_item(csp->tags, tag))
{
if (JB_ERR_OK != enlist(csp->tags, tag))
#define ACTION_MULTI_SERVER_HEADER_TAGGER 5
/** Number of multi-string actions. */
#define ACTION_MULTI_EXTERNAL_FILTER 6
+/** Index into current_action_spec::multi[] for tags to suppress. */
+#define ACTION_MULTI_SUPPRESS_TAG 7
/** Number of multi-string actions. */
-#define ACTION_MULTI_COUNT 7
+#define ACTION_MULTI_COUNT 8
/**
#ifdef FEATURE_EXTERNAL_FILTERS
FT_EXTERNAL_CONTENT_FILTER = 5,
#endif
+ FT_SUPPRESS_TAG = 6,
FT_INVALID_FILTER = 42,
};
#ifdef FEATURE_EXTERNAL_FILTERS
-#define MAX_FILTER_TYPES 6
+#define MAX_FILTER_TYPES 7
#else
-#define MAX_FILTER_TYPES 5
+#define MAX_FILTER_TYPES 6
#endif
/**
* The prefix for CGI pages. Written out in generated HTML.
* INCLUDES the trailing slash.
*/
+#ifdef FEATURE_HTTPS_INSPECTION
+#define CGI_PREFIX "//" CGI_SITE_2_HOST CGI_SITE_2_PATH "/"
+#define CGI_PREFIX_HTTPS "https:" CGI_PREFIX
+#else
#define CGI_PREFIX "http://" CGI_SITE_2_HOST CGI_SITE_2_PATH "/"
-#define CGI_PREFIX_HTTPS "https://" CGI_SITE_2_HOST CGI_SITE_2_PATH "/"
+#endif
+#define CGI_PREFIX_HTTP "http://" CGI_SITE_2_HOST CGI_SITE_2_PATH "/"
#endif /* ndef PROJECT_H_INCLUDED */
#############################################################################
#
# This is a configuration file for Privoxy-Regression-Test
-# (included in the source tarball's tools directory).
+# (included in the source tarball's tools directory and available at
+# https://www.privoxy.org/gitweb/?p=privoxy.git;a=blob;f=tools/privoxy-regression-test.pl;hb=HEAD).
#
-# After referencing it in your Privoxy configuration both Privoxy and
+# After referencing this file in your Privoxy configuration both Privoxy and
# Privoxy-Regression-Test should be good to go.
#
#############################################################################
#############################################################################
{{settings}}
-for-privoxy-version=3.0.27
+for-privoxy-version=3.0.29
# Some dependencies Privoxy-Regression-Test should know about:
#
# Level 23 needs = config line enable-proxy-authentication-forwarding\s+1
# Level 24 needs = feature status FEATURE_CLIENT_TAGS Yes
# Level 25 needs = feature status FEATURE_HTTPS_INSPECTION No
+# Level 26 needs = feature status FEATURE_PCRE_HOST_PATTERNS Yes
#######################################################
# Enable taggers to activate the tests on demand
TAG:^connection-sharing disabled$
{}
+# XXX: This test is expected to fail when using "https://p.p/"
+# as CGI prefix with https inspection enabled but can't
+# yet be automatically skipped. By design connections aren't
+# shared when using "https://" so Privoxy does not remove the
+# header.
# Set Header = Connection: close
# Expect Header = REMOVAL
# Level = 16
TAG:^No Host header$
{}
+# XXX: This test is expected to fail when using "https://p.p/"
+# as CGI prefix with https inspection enabled but can't
+# yet be automatically skipped. The reason for the test
+# failure is that Privoxy-Regression-Test only modifies
+# the Host header for the CONNECT request, not for the
+# actual request that follows. Changing that would not
+# fix the test though as a modified Host header in the
+# actual request would result in Privoxy attempting to
+# connect to it.
# Set Header = Host: whatever.example.org
# Expect Header = NO CHANGE
TAG:^Host header other than the target host$
{+delay-response{1}}
# Fetch Test = http://config.privoxy.org/show-url-info?url=http%3A%2F%2Fwww.example.com%2Fprivoxy-test-delay-response
config.privoxy.org/show-url-info\?url=http%3A%2F%2Fwww\.example\.com%2Fprivoxy-test-delay-response
+
+{+block{Block with pcre host pattern}}
+# Blocked URL = http://aaa.example.org/
+# Level = 26
+PCRE-HOST-PATTERN:^a{3}\.example\.org$
+# Blocked URL = http://bbb.example.org/
+# Level = 26
+PCRE-HOST-PATTERN:^(bbb|ccc|ddd)\.example\.org$
href="@user-manual@contact.html">get support or report problems</a>. \
<p> \
If you want to support the Privoxy Team, you can \
- <a href="https://www.privoxy.org/faq/general.html#PARTICIPATE">participate</a> \
- or <a href="https://www.privoxy.org/faq/general.html#DONATE">donate</a>. \
+ <a href="https://www.privoxy.org/participate">participate</a> \
+ or <a href="https://www.privoxy.org/donate">donate</a>. \
</p> \
</td> \
</tr> \
you can enable or disable the taggers individually below.</td>
</tr>
@server-header-tagger-params@
+@suppress-tag-params@
+ <tr class="bg1" align="left" valign="top">
+ <td class="en1" align="center" valign="middle"><input type="radio"
+ name="new_string_filter_r0" value="Y"
+ ></td>
+ <td class="dis1" align="center" valign="middle"><input type="radio"
+ name="new_string_filter_r0" value="N"
+ ></td>
+ <td class="noc1" align="center" valign="middle"><input type="radio"
+ name="new_string_filter_r0" value="X" checked
+ ></td>
+ <td class="action"><a href="@user-manual@@actions-help-prefix@SUPPRESS-TAG">suppress-tag</a></td>
+ <td>Suppress tag.</td>
+ </tr>
+ <tr class="bg1" align="left" valign="top" id="suppress-tag_opts">
+ <td class="en1"> </td>
+ <td class="dis1"> </td>
+ <td class="noc1"> </td>
+ <td> </td>
+ <td>Tag to suppress:<br>
+ <input type="hidden" name="new_string_filter_t0" value="U">
+ <input type="text" name="new_string_filter_n0" size="40" value="">
+ </td>
+ </tr>
<tr class="bg1" align="left" valign="top">
<td class="en1" align="center" valign="middle"><input type="radio"
name="session_cookies_only" value="Y" @session-cookies-only-y@
--- /dev/null
+##############################################################################
+#
+# File : $Source: /cvsroot/ijbswa/current/templates/edit-actions-for-url-filter,v $
+#
+# Purpose : Template that is included from most of Privoxy's CGI pages
+# to show the user how to get help or report problems.
+#
+#
+# Copyright : Written by and Copyright (C) 2002-2007 members of
+# members of the Privoxy team. https://www.privoxy.org/
+#
+# This template is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General
+# Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at
+# your option) any later version.
+#
+##############################################################################
+
+<tr class="bg1" align="left" valign="top">
+ <td class="en1" align="center" valign="middle"><input type="radio" name="string_filter_r@index@" value="Y" @this-filter-y@></td>
+ <td class="dis1" align="center" valign="middle"><input type="radio" name="string_filter_r@index@" value="N" @this-filter-n@></td>
+ <td class="noc1" align="center" valign="middle"><input type="radio" name="string_filter_r@index@" value="X"></td>
+ <td class="action">
+ <input type="hidden" name="string_filter_t@index@" value="@abbr-filter-type@">
+ <input type="hidden" name="string_filter_c@index@" value="@code@">
+ <input type="hidden" name="string_filter_o@index@" value="@name@">
+ <a href="@user-manual@@actions-help-prefix@@anchor@">@filter-type@</a> @name@
+ </td>
+ <td>Suppress tag</td>
+</tr>
+<tr class="bg1" align="left" valign="top" id="string_filter@index@_opts">
+ <td class="en1"> </td>
+ <td class="dis1"> </td>
+ <td class="noc1"> </td>
+ <td> </td>
+ <td>Tag to suppress:<br>
+ <input type="text" name="string_filter_n@index@" size="40" value="@name@">
+ </td>
+</tr>
href="@user-manual@contact.html">get support or report problems</a>.
<p>
If you want to support the Privoxy Team, you can
- <a href="https://www.privoxy.org/faq/general.html#PARTICIPATE">participate</a>
- or <a href="https://www.privoxy.org/faq/general.html#DONATE">donate</a>.
+ <a href="https://www.privoxy.org/participate">participate</a>
+ or <a href="https://www.privoxy.org/donate">donate</a>.
</p>
use Getopt::Long;
use constant {
- PRT_VERSION => 'Privoxy-Regression-Test 0.7.1',
+ PRT_VERSION => 'Privoxy-Regression-Test 0.7.2',
CURL => 'curl',
CLI_LOOPS => 1,
CLI_MAX_TIME => 5,
CLI_MIN_LEVEL => 0,
- # XXX: why limit at all?
+ # The reason for a maximum test level is explained in the
+ # perldoc section TEST LEVELS near the end of this file.
CLI_MAX_LEVEL => 100,
CLI_FORKS => 0,
CLI_SLEEP_TIME => 0,
sub check_for_forbidden_characters($) {
my $string = shift;
- my $allowed = '[-=\dA-Za-z~{}\[\]:./();\t ,+@"_%?&*^]';
+ my $allowed = '[-=\dA-Za-z~{}\[\]:./();\t ,+@"_%?&*^|]';
unless ($string =~ m/^$allowed*$/o) {
my $forbidden = $string;
sub execute_method_test($) {
my $test = shift;
+ our $privoxy_cgi_url;
+
my $buffer_ref;
my $status_code;
my $method = $test->{'data'};
# Don't complain about the 'missing' body
$curl_parameters .= '--head ' if ($method =~ /^HEAD$/i);
- $curl_parameters .= PRIVOXY_CGI_URL;
+ $curl_parameters .= $privoxy_cgi_url;
$buffer_ref = get_page_with_curl($curl_parameters);
$status_code = get_status_code($buffer_ref);
sub execute_dumb_fetch_test($) {
my $test = shift;
+ our $privoxy_cgi_url;
+
my $buffer_ref;
my $status_code;
$curl_parameters .= '--request ' . quote($test->{method}) . ' ';
}
if ($test->{type} == TRUSTED_CGI_REQUEST) {
- $curl_parameters .= '--referer ' . quote(PRIVOXY_CGI_URL) . ' ';
+ $curl_parameters .= '--referer ' . quote($privoxy_cgi_url) . ' ';
}
$curl_parameters .= quote($test->{'data'});
sub get_final_results($) {
my $url = shift;
+ our $privoxy_cgi_url;
+
my $curl_parameters = '';
my %final_results = ();
my $final_results_reached = 0;
$url =~ s@:@%3A@g;
$url =~ s@/@%2F@g;
- $curl_parameters .= quote(PRIVOXY_CGI_URL . 'show-url-info?url=' . $url);
+ $curl_parameters .= quote($privoxy_cgi_url . 'show-url-info?url=' . $url);
foreach (@{get_cgi_page_or_else($curl_parameters)}) {
sub get_status_code($) {
my $buffer_ref = shift;
+ our $privoxy_cgi_url;
+
+ my $skip_connection_established_response = $privoxy_cgi_url =~ m@^https://@;
my @buffer = @{$buffer_ref};
foreach (@buffer) {
+ if ($skip_connection_established_response) {
+
+ next if (m@^HTTP/1\.1 200 Connection established@);
+ next if (m@^\r\n$@);
+ $skip_connection_established_response = 0;
+ }
+
if (/^HTTP\/\d\.\d (\d{3})/) {
return $1;
if (200 != $status_code) {
- my $log_message = "Failed to fetch Privoxy CGI Page. " .
+ my $log_message = "Failed to fetch Privoxy CGI page '$cgi_url'. " .
"Received status code ". $status_code .
" while only 200 is acceptable.";
# Enable the action to test
$curl_parameters .= '-H \'X-Privoxy-Control: ' . $test->{'tag'} . '\' ';
- # The header to filter
- $curl_parameters .= '-H \'' . $header . '\' ';
+
+ # Add the header to filter
+ if ($privoxy_cgi_url =~ m@^https://@ and $header =~ m@^Host:@) {
+ $curl_parameters .= '--proxy-header \'' . $header . '\' ';
+ } else {
+ $curl_parameters .= '-H \'' . $header . '\' ';
+ }
$curl_parameters .= ' ';
$curl_parameters .= $privoxy_cgi_url;
sub help() {
our %cli_options;
+ our $privoxy_cgi_url;
print_version();
[--max-time $cli_options{'max-time'}]
[--min-level $cli_options{'min-level'}]
[--privoxy-address]
+ [--privoxy-cgi-prefix $privoxy_cgi_url]
[--retries $cli_options{'retries'}]
[--show-skipped-tests]
[--shuffle-tests]
our %cli_options;
our $log_level;
+ our $privoxy_cgi_url;
init_cli_options();
'max-time=i' => \$cli_options{'max-time'},
'min-level=i' => \$cli_options{'min-level'},
'privoxy-address=s' => \$cli_options{'privoxy-address'},
+ 'privoxy-cgi-prefix=s' => \$privoxy_cgi_url, # XXX: Should use cli_options()
'retries=i' => \$cli_options{'retries'},
'shuffle-tests' => \$cli_options{'shuffle-tests'},
'show-skipped-tests' => \$cli_options{'show-skipped-tests'},
[B<--fuzzer-feeding>] [B<--fuzzer-feeding>] [B<--help>] [B<--level level>]
[B<--local-test-file testfile>] [B<--loops count>] [B<--max-level max-level>]
[B<--max-time max-time>] [B<--min-level min-level>] B<--privoxy-address proxy-address>
-[B<--retries retries>] [B<--test-number test-number>]
+B<--privoxy-cgi-prefix cgi-prefix> [B<--retries retries>] [B<--test-number test-number>]
[B<--show-skipped-tests>] [B<--sleep-time> seconds] [B<--verbose>]
[B<--version>]
will be used. B<proxy-address> has to be specified in http_proxy
syntax.
+B<--privoxy-cgi-prefix privoxy-cgi-prefix> The prefix to use when
+building URLs that are supposed to reach Privoxy's CGI interface.
+If it's not set, B<http://p.p/> is used, which is supposed to work
+with the default Privoxy configuration.
+If Privoxy has been built with B<FEATURE_HTTPS_INSPECTION> enabled,
+and if https inspection is activated with the B<+https-inspection>
+action, this option can be used with
+B<https://p.p/> provided the system running Privoxy-Regression-Test
+has been configured to trust the certificate used by Privoxy.
+Note that there are currently two tests in the official
+B<regression-tests.action> file that are expected to fail when
+using a B<privoxy-cgi-prefix> with B<https://> and aren't automatically
+skipped.
+
B<--retries retries> Retry B<retries> times.
B<--test-number test-number> Only run the test with the specified
static jb_err compile_url_pattern(struct pattern_spec *url, char *buf)
{
char *p;
+ const size_t prefix_length = 18;
#ifdef FEATURE_PCRE_HOST_PATTERNS
- const size_t prefix_length = 18;
if (strncmpic(buf, "PCRE-HOST-PATTERN:", prefix_length) == 0)
{
url->pattern.url_spec.host_regex_type = PCRE_HOST_PATTERN;
{
url->pattern.url_spec.host_regex_type = VANILLA_HOST_PATTERN;
}
+#else
+ if (strncmpic(buf, "PCRE-HOST-PATTERN:", prefix_length) == 0)
+ {
+ log_error(LOG_LEVEL_ERROR,
+ "PCRE-HOST-PATTERN detected while Privoxy has been compiled "
+ "without FEATURE_PCRE_HOST_PATTERNS: %s",
+ buf);
+ /* Overwrite the "PCRE-HOST-PATTERN:" prefix */
+ memmove(buf, buf+prefix_length, strlen(buf+prefix_length)+1);
+ /*
+ * The pattern will probably not work as expected.
+ * We don't simply return JB_ERR_PARSE here so the
+ * regression tests can be loaded with and without
+ * FEATURE_PCRE_HOST_PATTERNS.
+ */
+ }
#endif
p = strchr(buf, '/');