<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
<!entity % dummy "IGNORE"> 
<!entity supported SYSTEM "supported.sgml">
<!entity newfeatures SYSTEM "newfeatures.sgml">
<!entity p-intro SYSTEM "privoxy.sgml">
<!entity seealso SYSTEM "seealso.sgml">
<!entity buildsource SYSTEM "buildsource.sgml">
<!entity contacting SYSTEM "contacting.sgml">
<!entity history SYSTEM "history.sgml">
<!entity copyright SYSTEM "copyright.sgml">
<!entity license SYSTEM "license.sgml">
<!entity p-authors SYSTEM "p-authors.sgml">
<!entity config SYSTEM "p-config.sgml">
<!entity p-version SYSTEM "doc_version.tmp">
<!entity p-status SYSTEM "doc_status.tmp">
<!entity % p-authors-formal "INCLUDE"> <!-- include additional text, etc  -->
<!entity % p-not-stable "IGNORE">
<!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">
<!entity % user-man "IGNORE">
<!entity % config-file "IGNORE">
<!entity % p-supp-userman "IGNORE"> <!-- Omit some from supported.sgml    -->
<!entity  my-copy "&copy;">         <!-- kludge for docbook2man           -->
<!entity % draft "IGNORE">          <!-- WIP stuff    -->
]>
<!--
 File        :  $Source: /ds6/cvs/privoxy/doc/source/user-manual.sgml,v $

 Purpose     :  user manual
                This file belongs into
                ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/

 $Id: user-manual.sgml,v 1.1.1.2 2003/05/23 11:55:17 lionel Exp $

 Copyright (C) 2001, 2002 Privoxy Developers <developers@privoxy.org>
 See LICENSE.

 ========================================================================
 NOTE: Please read developer-manual/documentation.html before touching 
 anything in this, or other Privoxy documentation.
 ========================================================================

-->

<article id="index">
<artheader>

<title>Privoxy &p-version; User Manual</title>

<pubdate>
 <subscript>
<!-- Completely the wrong markup, but very little is allowed  -->
<!-- in this part of an article. FIXME -->
 <link linkend="copyright">Copyright</link> &my-copy; 2001, 2002 by 
 <ulink url="http://www.privoxy.org/">Privoxy Developers</ulink>
 </subscript>
</pubdate>

<pubdate>$Id: user-manual.sgml,v 1.1.1.2 2003/05/23 11:55:17 lionel Exp $</pubdate>

<!--

Note: the following should generate a separate page, and a live link to it,
all nicely done. But it doesn't for some mysterious reason. Please leave
commented unless it can be fixed proper. For the time being, the
copyright/license declarations will be in their own sgml.

Hal.

<copyright>
  <year>2001</year>
  <year>2002</year>
  <holder>Privoxy Developers</holder>
</copyright>

<legalnotice id="legalnotice"> 
 <para>
  text goes here ........
 </para>
</legalnotice>

-->


<abstract>

<![%dummy;[
 <para>
 <comment>
  This is here to keep vim syntax file from breaking :/
  If I knew enough to fix it, I would.
  PLEASE DO NOT REMOVE! HB: hal@foobox.net
 </comment>
 </para>
]]>

 <para>
  The <citetitle>User Manual</citetitle> gives users information on how to
  install, configure and use <ulink
  url="http://www.privoxy.org/"><application>Privoxy</application></ulink>.
 </para>

<!-- Include privoxy.sgml boilerplate: -->
 &p-intro;
<!-- end privoxy.sgml -->

 <para>
  You can find the latest version of the <citetitle>User Manual</citetitle> at  <ulink
  url="http://www.privoxy.org/user-manual/">http://www.privoxy.org/user-manual/</ulink>.
  Please see the <link linkend="contact">Contact section</link> on how to
  contact the developers.
 </para>

<!--   <para> -->
<!--    Feel free to send a note to the developers at <email>ijbswa-developers@lists.sourceforge.net</email>. -->
<!--   </para> -->
</abstract>

</artheader>

<!--   ~~~~~       New section      ~~~~~     -->
<sect1 label="1" id="introduction"><title>Introduction</title>
<para>
 This documentation is included with the current &p-status; version of
 <application>Privoxy</application>, v.&p-version;<![%p-not-stable;[, 
 and is mostly complete at this point. 
 Development of version 3.2 is just beginning,
 and will include many significant changes and enhancements over
 earlier versions]]>.
</para>

<!-- include only in non-stable versions -->
<![%p-not-stable;[
<para>
 Since this is a &p-status; version, not all new features are well tested. This
 documentation may be slightly out of sync as a result (especially with 
 CVS sources). And there <emphasis>may be</emphasis> bugs, though hopefully
 not many! Please find them!
</para>
]]>

<!--   ~~~~~       New section      ~~~~~     -->
<sect2 id="features"><title>Features</title>
<para>
 In addition to <application>Internet Junkbuster's</application> traditional
 features of ad and banner blocking and cookie management,
 <application>Privoxy</application> provides new features<![%p-not-stable;[,
 some of them currently under development]]>:
</para>
<!-- Include newfeatures.sgml boilerplate here: -->
 &newfeatures;
<!-- end boilerplate -->
</sect2>

</sect1>

<!--  ~  End section  ~  -->


<!--   ~~~~~       New section      ~~~~~     -->
<sect1 id="installation"><title>Installation</title>

<para>
 <application>Privoxy</application> is available both in convenient pre-compiled
 packages for a wide range of operating systems, and as raw source code.
 For most users, we recommend using the packages, which can be downloaded from our
 <ulink url="http://sourceforge.net/projects/ijbswa/">Privoxy Project
 Page</ulink>.
</para>

<para>
 Note: If you have a previous <application>Junkbuster</application> or
 <application>Privoxy</application> installation on your system, you
 will need to remove it.  On some platforms, this may be done for you as part
 of their installation procedure. (See below for your platform). In any case
 <emphasis>be sure to backup your old configuration if it is valuable to
 you.</emphasis> See the <link linkend="upgradersnote">note to
 upgraders</link> section below.
</para>

<!--   ~~~~~       New section      ~~~~~     --> 
<sect2 id="installation-packages"><title>Binary Packages</title>
<para>
How to install the binary packages depends on your operating system:
</para>

<!--   ~~~~~       New section      ~~~~~     -->
<sect3 id="installation-pack-rpm"><title>Red Hat, SuSE and Conectiva RPMs</title>

<para>
 RPMs can be installed with <literal>rpm -Uvh privoxy-&p-version;-1.rpm</literal>,
 and will use <filename>/etc/privoxy</filename> for the location 
 of configuration files.
</para>

<para>
 Note that on Red Hat, <application>Privoxy</application> will
 <emphasis>not</emphasis> be automatically started on system boot. You will
 need to enable that using <command>chkconfig</command>,
 <command>ntsysv</command>, or similar methods. Note that SuSE will 
automatically start Privoxy in the boot process.
</para>

<para>
 If you have problems with failed dependencies, try rebuilding the SRC RPM: 
 <literal>rpm --rebuild privoxy-&p-version;-1.src.rpm</literal>. This 
 will use your locally installed libraries and RPM version. 
</para>

<para>
 Also note that if you have a <application>Junkbuster</application> RPM installed
 on your system, you need to remove it first, because the packages conflict.
 Otherwise, RPM will try to remove <application>Junkbuster</application>
 automatically, before installing <application>Privoxy</application>.
</para>
</sect3>

<!--   ~~~~~       New section      ~~~~~     -->
<sect3 id="installation-deb"><title>Debian</title>
<para>
 DEBs can be installed with <literal>apt-get install privoxy</literal>,
 and will use <filename>/etc/privoxy</filename> for the location of 
 configuration files.
</para>
</sect3>

<!--   ~~~~~       New section      ~~~~~     -->
<sect3 id="installation-pack-win"><title>Windows</title>

<para>
 Just double-click the installer, which will guide you through
 the installation process. You will find the configuration files
 in the same directory as you installed Privoxy in. We do not
 use the registry of Windows. 
</para>
</sect3>

<!--   ~~~~~       New section      ~~~~~     -->
<sect3 id="installation-pack-bintgz"><title>Solaris, NetBSD, FreeBSD, HP-UX</title>

<para>
 Create a new directory, <literal>cd</literal> to it, then unzip and
 untar the archive. For the most part, you'll have to figure out where
 things go. <!-- FIXME, more info needed? -->
</para>
</sect3>

<!--   ~~~~~       New section      ~~~~~     -->
<sect3 id="installation-os2"><title>OS/2</title>

<para>
 First, make sure that no previous installations of
 <application>Junkbuster</application> and / or 
 <application>Privoxy</application> are left on your
 system. Check that no <application>Junkbuster</application>
 or <application>Privoxy</application> objects are in
 your startup folder.

</para>

<para>
 Then, just double-click the WarpIN self-installing archive, which will
 guide you through the installation process. A shadow of the
 <application>Privoxy</application> executable will be placed in your
 startup folder so it will start automatically whenever OS/2 starts.
</para>

<para>
 The directory you choose to install <application>Privoxy</application>
 into will contain all of the configuration files.
</para>
</sect3>

<!--   ~~~~~       New section      ~~~~~     -->
<sect3 id="installation-mac"><title>Mac OSX</title>
<para>
 Unzip the downloaded file (you can either double-click on the file
 from the finder, or from the desktop if you downloaded it there).
 Then, double-click on the package installer icon named
 <literal>Privoxy.pkg</literal>
 and follow the installation process.
 <application>Privoxy</application> will be installed in the folder
 <literal>/Library/Privoxy</literal>.
 It will start automatically whenever you start up.  To prevent it from
 starting automatically, remove or rename the folder
 <literal>/Library/StartupItems/Privoxy</literal>. 
</para>
<para>
 To start Privoxy by hand, double-click on 
 <literal>StartPrivoxy.command</literal> in the
 <literal>/Library/Privoxy</literal> folder.
 Or, type this command in the Terminal:
</para>
<para>
  <screen>
  /Library/Privoxy/StartPrivoxy.command
  </screen>
</para>
<para>
 You will be prompted for the administrator password.
</para>
</sect3>

<!--   ~~~~~       New section      ~~~~~     -->
<sect3 id="installation-amiga"><title>AmigaOS</title>
<para>
 Copy and then unpack the <filename>lha</filename> archive to a suitable location. 
 All necessary files will be installed into <application>Privoxy</application>
 directory, including all configuration and log files. To uninstall, just 
 remove this directory.
</para>
</sect3>

<!--   ~~~~~       New section      ~~~~~     -->
<sect3 id="installattion-gentoo"><title>Gentoo</title>
<para>
 Gentoo source packages (Ebuilds) for <application>Privoxy</application> are 
 contained in the Gentoo  Portage Tree (they are not on the download page, 
 but there is a Gentoo section, where you can see when a new 
 <application>Privoxy</application> Version is added to the  Portage Tree).
</para>
<para>
 Before installing <application>Privoxy</application> under Gentoo just do 
 first <literal>emerge rsync</literal> to get the latest changes from the 
 Portage tree. With <literal>emerge privoxy</literal> you install the latest 
 version.
</para>
<para>
 Configuration files are in <filename>/etc/privoxy</filename>, the 
 documentation is in <filename>/usr/share/doc/privoxy-&p-version;</filename>
 and the Log directory is in <filename>/var/log/privoxy</filename>.
</para>
</sect3>

</sect2>

<!--   ~~~~~       New section      ~~~~~     -->
<sect2 id="installation-source"><title>Building from Source</title>

<para>
 The most convenient way to obtain the <application>Privoxy</application> sources
 is to download the source tarball from our <ulink url="http://sf.net/projects/ijbswa/">project
 page</ulink>.
</para>

<para>
 If you like to live on the bleeding edge and are not afraid of using
 possibly unstable development versions, you can check out the up-to-the-minute
 version directly from <ulink url="http://sourceforge.net/cvs/?group_id=11118">the
 CVS repository</ulink> or simply download <ulink
 url="http://cvs.sourceforge.net/cvstarballs/ijbswa-cvsroot.tar.gz">the nightly CVS
 tarball.</ulink>
</para>

<!-- include buildsource.sgml boilerplate: -->
&buildsource;
<!-- end boilerplate -->

</sect2>
<!--   ~~~~~       New section      ~~~~~     --> 
<sect2 id="installation-keepupdated"><title>Keeping your Installation Up-to-Date</title>
<para>
 As user feedback comes in and development continues, we will make updated versions
 of both the main <link linkend="actions-file">actions file</link> (as a <ulink
 url="http://sourceforge.net/project/showfiles.php?group_id=11118&amp;release_id=103670">separate
 package</ulink>) and the software itself (including the actions file) available for
 download.
</para>

<para>
 If you wish to receive an email notification whenever we release updates of
 <application>Privoxy</application> or the actions file, <ulink
 url="http://lists.sourceforge.net/lists/listinfo/ijbswa-announce/">subscribe
 to our announce  mailing list</ulink>, ijbswa-announce@lists.sourceforge.net.
</para>

<para>
 In order not to loose your personal changes and adjustments when updating
 to the latest <literal>default.action</literal> file we <emphasis>strongly
 recommend</emphasis> that you use <literal>user.action</literal> for your
 customization of <application>Privoxy</application>. See the <link
 linkend="actions-file">Chapter on actions files</link> for details.
</para>

</sect2>


</sect1>

<!--  ~  End section  ~  -->

<!--   ~~~~~       New section      ~~~~~     -->
<sect1 id="upgradersnote">
<title>Note to Upgraders</title>
<para>
 There are very significant changes from earlier 
 <application>Junkbuster</application> versions to the current
 <application>Privoxy</application>. The number, names, syntax, and
 purposes of configuration files have substantially  changed.
 <application>Junkbuster 2.0.x</application> configuration
 files will not migrate, <application>Junkbuster 2.9.x</application>
 and <application>Privoxy</application> configurations will need to be
 ported. The functionalities of the old <filename>blockfile</filename>,
 <filename>cookiefile</filename> and <filename>imagelist</filename> 
 are now combined into the <link linkend="actions-file"><quote>actions
 files</quote></link>.  
 <filename>default.action</filename>, is the main actions file. Local
 exceptions should best be put into <filename>user.action</filename>.
</para>
<para>
 A <link linkend="filter-file"><quote>filter file</quote></link> (typically
 <filename>default.filter</filename>) is new as of <application>Privoxy
 2.9.x</application>, and provides some of the new sophistication (explained
 below). <filename>config</filename> is much the same as before.
</para>
<para>
 If upgrading from a 2.0.x version, you will have to use the new config 
 files, and possibly adapt any personal rules from your older files.
 When porting personal rules over from the old <filename>blockfile</filename>
 to the new actions files, please note that even the pattern syntax has
 changed. If upgrading from 2.9.x development versions, it is still
 recommended to use the new configuration files.
</para>
<para>
 A quick list of things to be aware of before upgrading: 
</para>

<para>
 <itemizedlist>

 <listitem>
  <para>
   The default listening port is now 8118 due to a conflict with another 
   service (NAS).
  </para>
 </listitem>  
 <listitem>
  <para>  
    Some installers may remove earlier versions completely. Save any 
    important configuration files!
  </para>
 </listitem>
 <listitem>
  <para>
   <application>Privoxy</application> is controllable with a web browser 
   at the special URL: <ulink
   url="http://config.privoxy.org/">http://config.privoxy.org/</ulink>
   (Shortcut: <ulink url="http://p.p/">http://p.p/</ulink>). Many
   aspects of configuration can be done here, including temporarily disabling
   <application>Privoxy</application>.
  </para>
 </listitem> 
 <listitem>
  <para>
   The primary configuration files for cookie management, ad and banner 
   blocking, and many other aspects of <application>Privoxy</application>
   configuration are the <link linkend="actions-file">actions
   files</link>. It is strongly recommended to become familiar with the new
   actions concept below, before modifying these files. Locally defined rules 
   should go into <filename>user.action</filename>.
  </para>
 </listitem> 
  <listitem>
  <para>
<!-- I think it is best to keep this somewhat vague, in case  -->
<!-- the situation changes under our feet. -->   
   Some installers may not automatically start
   <application>Privoxy</application> after installation.
  </para>
 </listitem> 

 </itemizedlist>
</para>
</sect1>

<!--   ~~~~~       New section      ~~~~~     -->
<sect1 id="quickstart"><title>Quickstart to Using <application>Privoxy</application></title>
<para>
 <itemizedlist>

 <listitem>
  <para>
   If upgrading, from versions before 2.9.16, please back up any configuration
   files. See the <link linkend="upgradersnote">Note to Upgraders</link> Section.
 </para>
</listitem> 

 <listitem>
  <para>
  Install <application>Privoxy</application>. See the <link
  linkend="installation">Installation Section</link> below for platform specific
  information. 
 </para>
 </listitem>  

 <listitem>
  <para>
   Advanced users and those who want to offer <application>Privoxy</application>
   service to more than just their local machine should check the <link
   linkend="config">main config file</link>, especially the <link
   linkend="access-control">security-relevant</link> options. These are 
   off by default.
  </para>
 </listitem>  

 <listitem>
  <para>
  Start <application>Privoxy</application>, if the installation program has
  not done this already (may vary according to platform). See the section
  <link linkend="startup">Starting <application>Privoxy</application></link>.
  </para>
 </listitem>

 <listitem>
  <para>
   Set your browser to use <application>Privoxy</application> as HTTP and
   HTTPS (SSL) proxy by setting the proxy configuration for address of
   <literal>127.0.0.1</literal> and port <literal>8118</literal>.
   (<application>Junkbuster</application> and earlier versions of
   <application>Privoxy</application> used port 8000.) See the section <link
   linkend="startup">Starting <application>Privoxy</application></link> below
   for more details on this.
  </para>
 </listitem>  

 <listitem>
  <para>
    Flush your browser's disk and memory caches, to remove any cached ad images.
    If using <application>Privoxy</application> to manage cookies, you should 
    remove any currently stored cookies too.
  </para>
 </listitem> 

 <listitem>
  <para>
   A default installation should provide a reasonable starting point for 
   most. There will undoubtedly be occasions where you will want to adjust the
   configuration, but that can be dealt with as the need arises. Little 
   to no initial configuration is required in most cases.
  </para>
  <para>
   See the <link linkend="configuration">Configuration section</link> for more
   configuration options, and how to customize your installation.
 <![%draft;[  You might also want to look at the <link
   linkend="quickstart-ad-blocking">next section</link> for a quick
   introduction to how <application>Privoxy</application> blocks ads and
   banners.]]>
  </para>
 </listitem> 

 <listitem>
  <para>
    If you experience ads that slipped through, innocent images that are
    blocked, or otherwise feel the need to fine-tune
    <application>Privoxy's</application> behaviour, take a look at the <link
    linkend="actions-file">actions files</link>. As a quick start, you might
    find the <link linkend="act-examples">richly commented examples</link>
    helpful. You can also view and edit the actions files through the <ulink
    url="http://config.privoxy.org">web-based user interface</ulink>. The
    Appendix <quote><link linkend="actionsanat">Anatomy of an
    Action</link></quote> has hints how to debug actions that
    <quote>misbehave</quote>.
  </para>
 </listitem> 

 <listitem>
  <para>
   Please see the section <link linkend="contact">Contacting the
   Developers</link> on how to report bugs or problems with websites or to get
   help. 
  </para>
 </listitem> 

 <listitem>
  <para>
   Now enjoy surfing with enhanced comfort and privacy!
  </para>
 </listitem> 
 
 </itemizedlist>
</para>


<!--   ~~~~~       New section      ~~~~~     -->

<sect2 id="quickstart-ad-blocking">
<title>Quickstart to Ad Blocking</title>
<!--
 NOTE:  This section is deliberately redundant for those that don't 
 want to read the whole thing (which is getting lengthy).
-->
<para>
 Ad blocking is but one of <application>Privoxy's</application>
 array of features. Many of these features are for the technically minded advanced 
 user. But, ad and banner blocking is surely common ground for everybody.
</para>
<para> 
 This section will provide a quick summary of ad blocking so 
 you can get up to speed quickly without having to read the more extensive
 information provided below, though this is highly recommended.
</para>
<para>
 First a bit of a warning ... blocking ads is much like blocking SPAM: the
 more aggressive you are about it, the more likely you are to block 
 things that were not intended. So there is a trade off here. If you want
 extreme ad free browsing, be prepared to deal with more
 <quote>problem</quote> sites, and to spend more time adjusting the
 configuration to solve these unintended consequences. In short, there is 
 not an easy way to eliminate <emphasis>all</emphasis> ads. Either take 
 the easy way and settle for <emphasis>most</emphasis> ads blocked with the
 default configuration, or jump in and tweak it for your personal surfing
 habits and preferences.
</para>
<para>
 Secondly, a brief explanation of <application>Privoxy's </application>
 <quote>actions</quote>. <quote>Actions</quote> in this context, are 
 the directives we use to tell <application>Privoxy</application> to perform
 some task relating to HTTP transactions (i.e. web browsing). We tell
 <application>Privoxy</application> to take some <quote>action</quote>. Each
 action has a unique name and function. While there are many potential
 <application>actions</application> in <application>Privoxy's</application>
 arsenal, only a few are used for ad blocking. <link
 linkend="actions">Actions</link>, and <link linkend="actions-file">action
 configuration files</link>, are explained in depth below.
</para>
<para>
 Actions are specified in <application>Privoxy's</application> configuration,
 followed by one or more URLs to which the action should apply. URLs 
 can actually be URL type <link linkend="af-patterns">patterns</link> that use
 wildcards so they can apply potentially to a range of similar URLs. The
 actions, together with the URL patterns are called a section.
</para>
<para>
 When you connect to a website, the full URL will either match one or more
 of the sections as defined in <application>Privoxy's</application> configuration,
 or not. If so, then <application>Privoxy</application> will perform the
 respective actions. If not, then nothing special happens. Furthermore, web
 pages may contain embedded, secondary URLs that your web browser will
 use to load additional components of the page, as it parses the
 original page's HTML content. An ad image for instance, is just an URL
 embedded in the page somewhere. The image itself may be on the same server,
 or a server somewhere else on the Internet. Complex web pages will have many
 such embedded URLs.
</para>

<para>
 The actions we need to know about for ad blocking are:  <literal><link
 linkend="block">block</link></literal>, <literal><link
 linkend="handle-as-image">handle-as-image</link></literal>, and
 <literal><link linkend="set-image-blocker">set-image-blocker</link></literal>:
</para>

<para>
 <itemizedlist>
  
 <listitem>
  <para>
   <literal><link linkend="block">block</link></literal> - this action stops
   any contact between your browser and any URL patterns that match this
   action's configuration. It can be used for blocking ads, but also anything
   that is determined to be unwanted. By itself, it simply stops any
   communication with the remote server and sends <application>Privoxy</application>'s
   own built-in BLOCKED page instead to let you now what has happened.
  </para>
 </listitem> 

 <listitem>
  <para>
   <literal><link linkend="handle-as-image">handle-as-image</link></literal> - 
   tells <application>Privoxy</application> to treat this URL as an image.
   <application>Privoxy</application>'s default configuration already does this
   for all common image types (e.g. GIF), but there are many situations where this
   is not so easy to determine. So we'll force it in these cases. This is particularly
   important for ad blocking, since  only if we know that it's an image of
   some kind, can we replace it with an image of our choosing, instead of the 
   <application>Privoxy</application> BLOCKED page (which would only result in
   a <quote>broken image</quote> icon). There are some limitations to this
   though. For instance, you can't just brute-force an image substitution for
   an entire HTML page in most situations.
  </para>
 </listitem> 

 <listitem>
  <para>
   <literal><link
   linkend="set-image-blocker">set-image-blocker</link></literal> - tells
   <application>Privoxy</application> what to display in place of an ad image that
   has hit a block rule. For this to come into play, the URL must match a
   <literal><link linkend="block">block</link></literal> action somewhere in the
   configuration, <emphasis>and</emphasis>, it must also match an
   <literal><link linkend="handle-as-image">handle-as-image</link></literal> action.
  </para>
  <para>
   The configuration options on what to display instead of the ad are:
  </para>
  <simplelist>
   <member>
    &nbsp;&nbsp;&nbsp;<emphasis>pattern</emphasis> - a checkerboard pattern, so that an ad 
    replacement is obvious. This is the default.
   </member>
  </simplelist>
  <simplelist>
   <member>
    &nbsp;&nbsp;&nbsp;<emphasis>blank</emphasis> - A very small empty GIF image is displayed.
    This is the so-called <quote>invisible</quote> configuration option.
   </member>
  </simplelist>
  <simplelist>
   <member>
    &nbsp;&nbsp;&nbsp;<emphasis>http://&lt;URL&gt;</emphasis> - A redirect to any image anywhere
    of the user's choosing (advanced usage).
   </member>
  </simplelist>
  </listitem> 

</itemizedlist>
</para>

<para>
 The quickest way to adjust any of these settings is with your browser through
 the special <application>Privoxy</application> editor at <ulink
 url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status</ulink>
 (shortcut: <ulink url="http://p.p/">http://p.p/show-status</ulink>). This 
 is an internal page, and does not require Internet access. Select the
 appropriate <quote>actions</quote> file, and click
 <quote><guibutton>Edit</guibutton></quote>. It is best to put personal or
 local preferences in <filename>user.action</filename> since this is not
 meant to be overwritten during upgrades, and will over-ride the settings in
 other files. Here you can insert new <quote>actions</quote>, and URLs for ad
 blocking or other purposes, and make other adjustments to the configuration.
 <application>Privoxy</application> will detect these changes automatically.
</para>

<para>
 A quick and simple step by step example:
</para>

<para>
 <itemizedlist>

  <listitem>
   <para>
     Right click on the ad image to be blocked, then select 
     <quote><guimenuitem>Copy Link Location</guimenuitem></quote> from the
     pop-up menu. 
   </para>
  </listitem> 
  <listitem>
   <para>
    Set your browser to 
    <ulink
 url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status</ulink>
   </para>
  </listitem> 
  <listitem>
   <para>
    Find <filename>user.action</filename> in the top section, and click 
    on <quote><guibutton>Edit</guibutton></quote>:
   </para>

 <!-- image of editor and actions files selections -->
 <para>
  <figure pgwide="0" float="0"><title>Actions Files in Use</title>
   <mediaobject>
     <imageobject>
      <imagedata  fileref="../images/files-in-use.jpg" format="jpg">
       </imageobject> 
       <textobject>
        <phrase>[ Screenshot of Actions Files in Use ]</phrase>
      </textobject>
   </mediaobject>
  </figure>
 </para>
 </listitem> 
 
 <listitem>
  <para>
   You should have a section with only
   <literal><link linkend="block">block</link></literal> listed under 
   <quote>Actions:</quote>.
   If not, click a <quote><guibutton>Insert new section below</guibutton></quote>
   button, and in the new section that just appeared, click the 
   <guibutton>Edit</guibutton> button right under the word <quote>Actions:</quote>.
   This will bring up a list of all actions. Find
   <literal><link linkend="block">block</link></literal> near the top, and click
   in the <quote>Enabled</quote> column, then <quote><guibutton>Submit</guibutton></quote>
   just below the list.
  </para>
 </listitem> 
 <listitem>
  <para>
   Now, in the <literal><link linkend="block">block</link></literal> actions section,
   click the <quote><guibutton>Add</guibutton></quote> button, and paste the URL the
   browser got from <quote><guimenuitem>Copy Link Location</guimenuitem></quote>.
   Remove the <literal>http://</literal> at the beginning of the URL. Then, click
   <quote><guibutton>Submit</guibutton></quote> (or
   <quote><guibutton>OK</guibutton></quote> if in a pop-up window).
  </para>
 </listitem> 
 <listitem>
  <para>
   Now go back to the original page, and press <keycap>SHIFT-Reload</keycap>
   (or flush all browser caches). The image should be gone now.
  </para>
 </listitem> 
 
 </itemizedlist>
</para>

<para>
 This is a very crude and simple example. There might be good reasons to use a 
 wildcard pattern match to include potentially similar images from the same
 site. For a more extensive explanation of <quote>patterns</quote>, and 
 the entire actions concept, see <link linkend="actions-file">the Actions
 section</link>.
</para>

<para>
 For advanced users who want to hand edit their config files, you might want
 to now go to the <link linkend="act-examples">Actions Files Tutorial</link>.
 The ideas explained therein also apply to the web-based editor.
</para>

</sect2>

</sect1>

<!--  ~  End section  ~  -->


<!--   ~~~~~       New section      ~~~~~     -->
<sect1 id="startup">
<title>Starting <application>Privoxy</application></title>
<para>
 Before launching <application>Privoxy</application> for the first time, you
 will want to configure your browser(s) to use
 <application>Privoxy</application> as a HTTP and HTTPS proxy. The default is
 127.0.0.1 (or localhost) for the proxy address, and port 8118 (earlier versions
 used port 8000). This is the one configuration step that must be done!
</para>
<para>
 Please note that <application>Privoxy</application> can only proxy HTTP and 
 HTTPS traffic. It will not work with FTP or other protocols.
</para>

 <!-- image of Mozilla Proxy configuration -->
 <para>
  <figure pgwide="0" float="0"><title>Proxy Configuration (Mozilla)</title>
   <mediaobject>
     <imageobject>
      <imagedata  fileref="../images/proxy_setup.jpg" format="jpg">
       </imageobject> 
       <textobject>
        <phrase>[ Screenshot of Mozilla Proxy Configuration ]</phrase>
      </textobject>
   </mediaobject>
  </figure>
 </para>
 
<para> 
 With <application>Netscape</application> (and
 <application>Mozilla</application>), this can be set under:
</para>
 
<literallayout>
<!-- Mix ascii and gui art, something for everybody -->
<!-- spacing on this is tricky -->
 <guibutton>Edit</guibutton>
   |_   
         <guibutton>Preferences</guibutton>
                |_       
                        <guibutton>Advanced</guibutton>
                              |_     
                                    <guibutton>Proxies</guibutton>
                                         |_       
                                                <guibutton>HTTP Proxy</guibutton>
</literallayout>

<para>
 For <application>Internet Explorer</application>: 
</para>

<literallayout>
<!-- Mix ascii and gui art, something for everybody -->
<!-- spacing on this is tricky -->
 <guibutton>Tools</guibutton>
     |_   
         <guibutton>Internet Properties</guibutton>
                            |_       
                                      <guibutton>Connections</guibutton>
                                               |_     
                                                            <guibutton>LAN Settings</guibutton>
</literallayout>

<para>
 Then, check <quote>Use Proxy</quote> and fill in the appropriate info
 (Address: 127.0.0.1, Port: 8118). Include HTTPS (SSL), if you want HTTPS
 proxy support too. 
</para>

<para>
 After doing this, flush your browser's disk and memory caches to force a
 re-reading of all pages and to get rid of any ads that may be cached. You 
 are now ready to start enjoying the benefits of using
 <application>Privoxy</application>!
</para>

<para>
 <application>Privoxy</application> is typically started by specifying the
 main configuration file to be used on the command line. If no configuration
 file is specified on the command line, <application>Privoxy</application>
 will look for a file named <filename>config</filename> in the current
 directory. Except on Win32 where it will try <filename>config.txt</filename>.
</para>

<sect2 id="start-redhat">
<title>Red Hat and Conectiva</title>
<para>
 We use a script. Note that Red Hat does not start Privoxy upon booting per
 default. It will use the file <filename>/etc/privoxy/config</filename> as
 its main configuration file.
</para>
<para>
 <screen>
 # /etc/rc.d/init.d/privoxy start
</screen>
</para>
</sect2>

<sect2 id="start-debian">
<title>Debian</title>
<para>
 We use a script. Note that Debian starts Privoxy upon booting per
 default.  It will use the file
 <filename>/etc/privoxy/config</filename> as its main configuration
 file.
</para>
<para>
 <screen>
 # /etc/init.d/privoxy start
</screen>
</para>
</sect2>

<sect2 id="start-suse">
<title>SuSE</title>
<para>
We use a script. It will use the file <filename>/etc/privoxy/config</filename>
as its main configuration file. Note that SuSE starts Privoxy upon booting
your PC.
</para>
<para>
 <screen>
 # rcprivoxy start
</screen>
</para>
</sect2>

<sect2 id="start-windows">
<title>Windows</title>
<para>
Click on the Privoxy Icon to start Privoxy. If no configuration file is
 specified on the command line, <application>Privoxy</application> will look
 for a file named <filename>config.txt</filename>. Note that Windows will
 automatically start Privoxy upon booting you PC.
</para>
</sect2>

<sect2 id="start-unices">
<title>Solaris, NetBSD, FreeBSD, HP-UX and others</title>
<para>
Example Unix startup command:
</para>
<para>
 <screen>
 # /usr/sbin/privoxy /etc/privoxy/config
</screen>
</para>
</sect2>

<sect2 id="start-os2">
<title>OS/2</title>
<para>
 During installation, <application>Privoxy</application> is configured to
 start automatically when the system restarts. You can start it manually by
 double-clicking on the <application>Privoxy</application> icon in the
 <application>Privoxy</application> folder.
</para>
</sect2>

<sect2 id="start-macosx">
<title>Mac OSX</title>
<para>
 During installation, <application>Privoxy</application> is configured to
 start automatically when the system restarts.  To start Privoxy by hand,
 double-click on the <literal>StartPrivoxy.command</literal> icon in the
 <literal>/Library/Privoxy</literal> folder.  Or, type this command
 in the Terminal:
</para>
<para>
  <screen>
  /Library/Privoxy/StartPrivoxy.command
  </screen>
</para>
<para>
 You will be prompted for the administrator password.
</para>
</sect2>


<sect2 id="start-amigaos">
<title>AmigaOS</title>
<para>
 Start <application>Privoxy</application> (with RUN &lt;&gt;NIL:) in your
 <filename>startnet</filename> script (AmiTCP), in
 <filename>s:user-startup</filename> (RoadShow), as startup program in your
 startup script (Genesis), or as startup action (Miami and MiamiDx). 
 <application>Privoxy</application> will automatically quit when you quit your
 TCP/IP stack (just ignore the harmless warning your TCP/IP stack may display that
 <application>Privoxy</application> is still running).
</para>
</sect2>

<sect2 id="start-gentoo">
<title>Gentoo</title>
<para>
 A script is again used. It will use the file <filename>/etc/privoxy/config 
 </filename> as its main configuration file.
</para>
<para>
 <screen>
 /etc/init.d/privoxy start
 </screen>
</para>
<para>
 Note that <application>Privoxy</application> is not automatically started at 
 boot time by default. You can change this with the <literal>rc-update</literal> 
 command.
</para>
<para> 
 <screen>
 rc-update add privoxy default
 </screen>
</para>
</sect2>

<!--

<para>
 See the section <link linkend="cmdoptions">Command line options</link> for
 furher info.
</para>

must find a better place for this paragraph

<para>
 The included default configuration files should give a reasonable starting
 point. Most of the per site configuration is done in the
 <ulink url="actions-file.html"><quote>actions</quote></ulink> files. These are
 where various cookie actions are defined, ad and banner blocking, and other
 aspects of <application>Privoxy</application> configuration. There are several
 such files included, with varying levels of aggressiveness. 
</para>

<para>
 You will probably want to keep an eye out for sites for which you may prefer
 persistent cookies, and add these to your actions configuration as needed. By
 default, most of these will be accepted only during the current browser
 session (aka <quote>session cookies</quote>), unless you add them to the
 configuration. If you want the browser to handle this instead, you will need
 to edit <filename>user.action</filename> (or through the web based interface)
 and disable this feature. If you use more than one browser, it would make
 more sense to let <application>Privoxy</application> handle this. In which
 case, the browser(s) should be set to accept all cookies.
</para>

<para>
 Another feature where you will probably want to define exceptions for trusted
 sites is the popup-killing (through the <ulink
 url="actions-file.html#KILL-POPUPS"><quote>+kill-popups</quote></ulink> and
 <ulink
 url="actions-file.html#FILTER-POPUPS"><quote>+filter{popups}</quote></ulink>
 actions), because your favorite shopping, banking, or leisure site may need
 popups (explained below). 
</para>

<para>
 <application>Privoxy</application> is HTTP/1.1 compliant,  but not all of
 the optional 1.1 features are as yet supported. In the unlikely event that
 you experience inexplicable problems with browsers that use HTTP/1.1 per default
 (like <application>Mozilla</application> or recent versions of I.E.), you might
 try to force HTTP/1.0 compatibility. For Mozilla, look under <literal>Edit -&gt;
 Preferences -&gt; Debug -&gt; Networking</literal>.
 Alternatively, set the <quote>+downgrade-http-version</quote> config option in
 <filename>default.action</filename> which will downgrade your browser's HTTP
 requests from HTTP/1.1 to HTTP/1.0 before processing them.
</para>

<para>
 After running <application>Privoxy</application> for a while, you can 
 start to fine tune the configuration to suit your personal, or site, 
 preferences and requirements. There are many, many aspects that can 
 be customized. <quote>Actions</quote> 
 can be adjusted by pointing your browser to 
 <ulink url="http://config.privoxy.org/">http://config.privoxy.org/</ulink>
 (shortcut: <ulink url="http://p.p/">http://p.p/</ulink>), 
 and then follow the link to <quote>View &#38; Change the Current Configuration</quote>. 
 (This is an internal page and does not require Internet access.)
</para>

<para>
 In fact, various aspects of <application>Privoxy</application>
 configuration can be viewed from this page, including 
 current configuration parameters, source code version numbers, 
 the browser's request headers, and <quote>actions</quote> that apply 
 to a given URL. In addition to the actions file 
 editor mentioned above, <application>Privoxy</application> can also 
 be turned <quote>on</quote> and <quote>off</quote> (toggled) from this page.
</para>

<para>
 If you encounter problems, try loading the page without
 <application>Privoxy</application>. If that helps, enter the URL where
 you have the problems into <ulink url="http://p.p/show-url-info">the browser
 based rule tracing utility</ulink>. See which rules apply and why, and
 then try turning them off for that site one after the other, until the problem
 is gone. When you have found the culprit, you might want to turn the rest on
 again.
</para>

<para>
 If the above paragraph sounds gibberish to you, you might want to <link
 linkend="actions-file">read more about the actions concept</link>
 or even dive deep into the <link linkend="actionsanat">Appendix
 on actions</link>.
</para>

<para>
 If you can't get rid of the problem at all, think you've found a bug in
 Privoxy, want to propose a new feature or smarter rules, please see the 
 section <link linkend="contact"><quote>Contacting the
 Developers</quote></link> below. 
</para>

-->

<!--   ~~~~~       New section      ~~~~~     -->
<sect2 id="cmdoptions">
<title>Command Line Options</title>
<para>
 <application>Privoxy</application> may be invoked with the following
 command-line options:
</para>

<para>
 <itemizedlist>

 <listitem>
  <para>
    <emphasis>--version</emphasis>
  </para>
  <para>
     Print version info and exit. Unix only.
  </para>
 </listitem> 
 <listitem>
  <para>
    <emphasis>--help</emphasis>
  </para>
  <para>
   Print short usage info and exit. Unix only.
  </para>
 </listitem> 
 <listitem>
  <para>
   <emphasis>--no-daemon</emphasis>
  </para>
  <para>
   Don't become a daemon, i.e. don't fork and become process group
   leader, and don't detach from controlling tty. Unix only.
  </para>
 </listitem> 
 <listitem>
  <para>
   <emphasis>--pidfile FILE</emphasis>
  
  </para>
  <para>
   On startup, write the process ID to <emphasis>FILE</emphasis>. Delete the
   <emphasis>FILE</emphasis> on exit. Failure to create or delete the
   <emphasis>FILE</emphasis> is non-fatal. If no <emphasis>FILE</emphasis>
   option is given, no PID file will be used. Unix only.
  </para>
 </listitem> 
 <listitem>
  <para>
   <emphasis>--user USER[.GROUP]</emphasis>
  
  </para>
  <para>
   After (optionally) writing the PID file, assume the user  ID  of
   <emphasis>USER</emphasis>, and if included the GID of GROUP.  Exit if the
   privileges are not sufficient to do so. Unix only.
  </para>
 </listitem> 
 <listitem>
  <para>
    <emphasis>configfile</emphasis>
  </para>
  <para>
    If no <emphasis>configfile</emphasis> is included on the command line, 
    <application>Privoxy</application> will look for a file named 
    <quote>config</quote> in the current directory (except on Win32 
    where it will look for <quote>config.txt</quote> instead). Specify 
    full path to avoid confusion. If no config file is found, 
    <application>Privoxy</application> will fail to start.
  </para>
 </listitem> 

 </itemizedlist>
</para>

</sect2>

</sect1>

<!--  ~  End section  ~  -->


<!--   ~~~~~       New section      ~~~~~     -->
<sect1 id="configuration"><title><application>Privoxy</application> Configuration</title>
 <para>
  All <application>Privoxy</application> configuration is stored  
  in text files. These files can be edited with a text editor.
  Many important aspects of <application>Privoxy</application> can 
  also be controlled easily with a web browser.
 </para>


<!--   ~~~~~       New section      ~~~~~     -->

<sect2>
<title>Controlling <application>Privoxy</application> with Your Web Browser</title>
<para>
 <application>Privoxy</application>'s user interface can be reached through the special 
 URL <ulink url="http://config.privoxy.org/">http://config.privoxy.org/</ulink>
 (shortcut: <ulink url="http://p.p/">http://p.p/</ulink>), 
 which is a built-in page and works without Internet access.
 You will see the following section:

</para>

<!-- Needs to be put in a table and colorized  -->
<screen>
 <msgtext>
 <bridgehead renderas="sect2">&nbsp;&nbsp;&nbsp;&nbsp;Privoxy Menu</bridgehead>

 <simplelist>
 <member>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&squf;&nbsp;&nbsp;<ulink url="http://config.privoxy.org/show-status">View & change the current configuration</ulink>
 </member>
 <member>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&squf;&nbsp;&nbsp;<ulink url="http://config.privoxy.org/show-version">View the source code version numbers</ulink>
 </member>
 <member>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&squf;&nbsp;&nbsp;<ulink url="http://config.privoxy.org/show-request">View the request headers.</ulink>
 </member>
 <member>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&squf;&nbsp;&nbsp;<ulink url="http://config.privoxy.org/show-url-info">Look up which actions apply to a URL and why</ulink>
 </member>
 <member>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&squf;&nbsp;&nbsp;<ulink url="http://config.privoxy.org/toggle">Toggle Privoxy on or off</ulink>
 </member>
 <member>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&squf;&nbsp;&nbsp;<ulink url="http://www.privoxy.org/&p-version;/user-manual/">Documentation</ulink>
 </member>
 </simplelist>
 </msgtext>
</screen>


<para>
 This should be self-explanatory. Note the first item leads to an editor for the
 <link linkend="actions-file">actions files</link>, which is where the ad, banner,
 cookie, and URL blocking magic is configured as well as other advanced features of
 <application>Privoxy</application>. This is an easy way to adjust various
 aspects of <application>Privoxy</application> configuration. The actions
 file, and other configuration files, are explained in detail below. 
</para>

<para>
 <quote>Toggle Privoxy On or Off</quote> is handy for sites that might 
 have problems with your current actions and filters. You can in fact use
 it as a test to see whether it is <application>Privoxy</application> 
 causing the problem or not. <application>Privoxy</application> continues 
 to run as a proxy in this case, but all manipulation is disabled, i.e.
 <application>Privoxy</application> acts like a normal forwarding proxy. There
 is even a toggle <link linkend="bookmarklets">Bookmarklet</link> offered, so
 that you can toggle <application>Privoxy</application> with one click from
 your browser.
</para>

</sect2>

<!--  ~  End section  ~  -->




<!--   ~~~~~       New section      ~~~~~     -->

<sect2 id="confoverview">
<title>Configuration Files Overview</title>
<para>
 For Unix, *BSD and Linux, all configuration files are located in
 <filename>/etc/privoxy/</filename> by default. For MS Windows, OS/2, and
 AmigaOS these are all in the same directory as the 
 <application>Privoxy</application> executable. <![%p-not-stable;[ The name
 and number of configuration files has changed from previous versions, and is
 subject to change as development progresses.]]>
</para>

<para>
 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:
</para>

<para>
 <itemizedlist>

  <listitem>
   <para>
     The <link linkend="config">main configuration file</link> is named <filename>config</filename>
     on Linux, Unix, BSD, OS/2, and AmigaOS and <filename>config.txt</filename>
     on Windows. This is a required file.
   </para>
  </listitem> 

  <listitem>
   <para>
    <filename>default.action</filename> (the main <link linkend="actions-file">actions file</link>)
    is used to define which <quote>actions</quote> relating to banner-blocking, images, pop-ups,
    content modification, cookie handling etc should be applied by default. It also defines many
    exceptions (both positive and negative) from this default set of actions that enable 
    <application>Privoxy</application> to selectively eliminate the junk, and only the junk, on
    as many websites as possible.
   </para>
   <para>
    Multiple actions files may be defined in <filename>config</filename>. These 
    are processed in the order they are defined. Local customizations and locally 
    preferred exceptions to the default policies  as defined in
    <filename>default.action</filename> (which you will most probably want
    to define sooner or later) are probably best applied in
    <filename>user.action</filename>, where you can preserve them across
    upgrades. <filename>standard.action</filename> is for
    <application>Privoxy's</application> internal use.
   </para>
   <para>    
    There is also a web based editor that can be accessed from
    <ulink
    url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status</ulink>
    (Shortcut: <ulink
    url="http://p.p/show-status">http://p.p/show-status</ulink>) for the
    various actions files. 
   </para>
  </listitem> 

  <listitem>
   <para>
    <filename>default.filter</filename> (the <link linkend="filter-file">filter
    file</link>) can be used to re-write the raw page content, including
    viewable text as well as embedded HTML and JavaScript, and whatever else
    lurks on any given web page. The filtering jobs are only pre-defined here;
    whether to apply them or not is up to the actions files. Only one filter 
    file may be defined.
   </para>
  </listitem> 

 </itemizedlist>
</para>

<para>
 All files use the <quote><literal>#</literal></quote> character to denote a
 comment (the rest of the line will be ignored) and understand line continuation
 through placing a backslash ("<literal>\</literal>") as the very last character
 in a line. If the <literal>#</literal> is preceded by a backslash, it looses
 its special function. Placing a <literal>#</literal> in front of an otherwise
 valid configuration line to prevent it from being interpreted is called "commenting
 out" that line.
</para>

<para>
 The actions files and <filename>default.filter</filename> 
 can use Perl style <link linkend="regex">regular expressions</link> for
 maximum flexibility. 
</para>

<para>
 After making any changes, there is no need to restart
 <application>Privoxy</application> in order for the changes to take
 effect. <application>Privoxy</application> detects such changes 
 automatically. Note, however, that it may take one or two additional
 requests for the change to take effect. When changing the listening address
 of <application>Privoxy</application>, these <quote>wake up</quote> requests
 must obviously be sent to the <emphasis>old</emphasis> listening address.
</para>

<![%p-not-stable;[
<para>
 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 <quote>default</quote> setting, may change, so 
 please check all your configuration files on important issues.
</para>
]]>

</sect2>
</sect1>
<!--  ~  End section  ~  -->


<!--   ~~~~~~~~       New section Header    ~~~~~~~~~     -->

<!-- **************************************************** -->
<!-- Include config.sgml here -->
<!-- This is where the entire config file is detailed. -->
 &config;
<!-- end include  -->


<!--  ~  End section  ~  -->



<!--   ~~~~~~~~       New section Header    ~~~~~~~~~     -->

<sect1 id="actions-file"><title>Actions Files</title>

<para>
 The actions files are used to define what actions
 <application>Privoxy</application> takes for which URLs, and thus determine
 how ad images, cookies and various other aspects of HTTP content and
 transactions are handled, and on which sites (or even parts thereof). There 
 are three such files included with <application>Privoxy</application>, with
 differing purposes: 
</para>
 
 <para>
  <itemizedlist>
   <listitem>
    <para>
     <filename>default.action</filename> - is the primary action file 
     that sets the initial values for all actions. It is intended to 
     provide a base level of functionality for
     <application>Privoxy's</application> array of features. So it is 
     a set of broad rules that should work reasonably well for users everywhere.
     This is the file that the developers are keeping updated, and <link
     linkend="installation-keepupdated">making available to users</link>.
    </para>
   </listitem> 
   <listitem>
    <para>
     <filename>user.action</filename> - is intended to be for local site 
     preferences and exceptions. As an example, if your ISP or your bank
     has specific requirements, and need special handling, this kind of 
     thing should go here. This file will not be upgraded.
    </para>
  </listitem> 
   <listitem>
    <para>
     <filename>standard.action</filename> - is used by the web based editor, 
     to set various pre-defined sets of rules for the default actions section
     in <filename>default.action</filename>. These have increasing levels of
     aggressiveness <emphasis>and have no influence on your browsing unless
     you select them explicitly in the editor</emphasis>. It is not recommend
     to edit this file.
    </para>
   </listitem> 
  </itemizedlist>
 </para> 

<para>
 The list of actions files to be used are defined in the main configuration 
 file, and are processed in the order they are defined. The content of these
 can all be viewed and edited from <ulink
 url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status</ulink>.
</para>

<para>
 An actions file typically has multiple sections. If you want to use
 <quote>aliases</quote> in an actions file, you have to place the (optional)
 <link linkend="aliases">alias section</link> at the top of that file.
 Then comes the default set of rules which will apply universally to all
 sites and pages (be <emphasis>very careful</emphasis> with using such a
 universal set in <filename>user.action</filename> or any other actions file after 
 <filename>default.action</filename>, because it will override the result
 from consulting any previous file). And then below that,
 exceptions to the defined universal policies. You can regard
 <filename>user.action</filename> as an appendix to <filename>default.action</filename>,
 with the advantage that is a separate file, which makes preserving your
 personal settings across <application>Privoxy</application> upgrades easier.
</para>

<para> 
 Actions can be used to block anything you want, including ads, banners, or
 just some obnoxious URL that you would rather not see. Cookies can be accepted
 or rejected, or accepted only during the current browser session (i.e. not
 written to disk), content can be modified, JavaScripts tamed, user-tracking
 fooled, and much more. See below for a <link linkend="actions">complete list
 of actions</link>.
</para>

<!--   ~~~~~       New section      ~~~~~     -->
<sect2>
<title>Finding the Right Mix</title>
<para>
 Note that some <link linkend="actions">actions</link>, like cookie suppression
 or script disabling, may render some sites unusable that rely on these
 techniques to work properly. Finding the right mix of actions is not always easy and
 certainly a matter of personal taste. In general, it can be said that the more
 <quote>aggressive</quote> your default settings (in the top section of the
 actions file) are, the more exceptions for <quote>trusted</quote> sites you
 will have to make later. If, for example, you want to kill popup windows per
 default, you'll have to make exceptions from that rule for sites that you
 regularly use and that require popups for actually useful content, like maybe
 your bank, favorite shop, or newspaper.
</para>

<para>
 We have tried to provide you with reasonable rules to start from in the
 distribution actions files. But there is no general rule of thumb on these
 things. There just are too many variables, and sites are constantly changing.
 Sooner or later you will want to change the rules (and read this chapter again :).
</para>
</sect2>

<!--   ~~~~~       New section      ~~~~~     -->
<sect2>
<title>How to Edit</title>
<para>
 The easiest way to edit the actions files is with a browser by
 using our browser-based editor, which can be reached from <ulink
 url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status</ulink>.
 The editor allows both fine-grained control over every single feature on a
 per-URL basis, and easy choosing from wholesale sets of defaults like
 <quote>Cautious</quote>, <quote>Medium</quote> or <quote>Radical</quote>.
 Warning: the <quote>Radical</quote> setting is not only more aggressive, 
 but includes settings that are fun and subversive, and which some may find of 
 dubious merit!
</para>

<para>
 If you prefer plain text editing to GUIs, you can of course also directly edit the
 the actions files. Look at <filename>default.action</filename> which is richly
 commented.
</para>
</sect2>


<sect2 id="actions-apply">
<title>How Actions are Applied to URLs</title>
<para>
 Actions files are divided into sections. There are special sections,
 like the <quote><link linkend="aliases">alias</link></quote> sections which will
 be discussed later. For now let's concentrate on regular sections: They have a
 heading line (often split up to multiple lines for readability) which consist
 of a list of actions, separated by whitespace and enclosed in curly braces.
 Below that, there is a list of URL patterns, each on a separate line.
</para>

<para>
 To determine which actions apply to a request, the URL of the request is
 compared to all patterns in each action file file. Every time it matches, the list of
 applicable actions for the URL is incrementally updated, using the heading
 of the section in which the pattern is located. If multiple matches for
 the same URL set the same action differently, the last match wins. If not, 
 the effects are aggregated. E.g. a URL might match a regular section with 
 a heading line of <literal>{ 
 +<link linkend="handle-as-image">handle-as-image</link> }</literal>,
 then later another one with just <literal>{
 +<link linkend="block">block</link> }</literal>, resulting
 in <emphasis>both</emphasis> actions to apply.
</para>

<para>
 You can trace this process for any given URL by visiting <ulink
 url="http://config.privoxy.org/show-url-info">http://config.privoxy.org/show-url-info</ulink>.
</para>

<para>
 More detail on this is provided in the Appendix, <link linkend="ACTIONSANAT">
 Anatomy of an Action</link>.
</para>
</sect2>

<!--   ~~~~~       New section      ~~~~~     -->
<sect2 id="af-patterns">
<title>Patterns</title>
<para> 
 As mentioned, <application>Privoxy</application> uses <quote>patterns</quote>
 to determine what actions might apply to which sites and pages your browser 
 attempts to access. These <quote>patterns</quote> use wild card type 
 <emphasis>pattern</emphasis> matching to achieve a high degree of 
 flexibility. This allows one expression to be expanded and potentially match
 against many similar patterns.
</para>
 
<para>
 Generally, a <application>Privoxy</application> pattern has the form
 <literal>&lt;domain&gt;/&lt;path&gt;</literal>, where both the
 <literal>&lt;domain&gt;</literal> and <literal>&lt;path&gt;</literal> are
 optional. (This is why the special <literal>/</literal> pattern matches all
 URLs). Note that the protocol portion of the URL pattern (e.g.
 <literal>http://</literal>) should <emphasis>not</emphasis> be included in
 the pattern. This is assumed already!
</para>

<variablelist>
 <varlistentry>
  <term><literal>www.example.com/</literal></term>
  <listitem>
   <para>
    is a domain-only pattern and will match any request to <literal>www.example.com</literal>,
    regardless of which document on that server is requested.
   </para>
  </listitem>
 </varlistentry>
 <varlistentry>
  <term><literal>www.example.com</literal></term>
  <listitem>
   <para>
    means exactly the same. For domain-only patterns, the trailing <literal>/</literal> may
    be omitted.
   </para>
  </listitem>
 </varlistentry>
 <varlistentry>
  <term><literal>www.example.com/index.html</literal></term>
  <listitem>
   <para>
    matches only the single document <literal>/index.html</literal>
    on <literal>www.example.com</literal>.
   </para>
  </listitem>
 </varlistentry>
 <varlistentry>
  <term><literal>/index.html</literal></term>
  <listitem>
   <para>
    matches the document <literal>/index.html</literal>, regardless of the domain,
    i.e. on <emphasis>any</emphasis> web server.
   </para>
  </listitem>
 </varlistentry>
 <varlistentry>
  <term><literal>index.html</literal></term>
  <listitem>
   <para>
    matches nothing, since it would be  interpreted as a domain name and
    there is no top-level domain called <literal>.html</literal>.
   </para>
  </listitem>
 </varlistentry>
</variablelist>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3><title>The Domain Pattern</title>

<para>
 The matching of the domain part offers some flexible options: if the
 domain starts or ends with a dot, it becomes unanchored at that end. 
 For example:
</para>

<variablelist>
 <varlistentry>
  <term><literal>.example.com</literal></term>
  <listitem>
   <para>
    matches any domain that <emphasis>ENDS</emphasis> in
    <literal>.example.com</literal> (e.g. <literal>www.example.com</literal>)
   </para>
  </listitem>
 </varlistentry>
 <varlistentry>
  <term><literal>www.</literal></term>
  <listitem>
   <para>
    matches any domain that <emphasis>STARTS</emphasis> with
    <literal>www.</literal>
   </para>
  </listitem>
 </varlistentry>
 <varlistentry>
  <term><literal>.example.</literal></term>
  <listitem>
   <para>
    matches any domain that <emphasis>CONTAINS</emphasis> <literal>.example.</literal>
    (Correctly speaking: It matches any FQDN that contains <literal>example</literal> as a domain.)
   </para>
  </listitem>
 </varlistentry>
</variablelist>

<para>
 Additionally, there are wild-cards that you can use in the domain names
 themselves. They work pretty similar to shell wild-cards: <quote>*</quote>
 stands for zero or more arbitrary characters, <quote>?</quote> stands for
 any single character, you can define character classes in square
 brackets and all of that can be freely mixed:
</para>

<variablelist>
 <varlistentry>
  <term><literal>ad*.example.com</literal></term>
  <listitem>
   <para>
    matches <quote>adserver.example.com</quote>, 
    <quote>ads.example.com</quote>, etc but not <quote>sfads.example.com</quote>
   </para>
  </listitem>
 </varlistentry>
 <varlistentry>
  <term><literal>*ad*.example.com</literal></term>
  <listitem>
   <para>
    matches all of the above, and then some.
   </para>
  </listitem>
 </varlistentry>
 <varlistentry>
  <term><literal>.?pix.com</literal></term>
  <listitem>
   <para>
    matches <literal>www.ipix.com</literal>,
    <literal>pictures.epix.com</literal>, <literal>a.b.c.d.e.upix.com</literal> etc. 
   </para>
  </listitem>
 </varlistentry>
 <varlistentry>
  <term><literal>www[1-9a-ez].example.c*</literal></term>
  <listitem>
   <para>
     matches <literal>www1.example.com</literal>, 
     <literal>www4.example.cc</literal>, <literal>wwwd.example.cy</literal>, 
     <literal>wwwz.example.com</literal> etc., but <emphasis>not</emphasis> 
     <literal>wwww.example.com</literal>.
   </para>
  </listitem>
 </varlistentry>
</variablelist>

</sect3>

<!--  ~  End section  ~  -->


<!--   ~~~~~       New section      ~~~~~     -->
<sect3><title>The Path Pattern</title>

<para>
 <application>Privoxy</application> uses Perl compatible regular expressions
 (through the <ulink url="http://www.pcre.org/">PCRE</ulink> library) for
 matching the path.
</para>

<para>
 There is an <link linkend="regex">Appendix</link> with a brief quick-start into regular
 expressions, and full (very technical) documentation on PCRE regex syntax is available on-line
 at <ulink url="http://www.pcre.org/man.txt">http://www.pcre.org/man.txt</ulink>.
 You might also find the Perl man page on regular expressions (<literal>man perlre</literal>)
 useful, which is available on-line at <ulink
 url="http://www.perldoc.com/perl5.6/pod/perlre.html">http://www.perldoc.com/perl5.6/pod/perlre.html</ulink>.
</para>

<para>
 Note that the path pattern is automatically left-anchored at the <quote>/</quote>,
 i.e. it matches as if it would start with a <quote>^</quote> (regular expression speak 
 for the beginning of a line).
</para>

<para>
 Please also note that matching in the path is <emphasis>CASE INSENSITIVE</emphasis>
 by default, but you can switch to case sensitive at any point in the pattern by using the 
 <quote>(?-i)</quote> switch: <literal>www.example.com/(?-i)PaTtErN.*</literal> will match
 only documents whose path starts with <literal>PaTtErN</literal> in
 <emphasis>exactly</emphasis> this capitalization.
</para>
</sect3>

</sect2>

<!--  ~  End section  ~  -->


<!--   ~~~~~       New section      ~~~~~     -->

<sect2 id="actions">
<title>Actions</title>
<para>
 All actions are disabled by default, until they are explicitly enabled
 somewhere in an actions file. Actions are turned on if preceded with a
 <quote>+</quote>, and turned off if preceded with a <quote>-</quote>. So a
 <literal>+action</literal> means <quote>do that action</quote>, e.g.
 <literal>+block</literal> means <quote>please block URLs that match the
 following patterns</quote>, and <literal>-block</literal> means <quote>don't
 block URLs that match the following patterns, even if <literal>+block</literal>
 previously applied.</quote>

</para>

<para> 
 Again, actions are invoked by placing them on a line, enclosed in curly braces and
 separated by whitespace, like in 
 <literal>{+some-action -some-other-action{some-parameter}}</literal>,
 followed by a list of URL patterns, one per line, to which they apply.
 Together, the actions line and the following pattern lines make up a section
 of the actions file. 
</para>

<para> 
 There are three classes of actions:
</para>

<para>
 <itemizedlist>
 <listitem>
  <para>  
   Boolean, i.e the action can only be <quote>enabled</quote> or
   <quote>disabled</quote>. Syntax:
  </para>
  <para>
   <screen>
  +<replaceable class="function">name</replaceable>        # enable action <replaceable class="parameter">name</replaceable>
  -<replaceable class="function">name</replaceable>        # disable action <replaceable class="parameter">name</replaceable></screen>
  </para>
  <para>  
   Example: <literal>+block</literal>
  </para>
 </listitem>


 <listitem>
  <para>  
   Parameterized, where some value is required in order to enable this type of action.
   Syntax:
  </para>
  <para>
   <screen>
  +<replaceable class="function">name</replaceable>{<replaceable class="parameter">param</replaceable>}  # enable action and set parameter to <replaceable class="parameter">param</replaceable>,
               # overwriting parameter from previous match if necessary
  -<replaceable class="function">name</replaceable>         # disable action. The parameter can be omitted</screen>
  </para>
  <para>
   Note that if the URL matches multiple positive forms of a parameterized action,
   the last match wins, i.e. the params from earlier matches are simply ignored.
  </para>
  <para>  
   Example: <literal>+hide-user-agent{ Mozilla 1.0 }</literal>
  </para>
 </listitem>
 
 <listitem>
  <para>  
   Multi-value. These look exactly like parameterized actions,
   but they behave differently: If the action applies multiple times to the
   same URL, but with different parameters, <emphasis>all</emphasis> the parameters
   from <emphasis>all</emphasis> matches are remembered. This is used for actions
   that can be executed for the same request repeatedly, like adding multiple
   headers, or filtering through multiple filters. Syntax:
  </para>
  <para>
   <screen>
  +<replaceable class="function">name</replaceable>{<replaceable class="parameter">param</replaceable>}   # enable action and add <replaceable class="parameter">param</replaceable> to the list of parameters
  -<replaceable class="function">name</replaceable>{<replaceable class="parameter">param</replaceable>}   # remove the parameter <replaceable class="parameter">param</replaceable> from the list of parameters
                # If it was the last one left, disable the action.
  <replaceable class="parameter">-name</replaceable>          # disable this action completely and remove all parameters from the list</screen>
  </para>
  <para>  
   Examples: <literal>+add-header{X-Fun-Header: Some text}</literal> and
   <literal>+filter{html-annoyances}</literal>
  </para>
 </listitem>

 </itemizedlist>
</para>

<para>
 If nothing is specified in any actions file, no <quote>actions</quote> are
 taken. So in this case <application>Privoxy</application> would just be a
 normal, non-blocking, non-anonymizing proxy. You must specifically enable the
 privacy and blocking features you need (although the provided default actions
 files will give a good starting point).
</para>

<para>
 Later defined actions always over-ride earlier ones.  So exceptions 
 to any rules you make, should come in the latter part of the file (or 
 in a file that is processed later when using multiple actions files). For
 multi-valued actions, the actions are applied in the order they are specified.
 Actions files are processed in the order they are defined in
 <filename>config</filename> (the default installation has three actions
 files). It also quite possible for any given URL pattern to match more than
 one pattern and thus more than one set of actions!
</para>

<!-- start actions listing -->
<para>
 The list of valid <application>Privoxy</application> actions are:
</para>


<!-- ********************************************************** -->
<!-- Please note the below defined actions use id's that are    -->
<!-- probably linked from other places, so please don't change. -->
<!--                                                            -->
<!-- ********************************************************** -->


<!--   ~~~~~       New section      ~~~~~     -->

<sect3 renderas="sect4" id="add-header">
<title>add-header</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>Confuse log analysis, custom applications</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Sends a user defined HTTP header to the web server.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- boolean, parameterized, Multi-value -->
  <listitem>
   <para>Multi-value.</para>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    Any string value is possible. Validity of the defined HTTP headers is not checked.
    It is recommended that you use the <quote><literal>X-</literal></quote> prefix
    for custom headers.
   </para>
  </listitem>
 </varlistentry>
 
<varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    This action may be specified multiple times, in order to define multiple 
    headers. This is rarely needed for the typical user. If you don't know what 
    <quote>HTTP headers</quote> are, you definitely don't need to worry about this 
    one.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage:</term>
  <listitem>
    <para>
     <screen>+add-header{X-User-Tracking: sucks}</screen>
   </para>
  </listitem>
 </varlistentry>
</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="block">
<title>block</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>Block ads or other obnoxious content</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Requests for URLs to which this action applies are blocked, i.e. the requests are not
    forwarded to the remote server, but answered locally with a substitute page or image,
    as determined by the <literal><link linkend="handle-as-image">handle-as-image</link></literal>
    and <literal><link linkend="set-image-blocker">set-image-blocker</link></literal> actions.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- boolean, parameterized, Multi-value -->
  <listitem>
   <para>Boolean.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>N/A</para>
  </listitem>
 </varlistentry>
 
<varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    <application>Privoxy</application> sends a special <quote>BLOCKED</quote> page
    for requests to blocked pages. This page contains links to find out why the request
    was blocked, and a click-through to the blocked content (the latter only if compiled with the
    force feature enabled). The <quote>BLOCKED</quote> page adapts to the available
    screen space -- it displays full-blown if space allows, or miniaturized and text-only
    if loaded into a small frame or window. If you are using <application>Privoxy</application>
    right now, you can take a look at the 
    <ulink url="http://ads.bannerserver.example.com/nasty-ads/sponsor.html"><quote>BLOCKED</quote>
    page</ulink>.
   </para>
   <para> 
    A very important exception occurs if <emphasis>both</emphasis> 
    <literal>block</literal> and <literal><link linkend="handle-as-image">handle-as-image</link></literal>,
    apply to the same request: it will then be replaced by an image. If 
    <literal><link linkend="set-image-blocker">set-image-blocker</link></literal>
    (see below) also applies, the type of image will be determined by its parameter,
    if not, the standard checkerboard pattern is sent.
   </para>
   <para>
    It is important to understand this process, in order 
    to understand how <application>Privoxy</application> deals with 
    ads and other unwanted content.
   </para>
   <para>
    The <literal><link linkend="filter">filter</link></literal>
    action can perform a very similar task, by <quote>blocking</quote>
    banner images and other content through rewriting the relevant URLs in the
    document's HTML source, so they don't get requested in the first place.
    Note that this is a totally different technique, and it's easy to confuse the two.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage (section):</term>
  <listitem>
    <para>
     <screen>{+block}      # Block and replace with "blocked" page
.nasty-stuff.example.com

{+block +handle-as-image} # Block and replace with image
.ad.doubleclick.net
.ads.r.us</screen>
    </para>
  </listitem>
 </varlistentry>


</variablelist>
</sect3>

<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="crunch-incoming-cookies">
<title>crunch-incoming-cookies</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>
    Prevent the web server from setting any cookies on your system
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Deletes any <quote>Set-Cookie:</quote> HTTP headers from server replies.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- Boolean, Parameterized, Multi-value -->
  <listitem>
   <para>Boolean.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    N/A
   </para>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    This action is only concerned with <emphasis>incoming</emphasis> cookies. For
    <emphasis>outgoing</emphasis> cookies, use
    <literal><link linkend="crunch-outgoing-cookies">crunch-outgoing-cookies</link></literal>.
    Use <emphasis>both</emphasis> to disable cookies completely.
   </para>
   <para>
    It makes <emphasis>no sense at all</emphasis> to use this action in conjunction
    with the <literal><link linkend="session-cookies-only">session-cookies-only</link></literal> action,
    since it would prevent the session cookies from being set. See also 
    <literal><link linkend="filter-content-cookies">filter-content-cookies</link></literal>.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage:</term>
  <listitem>
   <para>
    <screen>+crunch-incoming-cookies</screen>
   </para>
  </listitem>
 </varlistentry>
</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="crunch-outgoing-cookies">
<title>crunch-outgoing-cookies</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>
    Prevent the web server from reading any cookies from your system
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Deletes any <quote>Cookie:</quote> HTTP headers from client requests.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- Boolean, Parameterized, Multi-value -->
  <listitem>
   <para>Boolean.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    N/A
   </para>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    This action is only concerned with <emphasis>outgoing</emphasis> cookies. For
    <emphasis>incoming</emphasis> cookies, use
    <literal><link linkend="crunch-incoming-cookies">crunch-incoming-cookies</link></literal>.
    Use <emphasis>both</emphasis> to disable cookies completely.
   </para>
   <para>
    It makes <emphasis>no sense at all</emphasis> to use this action in conjunction
    with the <literal><link linkend="session-cookies-only">session-cookies-only</link></literal> action,
    since it would prevent the session cookies from being read.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage:</term>
  <listitem>
   <para>
    <screen>+crunch-outgoing-cookies</screen>
   </para>
  </listitem>
 </varlistentry>

</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="deanimate-gifs">
<title>deanimate-gifs</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>Stop those annoying, distracting animated GIF images.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    De-animate GIF animations, i.e. reduce them to their first or last image.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- boolean, parameterized, Multi-value -->
  <listitem>
   <para>Parameterized.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    <quote>last</quote> or <quote>first</quote>
   </para>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    This will also shrink the images considerably (in bytes, not pixels!). If
    the option <quote>first</quote> is given, the first frame of the animation
    is used as the replacement. If <quote>last</quote> is given, the last
    frame of the animation is used instead, which probably makes more sense for
    most banner animations, but also has the risk of not showing the entire
    last frame (if it is only a delta to an earlier frame).
   </para>
   <para>
    You can safely use this action with patterns that will also match non-GIF
    objects, because no attempt will be made at anything that doesn't look like
    a GIF.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage:</term>
  <listitem>
    <para>
      <screen>+deanimate-gifs{last}</screen>
    </para>
  </listitem>
 </varlistentry>
</variablelist>
</sect3>

<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="downgrade-http-version">
<title>downgrade-http-version</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>Work around (very rare) problems with HTTP/1.1</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Downgrades HTTP/1.1 client requests and server replies to HTTP/1.0.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- boolean, parameterized, Multi-value -->
  <listitem>
   <para>Boolean.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    N/A
   </para>
  </listitem>
 </varlistentry>
 
<varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    This is a left-over from the time when <application>Privoxy</application>
    didn't support important HTTP/1.1 features well. It is left here for the
    unlikely case that you experience HTTP/1.1 related problems with some server
    out there. Not all (optional) HTTP/1.1 features are supported yet, so there
    is a chance you might need this action.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage (section):</term>
  <listitem>
    <para>
     <screen>{+downgrade-http-version}
problem-host.example.com</screen>
    </para>
  </listitem>
 </varlistentry>

</variablelist>
</sect3>

<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="fast-redirects">
<title>fast-redirects</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>Fool some click-tracking scripts and speed up indirect links</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Cut off all but the last valid URL from requests.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- boolean, parameterized, Multi-value -->
  <listitem>
   <para>Boolean.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    N/A
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>  
    Many sites, like yahoo.com, don't just link to other sites. Instead, they
    will link to some script on their own servers, giving the destination as a
    parameter, which will then redirect you to the final target. URLs
    resulting from this scheme typically look like:
    <emphasis>http://some.place/click-tracker.cgi?target=http://some.where.else</emphasis>.
  </para>
   <para>
    Sometimes, there are even multiple consecutive redirects encoded in the
    URL. These redirections via scripts make your web browsing more traceable,
    since the server from which you follow such a link can see where you go
    to. Apart from that, valuable bandwidth and time is wasted, while your
    browser ask the server for one redirect after the other. Plus, it feeds
    the advertisers.
   </para>
   <para>
    This feature is currently not very smart and is scheduled for improvement.
    It is likely to break some sites. You should expect to need possibly 
    many exceptions to this action, if it is enabled by default in
    <filename>default.action</filename>. Some sites just don't work without 
    it.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage:</term>
  <listitem>
    <para>
     <screen>{+fast-redirects}</screen>
    </para>
  </listitem>
 </varlistentry>

</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="filter">
<title>filter</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>Get rid of HTML and JavaScript annoyances, banner advertisements (by size), do fun text replacements, etc.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Text documents, including HTML and JavaScript, to which this action
    applies, are filtered on-the-fly through the specified regular expression
    based substitutions.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- boolean, parameterized, Multi-value -->
  <listitem>
   <para>Parameterized.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    The name of a filter, as defined in the <link linkend="filter-file">filter file</link>
    (typically <filename>default.filter</filename>, set by the
    <literal><link linkend="filterfile">filterfile</link></literal>
    option in the <link linkend="config">config file</link>). Filtering 
    can be completely disabled without the use of parameters.
   </para>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    For your convenience, there are a number of pre-defined filters available 
    in the distribution filter file that you can use. See the examples below for
    a list.
   </para>
   <para>
    This is potentially a very powerful feature!  But <quote>rolling your own</quote>
    filters requires a knowledge of regular expressions and HTML.
   </para>
   <para>
    Filtering requires buffering the page content, which may appear to
    slow down page rendering since nothing is displayed until all content has
    passed the filters. (It does not really take longer, but seems that way
    since the page is not incrementally displayed.) This effect will be more
    noticeable on slower connections.
   </para>
   <para>
    The amount of data that can be filtered is limited to the 
    <literal><link linkend="buffer-limit">buffer-limit</link></literal>
    option in the main <link linkend="config">config file</link>. The 
    default is 4096 KB (4 Megs). Once this limit is exceeded, the buffered
    data, and all pending data, is passed through unfiltered. 
   </para>
   <para>
    Inappropriate MIME types, such as zipped files, are not filtered at all.
    Encrypted SSL data (from HTTPS servers) cannot be filtered either since
    this would violate the integrity of the secure transaction.
   </para>
   <para>
    At this time, <application>Privoxy</application> cannot (yet!) uncompress compressed
    documents. If you want filtering to work on all documents, even those that
    would normally be sent compressed, use the
    <literal><link linkend="prevent-compression">prevent-compression</link></literal>
    action in conjunction with <literal>filter</literal>.
   </para>
   <para>
    Filtering can achieve some of the same effects as the 
    <literal><link linkend="block">block</link></literal>
    action, i.e. it can be used to block ads and banners. But the mechanism 
    works quite differently. One effective use, is to block ad banners 
    based on their size (see below), since many of these seem to be somewhat 
    standardized.
   </para>
   <para>
    <link linkend="contact">Feedback</link> with suggestions for new or
    improved filters is particularly welcome!
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage (with filters from the distribution <filename>default.filter</filename> file):</term>
  <listitem>
   <para>
    <anchor id="filter-html-annoyances">
    <screen>+filter{html-annoyances}     # Get rid of particularly annoying HTML abuse.</screen>
   </para>
   <para>
    <anchor id="filter-js-annoyances">
    <screen>+filter{js-annoyances}       # Get rid of particularly annoying JavaScript abuse</screen>
   </para>
   <para>
    <anchor id="filter-banners-by-size">
    <screen>+filter{banners-by-size}     # Kill banners based on their size for this page (<emphasis>very</emphasis> efficient!)</screen>
   </para>
   <para>
    <anchor id="filter-banners-by-link">
    <screen>+filter{banners-by-link}     # Kill banners based on the link they are contained in (experimental)</screen>
   </para>
   <para>
    <anchor id="filter-img-reorder">
    <screen>+filter{img-reorder}         # Reorder attributes in &lt;img&gt; tags to make the banners-by-* filters more effective</screen>
   </para>
   <para>
    <anchor id="filter-content-cookies">
    <screen>+filter{content-cookies}     # Kill cookies that come sneaking in the HTML or JS content</screen>
   </para>
   <para>
    <anchor id="filter-popups">
    <screen>+filter{popups}              # Kill all popups in JS and HTML</screen>
   </para>
   <para>
    <anchor id="filter-webbugs">
    <screen>+filter{webbugs}             # Squish WebBugs (1x1 invisible GIFs used for user tracking)</screen>
   </para>
   <para>
    <anchor id="filter-fun">
    <screen>+filter{fun}                 # Text replacements for subversive browsing fun!</screen>
   </para>
   <para>
    <anchor id="filter-frameset-borders">
    <screen>+filter{frameset-borders}    # Give frames a border and make them resizeable</screen> 
   </para>
   <para>
    <anchor id="filter-refresh-tags">
    <screen>+filter{refresh-tags}        # Kill automatic refresh tags (for dial-on-demand setups)</screen>
   </para>
   <para>
    <anchor id="filter-nimda">
    <screen>+filter{nimda}               # Remove Nimda (virus) code.</screen>
   </para>
   <para>
    <anchor id="filter-shockwave-flash">
    <screen>+filter{shockwave-flash}     # Kill embedded Shockwave Flash objects</screen>
   </para>
   <para>
    <anchor id="filter-crude-parental">
    <screen>+filter{crude-parental}      # Kill all web pages that contain the words "sex" or "warez"</screen>
   </para>
   <para>
    <anchor id="filter-js-events">
    <screen>+filter{js-events}           # Kill all JS event bindings (<emphasis>Radically destructive!</emphasis> Only for extra nasty sites) </screen>
   </para>
   <para>
    <anchor id="filter-demoronizer">
    <screen>+filter{demoronizer}         # Fix non-standard MS font extensions for non-MS browsers</screen>
   </para>
  </listitem>
 </varlistentry>
</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="handle-as-image">
<title>handle-as-image</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>Mark URLs as belonging to images (so they'll be replaced by images <emphasis>if they get blocked</emphasis>)</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    This action alone doesn't do anything noticeable. It just marks URLs as images.
    If the <literal><link linkend="block">block</link></literal> action <emphasis>also applies</emphasis>,
    the presence or absence of this mark decides whether an HTML <quote>blocked</quote>
    page, or a replacement image (as determined by the <literal><link
    linkend="set-image-blocker">set-image-blocker</link></literal> action) will be sent to the
    client as a substitute for the blocked content.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- Boolean, Parameterized, Multi-value -->
  <listitem>
   <para>Boolean.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    N/A
   </para>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    The below generic example section is actually part of <filename>default.action</filename>.
    It marks all URLs with well-known image file name extensions as images and should
    be left intact. 
   </para>
   <para>
    Users will probably only want to use the handle-as-image action in conjunction with
    <literal><link linkend="block">block</link></literal>, to block sources of banners, whose URLs don't
    reflect the file type, like in the second example section.
   </para>
   <para>
    Note that you cannot treat HTML pages as images in most cases. For instance, (in-line) ad
    frames require an HTML page to be sent, or they won't display properly.
    Forcing <literal>handle-as-image</literal> in this situation will not replace the
    ad frame with an image, but lead to error messages.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage (sections):</term>
  <listitem>
   <para>
     <screen># Generic image extensions:
#
{+handle-as-image}
/.*\.(gif|jpg|jpeg|png|bmp|ico)$

# These don't look like images, but they're banners and should be
# blocked as images:
#
{+block +handle-as-image}
some.nasty-banner-server.com/junk.cgi?output=trash

# Banner source! Who cares if they also have non-image content?
ad.doubleclick.net 
</screen>
   </para>
  </listitem>
 </varlistentry>
</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="hide-forwarded-for-headers">
<title>hide-forwarded-for-headers</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>Improve privacy by hiding the true source of the request</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Deletes any existing <quote>X-Forwarded-for:</quote> HTTP header from client requests,
    and prevents adding a new one.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- Boolean, Parameterized, Multi-value -->
  <listitem>
   <para>Boolean.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    N/A
   </para>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    It is fairly safe to leave this on.
   </para>
   <para>
    This action is scheduled for improvement: It should be able to generate forged 
    <quote>X-Forwarded-for:</quote> headers using random IP addresses from a specified network,
    to make successive requests from the same client look like requests from a pool of different
    users sharing the same proxy.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage:</term>
  <listitem>
    <para>
     <screen>+hide-forwarded-for-headers</screen>
   </para>
  </listitem>
 </varlistentry>
</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="hide-from-header">
<title>hide-from-header</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>Keep your (old and ill) browser from telling web servers your email address</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Deletes any existing <quote>From:</quote> HTTP header, or replaces it with the
    specified string.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- Boolean, Parameterized, Multi-value -->
  <listitem>
   <para>Parameterized.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    Keyword: <quote>block</quote>, or any user defined value.
   </para>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    The keyword <quote>block</quote> will completely remove the header 
    (not to be confused with the <literal><link linkend="block">block</link></literal>
    action).
   </para>
   <para>
    Alternately, you can specify any value you prefer to be sent to the web
    server. If you do, it is a matter of fairness not to use any address that
    is actually used by a real person.
   </para>
   <para>
    This action is rarely needed, as modern web browsers don't send
    <quote>From:</quote> headers anymore.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage:</term>
  <listitem>
   <para>
    <screen>+hide-from-header{block}</screen> or
    <screen>+hide-from-header{spam-me-senseless@sittingduck.example.com}</screen>
   </para>
  </listitem>
 </varlistentry>
</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="hide-referrer">
<title>hide-referrer</title>
<anchor id="hide-referer">
<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>Conceal which link you followed to get to a particular site</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Deletes the <quote>Referer:</quote> (sic) HTTP header from the client request,
    or replaces it with a forged one.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- Boolean, Parameterized, Multi-value -->
  <listitem>
   <para>Parameterized.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <itemizedlist>
    <listitem>
     <para><quote>block</quote> to delete the header completely.</para>
    </listitem>
    <listitem>
     <para><quote>forge</quote> to pretend to be coming from the homepage of the server we are talking to.</para>
    </listitem>
    <listitem>
     <para>Any other string to set a user defined referrer.</para>
    </listitem>
   </itemizedlist>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    <quote>forge</quote> is the preferred option here, since some servers will
    not send images back otherwise, in an attempt to prevent their valuable
    content from being embedded elsewhere (and hence, without being surrounded
    by <emphasis>their</emphasis> banners).
   </para>
  <para>  
   <literal>hide-referer</literal> is an alternate spelling of
   <literal>hide-referrer</literal> and the two can be can be freely
   substituted with each other. (<quote>referrer</quote> is the
   correct English spelling, however the HTTP specification has a bug - it
   requires it to be spelled as <quote>referer</quote>.) 
  </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage:</term>
  <listitem>
   <para>
     <screen>+hide-referrer{forge}</screen> or
     <screen>+hide-referrer{http://www.yahoo.com/}</screen>
   </para>
  </listitem>
 </varlistentry>
</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="hide-user-agent">
<title>hide-user-agent</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>Conceal your type of browser and client operating system</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Replaces the value of the <quote>User-Agent:</quote> HTTP header
    in client requests with the specified value.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- Boolean, Parameterized, Multi-value -->
  <listitem>
   <para>Parameterized.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    Any user-defined string.
   </para>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <warning> 
    <para>
     This breaks many web sites that depend on looking at this header in order
     to customize their content for different browsers (which, by the
     way, is <emphasis>NOT</emphasis> a <ulink
     url="http://www.javascriptkit.com/javaindex.shtml">smart way to do
     that</ulink>!).
    </para>
   </warning>
   <para>
    Using this action in multi-user setups or wherever different types of
    browsers will access the same <application>Privoxy</application> is
    <emphasis>not recommended</emphasis>. In single-user, single-browser
    setups, you might use it to delete your OS version information from
    the headers, because it is an invitation to exploit known bugs for your
    OS. It is also occasionally useful to forge this in order to access 
    sites that won't let you in otherwise (though there may be a good 
    reason in some cases). Example of this: some MSN sites will not 
    let <application>Mozilla</application> enter, yet forging to a 
    <application>Netscape 6.1</application> user-agent works just fine.
    (Must be just a silly MS goof, I'm sure :-).
   </para>
   <para>
    This action is scheduled for improvement.
   </para>
   </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage:</term>
  <listitem>
   <para>
     <screen>+hide-user-agent{Netscape 6.1 (X11; I; Linux 2.4.18 i686)}</screen>
   </para>
  </listitem>
 </varlistentry>
</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="kill-popups">
<title>kill-popups<anchor id="kill-popup"></title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>Eliminate those annoying pop-up windows</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    While loading the document, replace JavaScript code that opens
    pop-up windows with (syntactically neutral) dummy code on the fly.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- Boolean, Parameterized, Multi-value -->
  <listitem>
   <para>Boolean.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    N/A
   </para>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    This action is easily confused with the built-in, hardwired <literal><link linkend="filter">filter</link></literal>
    action, but there are important differences: For <literal>kill-popups</literal>,
    the document need not be buffered, so it can be incrementally rendered while
    downloading. But <literal>kill-popups</literal> doesn't catch as many pop-ups as
    <literal><link
    linkend="filter">filter</link>{<replaceable>popups</replaceable>}</literal>
    does. 
   </para>
   <para>
    Think of it as a fast and efficient replacement for a filter that you
    can use if you don't want any filtering at all. Note that it doesn't make
    sense to combine it with any <literal><link linkend="filter">filter</link></literal> action,
    since as soon as one <literal><link linkend="filter">filter</link></literal> applies,
    the whole document needs to be buffered anyway, which destroys the advantage of
    the <literal>kill-popups</literal> action over its filter equivalent.
   </para>
   <para>
    Killing all pop-ups is a dangerous business. Many shops and banks rely on
    pop-ups to display forms, shopping carts etc, and killing only the unwanted pop-ups 
    would require artificial intelligence in <application>Privoxy</application>.
    If the only kind of pop-ups that you want to kill are exit consoles (those
    <emphasis>really nasty</emphasis> windows that appear when you close an other
    one), you might want to use
    <literal><link
    linkend="filter">filter</link>{<replaceable>js-annoyances</replaceable>}</literal>
    instead. 
   </para>

  <!-- 
   <para>
    An alternate spelling is <literal>+kill-popup</literal>, which is 
    interchangeable.
   </para>
 --> 
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage:</term>
  <listitem>
   <para><screen>+kill-popups</screen></para>
  </listitem>
 </varlistentry>
</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="limit-connect">
<title>limit-connect</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>Prevent abuse of <application>Privoxy</application> as a TCP proxy relay</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Specifies to which ports HTTP CONNECT requests are allowable.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- Boolean, Parameterized, Multi-value -->
  <listitem>
   <para>Parameterized.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    A comma-separated list of ports or port ranges (the latter using dashes, with the minimum
    defaulting to 0 and the maximum to 65K).
   </para>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    By default, i.e. if no <literal>limit-connect</literal> action applies,
    <application>Privoxy</application> only allows HTTP CONNECT
    requests to port 443 (the standard, secure HTTPS port). Use 
    <literal>limit-connect</literal> if more fine-grained control is desired
    for some or all destinations.
   </para>
   <para>
    The CONNECT methods exists in HTTP to allow access to secure websites
    (<quote>https://</quote> URLs) through proxies. It works very simply:
    the proxy connects to the server on the specified port, and then
    short-circuits its connections to the client and to the remote server.
    This can be a big security hole, since CONNECT-enabled proxies can be
    abused as TCP relays very easily.
  </para>
  <para>
   If you don't know what any of this means, there probably is no reason to 
   change this one, since the default is already very restrictive.
  </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usages:</term>
  <listitem>
   <!-- I had trouble getting the spacing to look right in my browser -->
   <!-- I probably have the wrong font setup, bollocks. -->
   <!-- Apparently the emphasis tag uses a proportional font no matter what -->
    <para>
     <screen>+limit-connect{443}                   # This is the default and need not be specified.
+limit-connect{80,443}                # Ports 80 and 443 are OK.
+limit-connect{-3, 7, 20-100, 500-}   # Ports less than 3, 7, 20 to 100 and above 500 are OK.
+limit-connect{-}                     # All ports are OK (gaping security hole!)</screen>
   </para>
  </listitem>
 </varlistentry>
</variablelist>
</sect3>

<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="prevent-compression">
<title>prevent-compression</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>
    Ensure that servers send the content uncompressed, so it can be
    passed through <literal><link linkend="filter">filter</link></literal>s
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Adds a header to the request that asks for uncompressed transfer.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- Boolean, Parameterized, Multi-value -->
  <listitem>
   <para>Boolean.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    N/A
   </para>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    More and more websites send their content compressed by default, which
    is generally a good idea and saves bandwidth. But for the <literal><link
    linkend="filter">filter</link></literal>, <literal><link linkend="deanimate-gifs">deanimate-gifs</link></literal>
    and <literal><link linkend="kill-popups">kill-popups</link></literal> actions to work,
    <application>Privoxy</application> needs access to the  uncompressed data.
    Unfortunately, <application>Privoxy</application> can't yet(!)  uncompress, filter, and
    re-compress the content on the fly. So if you want to ensure that all websites, including
    those that normally compress, can be filtered, you need to use this action.
   </para>
   <para>
    This will slow down transfers from those websites, though. If you use any of the above-mentioned
    actions, you will typically want to use <literal>prevent-compression</literal> in conjunction
    with them.
   </para>
   <para>
    Note that some (rare) ill-configured sites don't handle requests for uncompressed
    documents correctly (they send an empty document body). If you use <literal>prevent-compression</literal>
    per default, you'll have to add exceptions for those sites. See the example for how to do that.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage (sections):</term>
  <listitem>
   <para>
    <screen># Set default:
#
{+prevent-compression}
/ # Match all sites

# Make exceptions for ill sites:
#
{-prevent-compression}
www.debianhelp.org
www.pclinuxonline.com</screen>
   </para>
  </listitem>
 </varlistentry>

</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="send-vanilla-wafer">
<title>send-vanilla-wafer</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>
    Feed log analysis scripts with useless data.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Sends a cookie with each request stating that you do not accept any copyright
    on cookies sent to you, and asking the site operator not to track you.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- Boolean, Parameterized, Multi-value -->
  <listitem>
   <para>Boolean.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    N/A
   </para>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    The vanilla wafer is a (relatively) unique header and could conceivably be used to track you.
   </para>
   <para>
    This action is rarely used and not enabled in the default configuration.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage:</term>
  <listitem>
   <para>
     <screen>+send-vanilla-wafer</screen>
   </para>
  </listitem>
 </varlistentry>

</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="send-wafer">
<title>send-wafer</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>
    Send custom cookies or feed log analysis scripts with even more useless data.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Sends a custom, user-defined cookie with each request.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- Boolean, Parameterized, Multi-value -->
  <listitem>
   <para>Multi-value.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    A string of the form <quote><replaceable class="option">name</replaceable>=<replaceable
    class="parameter">value</replaceable></quote>.
   </para>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    Being multi-valued, multiple instances of this action can apply to the same request,
    resulting in multiple cookies being sent.
   </para>
   <para>
    This action is rarely used and not enabled in the default configuration.
   </para>
  </listitem>
 </varlistentry>
 <varlistentry>
  <term>Example usage (section):</term>
  <listitem>
   <para>
    <screen>{+send-wafer{UsingPrivoxy=true}}
my-internal-testing-server.void</screen>
   </para>
  </listitem>
 </varlistentry>
</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="session-cookies-only">
<title>session-cookies-only</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>
    Allow only temporary <quote>session</quote> cookies (for the current browser session <emphasis>only</emphasis>).
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
    Deletes the <quote>expires</quote> field from <quote>Set-Cookie:</quote> server headers.
    Most browsers will not store such cookies permanently and forget them in between sessions.
   </para>
  </listitem>
 </varlistentry>

<varlistentry>
  <term>Type:</term>
  <!-- Boolean, Parameterized, Multi-value -->
  <listitem>
   <para>Boolean.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <para>
    N/A
   </para>
  </listitem>
 </varlistentry>
 
 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    This is less strict than <literal><link linkend="crunch-incoming-cookies">crunch-incoming-cookies</link></literal> / 
    <literal><link linkend="crunch-outgoing-cookies">crunch-outgoing-cookies</link></literal> and allows you to browse
    websites that insist or rely on setting cookies, without compromising your privacy too badly.
   </para>
   <para>
    Most browsers will not permanently store cookies that have been processed by
    <literal>session-cookies-only</literal> and will forget about them between sessions.
    This makes profiling cookies useless, but won't break sites which require cookies so
    that you can log in for transactions. This is generally turned on for all 
    sites, and is the recommended setting.
   </para>
   <para>
    It makes <emphasis>no sense at all</emphasis> to use <literal>session-cookies-only</literal>
    together with <literal><link linkend="crunch-incoming-cookies">crunch-incoming-cookies</link></literal> or
    <literal><link linkend="crunch-outgoing-cookies">crunch-outgoing-cookies</link></literal>. If you do, cookies
    will be plainly killed.
   </para>
   <para>
    Note that it is up to the browser how it handles such cookies without an <quote>expires</quote>
    field. If you use an exotic browser, you might want to try it out to be sure.
   </para>
   <para>
    This setting also has no effect on cookies that may have been stored
    previously by the browser before starting <application>Privoxy</application>.
    These would have to be removed manually.
   </para>
   <para>
     <application>Privoxy</application> also uses  
     the <link linkend="filter-content-cookies">content-cookies filter</link> 
     to block some types of cookies. Content cookies are not effected by 
     <literal>session-cookies-only</literal>.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage:</term>
  <listitem>
   <para>
     <screen>+session-cookies-only</screen>
   </para>
  </listitem>
 </varlistentry>
</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3 renderas="sect4" id="set-image-blocker">
<title>set-image-blocker</title>

<variablelist>
 <varlistentry>
  <term>Typical use:</term>
  <listitem>
   <para>Choose the replacement for blocked images</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Effect:</term>
  <listitem>
   <para>
     This action alone doesn't do anything noticeable. If <emphasis>both</emphasis>
     <literal><link linkend="block">block</link></literal> <emphasis>and</emphasis> <literal><link
     linkend="handle-as-image">handle-as-image</link></literal> <emphasis>also</emphasis>
     apply, i.e. if the request is to be blocked as an image,
     <emphasis>then</emphasis> the parameter of this action decides what will be
     sent as a replacement.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Type:</term>
  <!-- Boolean, Parameterized, Multi-value -->
  <listitem>
   <para>Parameterized.</para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Parameter:</term>
  <listitem>
   <itemizedlist>
    <listitem>
     <para>
      <quote>pattern</quote> to send a built-in checkerboard pattern image. The image is visually
      decent, scales very well, and makes it obvious where banners were busted.
     </para>
    </listitem>
    <listitem>
     <para>
      <quote>blank</quote> to send a built-in transparent image. This makes banners disappear
      completely, but makes it hard to detect where <application>Privoxy</application> has blocked
      images on a given page and complicates troubleshooting if <application>Privoxy</application>
      has blocked innocent images, like navigation icons.
     </para>
    </listitem>
    <listitem>
     <para>
      <quote><replaceable class="parameter">target-url</replaceable></quote> to
      send a redirect to <replaceable class="parameter">target-url</replaceable>. You can redirect
      to any image anywhere, even in your local filesystem (via <quote>file:///</quote> URL).
     </para>
     <para>
      A good application of redirects is to use special <application>Privoxy</application>-built-in
      URLs, which send the built-in images, as <replaceable class="parameter">target-url</replaceable>.
      This has the same visual effect as specifying <quote>blank</quote> or <quote>pattern</quote> in
      the first place, but enables your browser to cache the replacement image, instead of requesting
      it over and over again.
     </para>
    </listitem>
   </itemizedlist>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Notes:</term>
  <listitem>
   <para>
    The URLs for the built-in images are <quote>http://config.privoxy.org/send-banner?type=<replaceable
    class="parameter">type</replaceable></quote>, where <replaceable class="parameter">type</replaceable> is
    either <quote>blank</quote> or <quote>pattern</quote>.
   </para>
   <para>
    There is a third (advanced) type, called <quote>auto</quote>. It is <emphasis>NOT</emphasis> to be
    used in <literal>set-image-blocker</literal>, but meant for use from <link linkend="filter-file">filters</link>.
    Auto will select the type of image that would have applied to the referring page, had it been an image.
   </para>
  </listitem>
 </varlistentry>

 <varlistentry>
  <term>Example usage:</term>
  <listitem>
   <para>
    Built-in pattern:
   </para>
   <para>
    <screen>+set-image-blocker{pattern}</screen>
   </para>
   <para>
    Redirect to the BSD devil:
   </para>
   <para>
    <screen>+set-image-blocker{http://www.freebsd.org/gifs/dae_up3.gif}</screen>
   </para>
   <para>
    Redirect to the built-in pattern for better caching:
   </para>
   <para>
    <screen>+set-image-blocker{http://config.privoxy.org/send-banner?type=pattern}</screen>
   </para>
  </listitem>
 </varlistentry>
</variablelist>
</sect3>


<!--   ~~~~~       New section      ~~~~~     -->
<sect3>
<title>Summary</title>
<para>
 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 the <link
 linkend="ACTIONSANAT">Appendix</link> for a brief example on troubleshooting
 actions.
</para>
</sect3>
</sect2>

<!--   ~~~~~       New section      ~~~~~     -->
<sect2 id="aliases">
<title>Aliases</title>
<para>
 Custom <quote>actions</quote>, known to <application>Privoxy</application>
 as <quote>aliases</quote>, can be defined by combining other actions.
 These can in turn be invoked just like the built-in actions.
 Currently, an alias name can contain any character except space, tab,
 <quote>=</quote>,
 <quote>{</quote> and <quote>}</quote>, but we <emphasis>strongly 
 recommend</emphasis> that you only use <quote>a</quote> to <quote>z</quote>,
 <quote>0</quote> to <quote>9</quote>, <quote>+</quote>, and <quote>-</quote>.
 Alias names are not case sensitive, and are not required to start with a
 <quote>+</quote> or <quote>-</quote> sign, since they are merely textually
 expanded.
</para>
<para>
 Aliases can be used throughout the actions file, but they <emphasis>must be
 defined in a special section at the top of the file!</emphasis>
 And there can only be one such section per actions file. Each actions file may
 have its own alias section, and the aliases defined in it are only visible
 within that file.
</para>
<para>
 There are two main reasons to use aliases: One is to save typing for frequently
 used combinations of actions, the other one is a gain in flexibility: If you
 decide once how you want to handle shops by defining an alias called
 <quote>shop</quote>, you can later change your policy on shops in
 <emphasis>one</emphasis> place, and your changes will take effect everywhere
 in the actions file where the <quote>shop</quote> alias is used. Calling aliases
 by their purpose also makes your actions files more readable.
</para>
<para>
 Currently, there is one big drawback to using aliases, though:
 <application>Privoxy</application>'s built-in web-based action file
 editor honors aliases when reading the actions files, but it expands
 them before writing. So the effects of your aliases are of course preserved,
 but the aliases themselves are lost when you edit sections that use aliases
 with it.
 This is likely to change in future versions of <application>Privoxy</application>.
</para>

<para>
 Now let's define some aliases...
</para>

<para>
 <screen>
 # Useful custom aliases we can use later.
 #
 # Note the (required!) section header line and that this section
 # must be at the top of the actions file!
 #
 {{alias}}

 # These aliases just save typing later:
 # (Note that some already use other aliases!)
 #
 +crunch-all-cookies = +crunch-incoming-cookies +crunch-outgoing-cookies
 -crunch-all-cookies = -crunch-incoming-cookies -crunch-outgoing-cookies
 block-as-image      = +block +handle-as-image
 mercy-for-cookies   = -crunch-all-cookies -session-cookies-only

 # These aliases define combinations of actions
 # that are useful for certain types of sites:
 #
 fragile     = -block -crunch-all-cookies -filter -fast-redirects -hide-referer -kill-popups
 shop        = -crunch-all-cookies -filter{popups} -kill-popups

 # Short names for other aliases, for really lazy people ;-)
 #
 c0 = +crunch-all-cookies
 c1 = -crunch-all-cookies</screen>
</para>

<para>
 ...and put them to use. These sections would appear in the lower part of an 
 actions file and define exceptions to the default actions (as specified further
 up for the <quote>/</quote> pattern):
</para>

<para>
 <screen>
 # These sites are either very complex or very keen on
 # user data and require minimal interference to work:
 #
 {fragile}
 .office.microsoft.com
 .windowsupdate.microsoft.com
 .nytimes.com

 # Shopping sites:
 # Allow cookies (for setting and retrieving your customer data)
 #           
 {shop}
 .quietpc.com
 .worldpay.com   # for quietpc.com
 .scan.co.uk

 # These shops require pop-ups:
 #
 {shop -kill-popups -filter{popups}}
  .dabs.com
  .overclockers.co.uk</screen>
</para>

<para>
 Aliases like <quote>shop</quote> and <quote>fragile</quote> are often used for 
 <quote>problem</quote> sites that require some actions to be disabled 
 in order to function properly.
</para>
</sect2>

<!--   ~~~~~       New section      ~~~~~     -->
<sect2 id="act-examples">
<title>Actions Files Tutorial</title>
<para>
 The above chapters have shown <link linkend="actions-file">which actions files
 there are and how they are organized</link>, how actions are <link
 linkend="actions">specified</link> and <link linkend="actions-apply">applied
 to URLs</link>, how <link linkend="af-patterns">patterns</link> work, and how to
 define and use <link linkend="aliases">aliases</link>. Now, let's look at an
 example <filename>default.action</filename> and <filename>user.action</filename>
 file and see how all these pieces come together:
</para>

<sect3><title>default.action</title>

<para>
Every config file should start with a short comment stating its purpose:
</para>

<para>
 <screen># Sample default.action file &lt;developers@privoxy.org&gt;</screen>
</para>

<para>
Then, since this is the <filename>default.action</filename> file, the
first section is a special section for internal use that you needn't
change or worry about:
</para>

<para>
 <screen>
##########################################################################
# Settings -- Don't change! For internal Privoxy use ONLY.
##########################################################################

{{settings}}
for-privoxy-version=3.0</screen>
</para>

<para>
After that comes the (optional) alias section. We'll use the example
section from the above <link linkend="aliases">chapter on aliases</link>,
that also explains why and how aliases are used:
</para>

<para>
 <screen>
##########################################################################
# Aliases
##########################################################################
{{alias}}

# These aliases just save typing later:
# (Note that some already use other aliases!)
#
+crunch-all-cookies = +crunch-incoming-cookies +crunch-outgoing-cookies
-crunch-all-cookies = -crunch-incoming-cookies -crunch-outgoing-cookies
block-as-image      = +block +handle-as-image
mercy-for-cookies   = -crunch-all-cookies -session-cookies-only

# These aliases define combinations of actions
# that are useful for certain types of sites:
#
fragile     = -block -crunch-all-cookies -filter -fast-redirects -hide-referer -kill-popups
shop        = mercy-for-cookies -filter{popups} -kill-popups</screen>
</para>

<para>
 Now come the regular sections, i.e. sets of actions, accompanied
 by URL patterns to which they apply. Remember <emphasis>all actions
 are disabled when matching starts</emphasis>, so we have to explicitly
 enable the ones we want.
</para>

<para>
 The first regular section is probably the most important. It has only
 one pattern, <quote><literal>/</literal></quote>, but this pattern
 <link linkend="af-patterns">matches all URLs</link>. Therefore, the
 set of actions used in this <quote>default</quote> section <emphasis>will
 be applied to all requests as a start</emphasis>. It can  be partly or
 wholly overridden by later matches further down this file, or in user.action,
 but it will still be largely responsible for your overall browsing
 experience.
</para>

<para>
 Again, at the start of matching, all actions are disabled, so there is
 no real need to disable any actions here, but we will do that nonetheless,
 to have a complete listing for your reference. (Remember: a <quote>+</quote>
 preceding the action name enables the action, a <quote>-</quote> disables!).
 Also note how this long line has been made more readable by splitting it into
 multiple lines with line continuation.
</para> 

<para>
 <screen>
##########################################################################
# "Defaults" section:
##########################################################################
 { \
 -<link linkend="ADD-HEADER">add-header</link> \
 -<link linkend="BLOCK">block</link> \
 -<link linkend="CRUNCH-INCOMING-COOKIES">crunch-incoming-cookies</link> \
 -<link linkend="CRUNCH-OUTGOING-COOKIES">crunch-outgoing-cookies</link> \
 +<link linkend="DEANIMATE-GIFS">deanimate-gifs</link> \
 -<link linkend="DOWNGRADE-HTTP-VERSION">downgrade-http-version</link> \
 +<link linkend="FAST-REDIRECTS">fast-redirects</link> \
 +<link linkend="FILTER-HTML-ANNOYANCES">filter{html-annoyances}</link> \
 +<link linkend="FILTER-JS-ANNOYANCES">filter{js-annoyances}</link> \
 -<link linkend="FILTER-CONTENT-COOKIES">filter{content-cookies}</link> \
 +<link linkend="FILTER-POPUPS">filter{popups}</link> \
 +<link linkend="FILTER-WEBBUGS">filter{webbugs}</link> \
 -<link linkend="FILTER-REFRESH-TAGS">filter{refresh-tags}</link> \
 -<link linkend="FILTER-FUN">filter{fun}</link> \
 +<link linkend="FILTER-NIMDA">filter{nimda}</link> \
 +<link linkend="FILTER-BANNERS-BY-SIZE">filter{banners-by-size}</link> \
 -<link linkend="FILTER-BANNERS-BY-LINK">filter{banners-by-link}</link> \
 -<link linkend="FILTER-IMG-REORDER">filter{img-reorder}</link> \
 -<link linkend="FILTER-SHOCKWAVE-FLASH">filter{shockwave-flash}</link> \
 -<link linkend="FILTER-CRUDE-PARENTAL">filter{crude-parental}</link> \
 -<link linkend="FILTER-JS-EVENTS">filter{js-events}</link> \
 -<link linkend="HANDLE-AS-IMAGE">handle-as-image</link> \
 +<link linkend="HIDE-FORWARDED-FOR-HEADERS">hide-forwarded-for-headers</link> \
 +<link linkend="HIDE-FROM-HEADER">hide-from-header{block}</link> \
 +<link linkend="HIDE-REFERER">hide-referrer{forge}</link> \
 -<link linkend="HIDE-USER-AGENT">hide-user-agent</link> \
 -<link linkend="KILL-POPUPS">kill-popups</link> \
 -<link linkend="LIMIT-CONNECT">limit-connect</link> \
 +<link linkend="PREVENT-COMPRESSION">prevent-compression</link> \
 -<link linkend="SEND-VANILLA-WAFER">send-vanilla-wafer</link> \
 -<link linkend="SEND-WAFER">send-wafer</link> \
 +<link linkend="SESSION-COOKIES-ONLY">session-cookies-only</link> \
 +<link linkend="SET-IMAGE-BLOCKER">set-image-blocker{pattern}</link> \
 }
 / # forward slash will match *all* potential URL patterns.</screen>
</para>

<para>
 The default behavior is now set. Note that some actions, like not hiding
 the user agent, are part of a <quote>general policy</quote> that applies
 universally and won't get any exceptions defined later. Other choices,
 like not blocking (which is <emphasis>understandably</emphasis> the
 default!) need exceptions, i.e. we need to specify explicitly what we
 want to block in later sections.
 We will also want to make exceptions from our general pop-up-killing,
 and use our defined aliases for that.
</para>

<para>
 The first of our specialized sections is concerned with <quote>fragile</quote>
 sites, i.e. sites that require minimum interference, because they are either
 very complex or very keen on tracking you (and have mechanisms in place that
 make them unusable for people who avoid being tracked). We will simply use
 our pre-defined <literal>fragile</literal> alias instead of stating the list
 of actions explicitly:
</para>

<para>
 <screen>
##########################################################################
# Exceptions for sites that'll break under the default action set:
##########################################################################

# "Fragile" Use a minimum set of actions for these sites (see alias above):
#
{ fragile }
.office.microsoft.com           # surprise, surprise!
.windowsupdate.microsoft.com</screen>
</para>

<para>
 Shopping sites are not as fragile, but they typically
 require cookies to log in, and pop-up windows for shopping
 carts or item details. Again, we'll use a pre-defined alias:
</para>
 
<para>
 <screen>
# Shopping sites:
#
{ shop }
.quietpc.com 
.worldpay.com   # for quietpc.com
.jungle.com
.scan.co.uk</screen>
</para>

<para>
 Then, there are sites which rely on pop-up windows (yuck!) to work.
 Since we made pop-up-killing our default above, we need to make exceptions
 now. <ulink url="http://www.mozilla.org/">Mozilla</ulink> users, who
 can turn on smart handling of unwanted pop-ups in their browsers, can
 safely choose
 -<literal><link linkend="FILTER-POPUPS">filter{popups}</link></literal> (and
 -<literal><link linkend="KILL-POPUPS">kill-popups</link></literal>) above
 and hence don't need this section. Anyway, disabling an already disabled
 action doesn't hurt, so we'll define our exceptions regardless of what was
 chosen in the defaults section:
</para>

<para>
 <screen>
# These sites require pop-ups too :( 
#
{ -<link linkend="KILL-POPUPS">kill-popups</link> -<link linkend="FILTER-POPUPS">filter{popups}</link> }
.dabs.com
.overclockers.co.uk
.deutsche-bank-24.de</screen>
</para>

<para>
 The <literal><link linkend="FAST-REDIRECTS">fast-redirects</link></literal>
 action, which we enabled per default above,  breaks some sites. So disable
 it for popular sites where we know it misbehaves:
</para>

<para>
 <screen>
{ -<link linkend="FAST-REDIRECTS">fast-redirects</link> }
login.yahoo.com
edit.*.yahoo.com
.google.com
.altavista.com/.*(like|url|link):http
.altavista.com/trans.*urltext=http
.nytimes.com</screen>
</para>

<para>
 It is important that <application>Privoxy</application> knows which
 URLs belong to images, so that <emphasis>if</emphasis> they are to
 be blocked, a substitute image can be sent, rather than an HTML page.
 Contacting the remote site to find out is not an option, since it
 would destroy the loading time advantage of banner blocking, and it
 would feed the advertisers (in terms of money <emphasis>and</emphasis>
 information). We can mark any URL as an image with the <literal><link
 linkend="handle-as-image">handle-as-image</link></literal> action,
 and marking all URLs that end in a known image file extension is a
 good start:
</para>

<para>
 <screen>
##########################################################################
# Images:
##########################################################################

# Define which file types will be treated as images, in case they get
# blocked further down this file:
#
{ +<link linkend="HANDLE-AS-IMAGE">handle-as-image</link> }
/.*\.(gif|jpe?g|png|bmp|ico)$</screen>
</para>

<para>
 And then there are known banner sources. They often use scripts to
 generate the banners, so it won't be visible from the URL that the
 request is for an image. Hence we block them <emphasis>and</emphasis>
 mark them as images in one go, with the help of our
 <literal>block-as-image</literal> alias defined above. (We could of
 course just as well use <literal>+<link linkend="block">block</link>
 +<link linkend="handle-as-image">handle-as-image</link></literal> here.)
 Remember that the type of the replacement image is chosen by the
 <literal><link linkend="set-image-blocker">set-image-blocker</link></literal>
 action. Since all URLs have matched the default section with its
 <literal>+<link linkend="set-image-blocker">set-image-blocker</link>{pattern}</literal>
 action before, it still applies and needn't be repeated:
</para>

<para>
 <screen>
# Known ad generators:
#
{ block-as-image }
ar.atwola.com 
.ad.doubleclick.net
.ad.*.doubleclick.net
.a.yimg.com/(?:(?!/i/).)*$
.a[0-9].yimg.com/(?:(?!/i/).)*$
bs*.gsanet.com
bs*.einets.com
.qkimg.net</screen>
</para>

<para>
 One of the most important jobs of <application>Privoxy</application>
 is to block banners. A huge bunch of them are already <quote>blocked</quote>
 by the <literal><link linkend="filter">filter</link>{banners-by-size}</literal>
 action, which we enabled above, and which deletes the references to banner
 images from the pages while they are loaded, so the browser doesn't request
 them anymore, and hence they don't need to be blocked here. But this naturally
 doesn't catch all banners, and some people choose not to use filters, so we
 need a comprehensive list of patterns for banner URLs here, and apply the
 <literal><link linkend="block">block</link></literal> action to them.
</para>
<para>
 First comes a bunch of generic patterns, which do most of the work, by
 matching typical domain and path name components of banners. Then comes
 a list of individual patterns for specific sites, which is omitted here
 to keep the example short:
</para>

<para>
 <screen>
##########################################################################
# Block these fine banners:
##########################################################################
{ <link linkend="BLOCK">+block</link> }

# Generic patterns:
# 
ad*.
.*ads.
banner?.
count*.
/.*count(er)?\.(pl|cgi|exe|dll|asp|php[34]?)
/(?:.*/)?(publicite|werbung|rekla(ma|me|am)|annonse|maino(kset|nta|s)?)/

# Site-specific patterns (abbreviated):
#
.hitbox.com</screen>
</para>

<para>
 You wouldn't believe how many advertisers actually call their banner
 servers ads.<replaceable>company</replaceable>.com, or call the directory
 in which the banners are stored simply <quote>banners</quote>. So the above
 generic patterns are surprisingly effective.
</para>
<para>
 But being very generic, they necessarily also catch URLs that we don't want
 to block. The pattern <literal>.*ads.</literal> e.g. catches 
 <quote>nasty-<emphasis>ads</emphasis>.nasty-corp.com</quote> as intended,
 but also <quote>downlo<emphasis>ads</emphasis>.sourcefroge.net</quote> or
 <quote><emphasis>ads</emphasis>l.some-provider.net.</quote> So here come some
 well-known exceptions to the <literal>+<link linkend="BLOCK">block</link></literal>
 section above.
</para>
<para>
 Note that these are exceptions to exceptions from the default! Consider the URL
 <quote>downloads.sourcefroge.net</quote>: Initially, all actions are deactivated,
 so it wouldn't get blocked. Then comes the defaults section, which matches the
 URL, but just deactivates the <literal><link linkend="BLOCK">block</link></literal>
 action once again. Then it matches <literal>.*ads.</literal>, an exception to the
 general non-blocking policy, and suddenly
 <literal><link linkend="BLOCK">+block</link></literal> applies. And now, it'll match
 <literal>.*loads.</literal>, where <literal><link linkend="BLOCK">-block</link></literal>
 applies, so (unless it matches <emphasis>again</emphasis> further down) it ends up
 with no <literal><link linkend="BLOCK">block</link></literal> action applying.
</para>

<para>
 <screen>
##########################################################################
# Save some innocent victims of the above generic block patterns:
##########################################################################

# By domain:
# 
{ -<link linkend="BLOCK">block</link> }
adv[io]*.  # (for advogato.org and advice.*)
adsl.      # (has nothing to do with ads)
ad[ud]*.   # (adult.* and add.*)
.edu       # (universities don't host banners (yet!))
.*loads.   # (downloads, uploads etc)

# By path:
#
/.*loads/

# Site-specific:
#
www.globalintersec.com/adv # (adv = advanced)
www.ugu.com/sui/ugu/adv</screen>
</para>

<para>
 Filtering source code can have nasty side effects,
 so make an exception for our friends at sourceforge.net,
 and all paths with <quote>cvs</quote> in them. Note that
 <literal>-<link linkend="FILTER">filter</link></literal>
 disables <emphasis>all</emphasis> filters in one fell swoop!
</para>

<para>
 <screen>
# Don't filter code!
#
{ -<link linkend="FILTER">filter</link> }
/.*cvs
.sourceforge.net</screen>
</para>

<para>
 The actual <filename>default.action</filename> is of course more
 comprehensive, but we hope this example made clear how it works.
</para>

</sect3>

<sect3><title>user.action</title>
<para>
 So far we are painting with a broad brush by setting general policies,
 which would be a reasonable starting point for many people. Now, 
 you might want to be more specific and have customized rules that
 are more suitable to your personal habits and preferences. These would
 be for narrowly defined situations like your ISP or your bank, and should
 be placed in <filename>user.action</filename>, which is parsed after all other 
 actions files and hence has the last word, over-riding any previously
 defined actions. <filename>user.action</filename> is also a 
 <emphasis>safe</emphasis> place for your personal settings, since
 <filename>default.action</filename> is actively maintained by the
 <application>Privoxy</application> developers and you'll probably want
 to install updated versions from time to time.
</para>

<para>
 So let's look at a few examples of things that one might typically do in
 <filename>user.action</filename>: 
</para>


<!-- brief sample user.action here -->

<para>
 <screen>
# My user.action file. &lt;fred@foobar.com&gt;</screen>
</para>

<para>
 As <link linkend="aliases">aliases</link> are local to the actions
 file that they are defined in, you can't use the ones from
 <filename>default.action</filename>, unless you repeat them here:
</para>

<para>
 <screen>
# Aliases are local to the file they are defined in.
# (Re-)define aliases for this file:
#
{{alias}}
# 
# These aliases just save typing later, and the alias names should 
# be self explanatory.
#
+crunch-all-cookies = +crunch-incoming-cookies +crunch-outgoing-cookies
-crunch-all-cookies = -crunch-incoming-cookies -crunch-outgoing-cookies
 allow-all-cookies  = -crunch-all-cookies -session-cookies-only
 allow-popups       = -filter{popups} -kill-popups
+block-as-image     = +block +handle-as-image
-block-as-image     = -block

# These aliases define combinations of actions that are useful for
# certain types of sites:
#
fragile     = -block -crunch-all-cookies -filter -fast-redirects -hide-referer -kill-popups
shop        = -crunch-all-cookies allow-popups

# Allow ads for selected useful free sites:
#
allow-ads   = -block -filter{banners-by-size} -filter{banners-by-link}</screen>

 
</para>

<para>
 Say you have accounts on some sites that you visit regularly, and
 you don't want to have to log in manually each time. So you'd like
 to allow persistent cookies for these sites. The
 <literal>allow-all-cookies</literal> alias defined above does exactly
 that, i.e. it disables crunching of cookies in any direction, and the 
 processing of cookies to make them only temporary.
</para>

<para>
 <screen>
{ allow-all-cookies }
sunsolve.sun.com
slashdot.org
.yahoo.com
.msdn.microsoft.com
.redhat.com</screen>
</para>

<para>
 Your bank needs popups and is allergic to some filter, but you don't
 know which, so you disable them all:
</para>

<para>
 <screen>
{ -<link linkend="FILTER">filter</link> -<link linkend="KILL-POPUPS">kill-popups</link> }
.your-home-banking-site.com</screen>
</para>

<para>
 Some hosts and some file types you may not want to filter.
 <application>Privoxy</application> makes no distinctions between regular web
 pages and downloads done via your web browser if it is an html or text type
 document.
</para>

<para>
 <screen>
{ -<link linkend="FILTER">filter</link> }
localhost
apache_server.mylan

# A list of common file extensions that are likely to indicate raw text, and best
# if unfiltered.
/(.*/)?.*\.(pl|(s|p)?h|c(c|xx|pp)?|tcl|am|init?|cfg?|conf(ig)?|txt|rc|bat)$

# Documentation should not need filtering (at least on some sites).
.tldp.org</screen>
</para>

<para>
 Example of a simple <link linkend="BLOCK">block</link> action. Say you've
 seen an ad on your favourite page on example.com that you want to get rid of.
 You have right-clicked the image, selected <quote>copy image location</quote>
 and pasted the URL below while removing the leading http://, into a 
 <literal>{ +block }</literal> section. Note that <literal>{ +handle-as-image
 }</literal> need not be specified, since all URLs ending in
 <literal>.gif</literal> will be tagged as images by the general rules as set
 in default.action anyway:
</para>

<para>
 <screen>
{ +<link linkend="BLOCK">block</link> }
www.example.com/nasty-ads/sponsor.gif
another.popular.site.net/more/junk/here/

#  Here we found one that is not in <application>Privoxy's</application> default blocked list:
.adfactory.net</screen>
</para>

<para>
 To force URLs that tend to have ad images, but it is difficult for
 <application>Privoxy</application> to know this since the ultimate returned
 object is obscured for one reason or another, we can try to force these to be
 treated as images (and thus avoid <application>Privoxy's</application>
 <quote>BLOCKED</quote> banner page). Note that if what is returned by the
 server turns out NOT to be an image, then your browser typically will display
 a broken icon image. Use cautiously.
</para>

<para>
 <screen>
{ +block-as-image }
# A shockwave ad, very annoying.
.trip.com/.*\.swf
.doubleclick.net
/Realmedia/ads/
adremote.</screen>
</para>

<para>
 Now you noticed that the default configuration breaks Forbes Magazine,
 but you were too lazy to find out which action is the culprit, and you
 were again too lazy to give <link linkend="contact">feedback</link>, so
 you just used the <literal>fragile</literal> alias on the site, and
 -- <emphasis>whoa!</emphasis> -- it worked. The <literal>fragile</literal>
 aliases disables those actions that are most likely to break a site. Also,
 good for testing purposes to see if it is <application>Privoxy</application>
 that is causing the problem or not.
</para>

<para>
<screen>
{ fragile }
.forbes.com</screen>
</para>

<para>
 You like the <quote>fun</quote> text replacements in <filename>default.filter</filename>,
 but it is disabled in the distributed actions file. (My colleagues on the team just
 don't have a sense of humour, that's why! ;-). So you'd like to turn it on in your private,
 update-safe config, once and for all:
</para>

<para>
<screen>
{ +<link linkend="filter-fun">filter{fun}</link> }
/ # For ALL sites!</screen>
</para>

<para>
 Note that the above is not really a good idea: There are exceptions
 to the filters in <filename>default.action</filename> for things that
 really shouldn't be filtered, like code on CVS->Web interfaces. Since
 <filename>user.action</filename> has the last word, these exceptions
 won't be valid for the <quote>fun</quote> filtering specified here.
</para>

<para>
 You might also worry about how your favourite free websites are
 funded, and find that they rely on displaying banner advertisements
 to survive. So you might want to specifically allow banners for those
 sites that you feel provide value to you:
</para>

<para>
<screen>
{ allow-ads }
.sourceforge.net
.slashdot.org
.osdn.net</screen>   
</para>

<para>
 Note that <literal>allow-ads</literal> has been aliased to 
 <literal>-<link linkend="block">block</link></literal>, 
 <literal>-<link linkend="filter-banners-by-size">filter{banners-by-size}</link></literal>, and 
 <literal>-<link linkend="filter-banners-by-link">filter{banners-by-link}</link></literal> above.
</para>

<para>
 <filename>user.action</filename> is generally the best place to define
 exceptions and additions to the default policies of
 <filename>default.action</filename>. Some actions are safe to have their
 default policies set here though. So let's set a default policy to have a
 <quote>blank</quote> image as opposed to the checkerboard pattern for
 <emphasis>ALL</emphasis> sites. <quote>/</quote> of course matches all URL
 paths and patterns:
</para>

<para>
<screen>
{ +<link linkend="set-image-blocker">set-image-blocker{blank}</link> }
/ # ALL sites</screen>
</para>

</sect3>
</sect2>

<!--  ~  End section  ~  -->

</sect1>

<!--  ~  End section  ~  -->

<!--   ~~~~~~~~       New section Header    ~~~~~~~~~     -->

<sect1 id="filter-file">
<title>The Filter File</title>

<para>
 All text substitutions that can be invoked through the
 <literal><link linkend="filter">filter</link></literal> action
 must first be defined in the filter file, which is typically
 called <filename>default.filter</filename> and which can be
 selected through the <literal>
 <link linkend="filterfile">filterfile</link></literal> config
 option.
</para>

<para>
 Typical reasons for doing such substitutions are to eliminate
 common annoyances in HTML and JavaScript, such as pop-up windows,
 exit consoles, crippled windows without navigation tools, the
 infamous &lt;BLINK&gt; tag etc, to suppress images with certain
 width and height attributes (standard banner sizes or web-bugs),
 or just to have fun. The possibilities are endless.
</para>

<para>
 Filtering works on any text-based document type, including plain
 text, HTML, JavaScript, CSS etc. (all <literal>text/*</literal>
 MIME types). Substitutions are made at the source level, so if
 you want to <quote>roll your own</quote> filters, you should be
 familiar with HTML syntax.
</para>

<para>
 Just like the <link linkend="actions-file">actions files</link>, the
 filter file is organized in sections, which are called <emphasis>filters</emphasis>
 here. Each filter consists of a heading line, that starts with the
 <emphasis>keyword</emphasis> <literal>FILTER:</literal>, followed by
 the filter's <emphasis>name</emphasis>, and a short (one line) 
 <emphasis>description</emphasis> of what it does. Below that line
 come the <emphasis>jobs</emphasis>, i.e. lines that define the actual
 text substitutions. By convention, the name of a filter
 should describe what the filter <emphasis>eliminates</emphasis>. The
 comment is used in the <ulink url="http://config.privoxy.org/">web-based
 user interface</ulink>.
</para>

<para>
 Once a filter called <replaceable>name</replaceable> has been defined
 in the filter file, it can be invoked by using an action of the form
 +<literal><link linkend="filter">filter</link>{<replaceable>name</replaceable>}</literal>
 in any <link linkend="actions-file">actions file</link>.
</para>
 
<para>
 A filter header line for a filter called <quote>foo</quote> could look
 like this:
</para>

<para>
 <screen>FILTER: foo Replace all "foo" with "bar"</screen>
</para>

<para>
 Below that line, and up to the next header line, come the jobs that
 define what text replacements the filter executes. They are specified
 in a syntax that imitates <ulink url="http://www.perl.org/">Perl</ulink>'s
 <literal>s///</literal> operator. If you are familiar with Perl, you
 will find this to be quite intuitive, and may want to look at the
 <ulink url="http://www.oesterhelt.org/pcrs/pcrs.3.html">PCRS man page</ulink>
 for the subtle differences to Perl behaviour. Most notably, the non-standard
 option letter <literal>U</literal> is supported, which turns the default
 to ungreedy matching.
</para>

<para>
 If you are new to regular expressions, you might want to take a look at
 the <link linkend="regex">Appendix on regular expressions</link>, and
 see the <ulink url="http://perldoc.com/perl5.6.1/pod/perl.html">Perl
 manual</ulink> for
 <ulink url="http://perldoc.com/perl5.6.1/pod/perlop.html#s-PATTERN-REPLACEMENT-egimosx">the 
 <literal>s///</literal> operator's syntax</ulink> and <ulink
 url="http://perldoc.com/perl5.6.1/pod/perlre.html">Perl-style regular
 expressions</ulink> in general.
 The below examples might also help to get you started.
</para>

<!--   ~~~~~~~~       New section Header    ~~~~~~~~~     -->

<sect2><title>Filter File Tutorial</title>
<para>
 Now, let's complete our <quote>foo</quote> filter. We have already defined
 the heading, but the jobs are still missing. Since all it does is to replace
 <quote>foo</quote> with <quote>bar</quote>, there is only one (trivial) job
 needed:
</para>

<para>
 <screen>s/foo/bar/</screen>
</para>

<para>
 But wait! Didn't the comment say that <emphasis>all</emphasis> occurrences
 of <quote>foo</quote> should be replaced? Our current job will only take
 care of the first <quote>foo</quote> on each page. For global substitution,
 we'll need to add the <literal>g</literal> option:
</para>

<para>
 <screen>s/foo/bar/g</screen>
</para>

<para>
 Our complete filter now looks like this:
</para>
<para>
 <screen>FILTER: foo Replace all "foo" with "bar"
s/foo/bar/g</screen>
</para>

<para>
 Let's look at some real filters for more interesting examples. Here you see
 a filter that protects against some common annoyances that arise from JavaScript
 abuse. Let's look at its jobs one after the other:
</para>


<para>
 <screen>
FILTER: js-annoyances Get rid of particularly annoying JavaScript abuse

# Get rid of JavaScript referrer tracking. Test page: http://www.randomoddness.com/untitled.htm
#
s|(&lt;script.*)document\.referrer(.*&lt;/script&gt;)|$1"Not Your Business!"$2|Usg</screen>
</para>

<para>
 Following the header line and a comment, you see the job. Note that it uses
 <literal>|</literal> as the delimiter instead of <literal>/</literal>, because
 the pattern contains a forward slash, which would otherwise have to be escaped
 by a backslash (<literal>\</literal>).
</para>

<para>
 Now, let's examine the pattern: it starts with the text <literal>&lt;script.*</literal>
 enclosed in parentheses. Since the dot matches any character, and <literal>*</literal>
 means: <quote>Match an arbitrary number of the element left of myself</quote>, this
 matches <quote>&lt;script</quote>, followed by <emphasis>any</emphasis> text, i.e.
 it matches the whole page, from the start of the first &lt;script&gt; tag.
</para>

<para>
 That's more than we want, but the pattern continues: <literal>document\.referrer</literal>
 matches only the exact string <quote>document.referrer</quote>. The dot needed to
 be <emphasis>escaped</emphasis>, i.e. preceded by a backslash, to take away its
 special meaning as a joker, and make it just a regular dot. So far, the meaning is:
 Match from the start of the first &lt;script&gt; tag in a the page, up to, and including,
 the text <quote>document.referrer</quote>, if <emphasis>both</emphasis> are present
 in the page (and appear in that order).
</para>

<para>
 But there's still more pattern to go. The next element, again enclosed in parentheses,
 is <literal>.*&lt;/script&gt;</literal>. You already know what <literal>.*</literal>
 means, so the whole pattern translates to: Match from the start of the first  &lt;script&gt;
 tag in a page to the end of the last &lt;script&gt; tag, provided that the text
 <quote>document.referrer</quote> appears somewhere in between.
</para>

<para>
 This is still not the whole story, since we have ignored the options and the parentheses:
 The portions of the page matched by sub-patterns that are enclosed in parentheses, will be
 remembered and be available through the variables <literal>$1, $2, ...</literal> in
 the substitute. The <literal>U</literal> option switches to ungreedy matching, which means
 that the first <literal>.*</literal> in the pattern will only <quote>eat up</quote> all
 text in between <quote>&lt;script</quote> and the <emphasis>first</emphasis> occurrence
 of <quote>document.referrer</quote>, and that the second <literal>.*</literal> will
 only span the text up to the <emphasis>first</emphasis> <quote>&lt;/script&gt;</quote>
 tag. Furthermore, the <literal>s</literal> option says that the match may span
 multiple lines in the page, and the <literal>g</literal> option again means that the
 substitution is global.
</para>

<para>
 So, to summarize, the pattern means: Match all scripts that contain the text
 <quote>document.referrer</quote>. Remember the parts of the script from
 (and including) the start tag up to (and excluding) the string
 <quote>document.referrer</quote> as <literal>$1</literal>, and the part following
 that string, up to and including the closing tag, as <literal>$2</literal>.
</para>

<para>
 Now the pattern is deciphered, but wasn't this about substituting things? So
 lets look at the substitute: <literal>$1"Not Your Business!"$2</literal> is
 easy to read: The text remembered as <literal>$1</literal>, followed by 
 <literal>"Not Your Business!"</literal> (<emphasis>including</emphasis>
 the quotation marks!), followed by the text remembered as <literal>$2</literal>.
 This produces an exact copy of the original string, with the middle part
 (the <quote>document.referrer</quote>) replaced by <literal>"Not Your
 Business!"</literal>.
</para>

<para>
 The whole job now reads: Replace <quote>document.referrer</quote> by
 <literal>"Not Your Business!"</literal> wherever it appears inside a
 &lt;script&gt tag. Note that this job won't break JavaScript syntax,
 since both the original and the replacement are syntactically valid
 string objects. The script just won't have access to the referrer
 information anymore.
</para>

<para>
 We'll show you two other jobs from the JavaScript taming department, but
 this time only point out the constructs of special interest:
</para>

<para>
 <screen>
# The status bar is for displaying link targets, not pointless blahblah
#
s/window\.status\s*=\s*(['"]).*?\1/dUmMy=1/ig</screen>
</para>

<para>
 <literal>\s</literal> stands for whitespace characters (space, tab, newline,
 carriage return, form feed), so that <literal>\s*</literal> means: <quote>zero
 or more whitespace</quote>. The <literal>?</literal> in <literal>.*?</literal>
 makes this matching of arbitrary text ungreedy. (Note that the <literal>U</literal>
 option is not set). The <literal>['"]</literal> construct means: <quote>a single
 <emphasis>or</emphasis> a double quote</quote>. Finally, <literal>\1</literal> is
 a backreference to the first parenthesis just like <literal>$1</literal> above,
 with the difference that in the <emphasis>pattern</emphasis>, a backslash indicates
 a backreference, whereas in the <emphasis>substitute</emphasis>, it's the dollar.
</para>

<para>
 So what does this job do? It replaces assignments of single- or double-quoted
 strings to the <quote>window.status</quote> object with a dummy assignment
 (using a variable name that is hopefully odd enough not to conflict with
 real variables in scripts). Thus, it catches many cases where e.g. pointless
 descriptions are displayed in the status bar instead of the link target when
 you move your mouse over links.
</para>

<para>
 <screen>
# Kill OnUnload popups. Yummy. Test: http://www.zdnet.com/zdsubs/yahoo/tree/yfs.html
#
s/(&lt;body [^&gt;]*)onunload(.*&gt;)/$1never$2/iU</screen>
</para>

<para>
 Including the
 <ulink url="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-eventgroupings-htmlevents">OnUnload
 event binding</ulink> in the HTML DOM was a <emphasis>CRIME</emphasis>.
 When I close a browser window, I want it to close and die. Basta.
 This job replaces the <quote>onunload</quote> attribute in
 <quote>&lt;body&gt</quote> tags with the dummy word <literal>never</literal>.
 Note that the <literal>i</literal> option makes the pattern matching
 case-insensitive. Also note that ungreedy matching alone doesn't always guarantee
 a minimal match: In the first parenthesis, we had to use <literal>[^&gt;]*</literal>
 instead of <literal>.*</literal> to prevent the match from exceeding the 
 &lt;body&gt tag if it doesn't contain <quote>OnUnload</quote>, but the page's
 content does.
</para>

<para>
 The last example is from the fun department:
</para>

<para>
 <screen>
FILTER: fun Fun text replacements

# Spice the daily news:
#
s/microsoft(?!\.com)/MicroSuck/ig</screen>
</para>

<para>
 Note the <literal>(?!\.com)</literal> part (a so-called negative lookahead)
 in the job's pattern, which means: Don't match, if the string 
 <quote>.com</quote> appears directly following <quote>microsoft</quote>
 in the page. This prevents links to microsoft.com from being trashed, while
 still replacing the word everywhere else.
</para>

<para>
 <screen>
# Buzzword Bingo (example for extended regex syntax)
#
s* industry[ -]leading \
|  cutting[ -]edge \
|  customer[ -]focused \
|  market[ -]driven \
|  award[ -]winning # Comments are OK, too! \
|  high[ -]performance \
|  solutions[ -]based \
|  unmatched \
|  unparalleled \
|  unrivalled \
*&lt;font color="red"&gt;&lt;b&gt;BINGO!&lt;/b&gt;&lt;/font&gt; \
*igx</screen>
</para>

<para>
 The <literal>x</literal> option in this job turns on extended syntax, and allows for
 e.g. the liberal use of (non-interpreted!) whitespace for nicer formatting. 
</para>

<para>
 You get the idea?
</para>
</sect2>
</sect1>

<!--  ~  End section  ~  -->



<!--   ~~~~~       New section      ~~~~~     -->

<sect1 id="templates">
<title>Templates</title>
<para>
 All <application>Privoxy</application> built-in pages, i.e. error pages such as the 
 <ulink url="http://show-the-404-error.page"><quote>404 - No Such Domain</quote>
 error page</ulink>, the <ulink
 url="http://ads.bannerserver.example.com/nasty-ads/sponsor.html"><quote>BLOCKED</quote>
 page</ulink>
 and all pages of its <ulink url="http://config.privoxy.org/">web-based
 user interface</ulink>, are generated from <emphasis>templates</emphasis>. 
 (<application>Privoxy</application> must be running for the above links to work as
 intended.)
</para>

<para>
 These templates are stored in a subdirectory of the <link linkend="confdir">configuration
 directory</link> called <filename>templates</filename>. On Unixish platforms,
 this is typically
 <ulink url="file:///etc/privoxy/templates/"><filename>/etc/privoxy/templates/</filename></ulink>.
</para>

<para>
 The templates are basically normal HTML files, but with place-holders (called symbols
 or exports), which <application>Privoxy</application> fills at run time. You can
 edit the templates with a normal text editor, should you want to customize them.
 (<emphasis>Not recommended for the casual user</emphasis>). Note that
 just like in configuration files, lines starting with <literal>#</literal> are
 ignored when the templates are filled in.
</para>

<para>
 The place-holders are of the form <literal>@name@</literal>, and you will
 find a list of available symbols, which vary from template to template,
 in the comments at the start of each file. Note that these comments are not
 always accurate, and that it's probably best to look at the existing HTML
 code to find out which symbols are supported and what they are filled in with.
</para>

<para>
 A special application of this substitution mechanism is to make whole
 blocks of HTML code disappear when a specific symbol is set. We use this
 for many purposes, one of them being to include the beta warning in all
 our user interface (CGI) pages when <application>Privoxy</application>
 in in an alpha or beta development stage:
</para>

<para>
 <screen>
&lt;!-- @if-unstable-start --&gt;

  ... beta warning HTML code goes here ...

&lt;!-- if-unstable-end@ --&gt;</screen>
</para>

<para>
 If the "unstable" symbol is set, everything in between and including
 <literal>@if-unstable-start</literal> and <literal>if-unstable-end@</literal>
 will disappear, leaving nothing but an empty comment:
</para>

<para>
 <screen>&lt;!--  --&gt;</screen>
</para>

<para>
 There's also an if-then-else construct and an <literal>#include</literal>
 mechanism, but you'll sure find out if you are inclined to edit the
 templates ;-)
</para>

<para>
 All templates refer to a style located at
 <ulink url="http://config.privoxy.org/send-stylesheet"><literal>http://config.privoxy.org/send-stylesheet</literal></ulink>.
 This is, of course, locally served by <application>Privoxy</application>
 and the source for it can be found and edited in the
 <filename>cgi-style.css</filename> template.
</para>

</sect1>

<!--  ~  End section  ~  -->



<!--   ~~~~~       New section      ~~~~~     -->

<sect1 id="contact"><title>Contacting the Developers, Bug Reporting and Feature
Requests</title>

<!-- Include contacting.sgml boilerplate: -->
 &contacting;
<!-- end boilerplate -->

</sect1>

<!--  ~  End section  ~  -->


<!--   ~~~~~       New section      ~~~~~     -->
<sect1 id="copyright"><title><application>Privoxy</application> Copyright, License and History</title>

<!-- Include copyright.sgml: -->
 &copyright;
<!-- end copyright -->

<!--   ~~~~~       New section      ~~~~~     -->
<sect2><title>License</title>
<!-- Include copyright.sgml: -->
 &license;
<!-- end copyright -->
</sect2>
<!--  ~  End section  ~  -->


<!--   ~~~~~       New section      ~~~~~     -->

<sect2 id="history"><title>History</title>
<!-- Include history.sgml: -->
 &history;
<!-- end history -->
</sect2>

<sect2 id="authors"><title>Authors</title>
<!-- Include p-authors.sgml: -->
 &p-authors;
<!-- end authors -->
</sect2>

</sect1>

<!--  ~  End section  ~  -->


<!--   ~~~~~       New section      ~~~~~     -->
<sect1 id="seealso"><title>See Also</title>
<!-- Include seealso.sgml: -->
 &seealso;
<!-- end seealso -->
</sect1>



<!--   ~~~~~       New section      ~~~~~     -->
<sect1 id="appendix"><title>Appendix</title>


<!--   ~~~~~       New section      ~~~~~     -->
<sect2 id="regex">
<title>Regular Expressions</title>
<para>
 <application>Privoxy</application> uses Perl-style <quote>regular
 expressions</quote> in its <link linkend="actions-file">actions
 files</link> and <link linkend="filter-file">filter file</link>,
 through the <ulink url="http://www.pcre.org/">PCRE</ulink> and
 <ulink url="http://www.oesterhelt.org/pcrs/">PCRS</ulink> libraries.
</para>

<para>
 If you are reading this, you probably don't understand what <quote>regular
 expressions</quote> are, or what they can do. So this will be a very brief
 introduction only. A full explanation would require a <ulink
 url="http://www.oreilly.com/catalog/regex/">book</ulink> ;-)
</para>

<para>
 Regular expressions provide a language to describe patterns that can be
 run against strings of characters (letter, numbers, etc), to see if they
 match the string or not. The  patterns are themselves (sometimes complex)
 strings of literal characters, combined with  wild-cards, and other special
 characters, called meta-characters. The <quote>meta-characters</quote> have
 special meanings and are used to build complex patterns to be matched against.
 Perl Compatible Regular Expressions are an especially convenient
 <quote>dialect</quote> of the regular expression language.
</para>

<para>
 To make a simple analogy, we do something similar when we use wild-card
 characters when listing files with the <command>dir</command> command in DOS. 
 <literal>*.*</literal> matches all filenames. The <quote>special</quote>
 character here is the asterisk which matches any and all characters. We can be
 more specific and use <literal>?</literal> to match just individual
 characters. So <quote>dir file?.text</quote> would match
 <quote>file1.txt</quote>, <quote>file2.txt</quote>, etc. We are pattern
 matching, using a similar technique to <quote>regular expressions</quote>!
</para>

<para>
 Regular expressions do essentially the same thing, but are much, much more
 powerful. There are many more <quote>special characters</quote> and ways of 
 building complex patterns however. Let's look at a few of the common ones,
 and then some examples:
</para>

<para><simplelist>
 <member>
  <emphasis>.</emphasis> - Matches any single character, e.g. <quote>a</quote>,
  <quote>A</quote>, <quote>4</quote>, <quote>:</quote>, or <quote>@</quote>.
 </member>
</simplelist></para>

<para><simplelist>
 <member>
  <emphasis>?</emphasis> - The preceding character or expression is matched ZERO or ONE
  times. Either/or.
 </member>
</simplelist></para>

<para><simplelist>
 <member>
  <emphasis>+</emphasis> - The preceding character or expression is matched ONE or MORE
  times.
 </member>
</simplelist></para>

<para><simplelist>
 <member>
  <emphasis>*</emphasis> - The preceding character or expression is matched ZERO or MORE
  times.
 </member>
</simplelist></para>

<para><simplelist>
 <member>
  <emphasis>\</emphasis> - The <quote>escape</quote> character denotes that
  the following character should be taken literally. This is used where one of the 
  special characters (e.g. <quote>.</quote>) needs to be taken literally and
  not as a special meta-character. Example: <quote>example\.com</quote>, makes 
  sure the period is recognized only as a period (and not expanded to its 
  meta-character meaning of any single character).
 </member>
</simplelist></para>

<para><simplelist>
 <member>
  <emphasis>[]</emphasis> - Characters enclosed in brackets will be matched if
  any of the enclosed characters are encountered. For instance, <quote>[0-9]</quote>
  matches any numeric digit (zero through nine). As an example, we can combine 
  this with <quote>+</quote> to match any digit one of more times: <quote>[0-9]+</quote>.
 </member>
</simplelist></para>

<para><simplelist>
 <member>
  <emphasis>()</emphasis> - parentheses are used to group a sub-expression,
  or multiple sub-expressions.
 </member>
</simplelist></para>

<para><simplelist>
 <member>
  <emphasis>|</emphasis> - The <quote>bar</quote> character works like an
  <quote>or</quote> conditional statement. A match is successful if the
  sub-expression on either side of <quote>|</quote> matches. As an example:
  <quote>/(this|that) example/</quote> uses grouping and the bar character 
  and would match either <quote>this example</quote> or <quote>that
  example</quote>, and nothing else.
 </member>
</simplelist></para>

<para>
 These are just some of the ones you are likely to use when matching URLs with 
 <application>Privoxy</application>, and is a long way from a definitive
 list. This is enough to get us started with a few simple examples which may
 be more illuminating:
</para>

<para>
 <emphasis><literal>/.*/banners/.*</literal></emphasis> - A  simple example
 that uses the common combination of <quote>.</quote> and <quote>*</quote> to 
 denote any character, zero or more times. In other words, any string at all.
 So we start with a literal forward slash, then our regular expression pattern 
 (<quote>.*</quote>) another literal forward slash, the string
 <quote>banners</quote>, another forward slash, and lastly another
 <quote>.*</quote>. We are building 
 a directory path here. This will match any file with the path that has a
 directory named <quote>banners</quote> in it. The <quote>.*</quote> matches
 any characters, and this could conceivably be more forward slashes, so it
 might expand into a much longer looking path. For example, this could match:
 <quote>/eye/hate/spammers/banners/annoy_me_please.gif</quote>, or just
 <quote>/banners/annoying.html</quote>, or almost an infinite number of other
 possible combinations, just so it has <quote>banners</quote> in the path
 somewhere.
</para>

<para>
 A now something a little more complex:
</para>

<para>
 <emphasis><literal>/.*/adv((er)?ts?|ertis(ing|ements?))?/</literal></emphasis> - 
 We have several literal forward slashes again (<quote>/</quote>), so we are
 building another expression that is a file path statement. We have another 
 <quote>.*</quote>, so we are matching against any conceivable sub-path, just so
 it matches our expression. The only true literal that <emphasis>must
 match</emphasis> our pattern is <application>adv</application>, together with
 the forward slashes. What comes after the <quote>adv</quote> string is the
 interesting part. 
</para>

<para>
 Remember the <quote>?</quote> means the preceding expression (either a
 literal character or anything grouped with <quote>(...)</quote> in this case)
 can exist or not, since this means either zero or one match. So
 <quote>((er)?ts?|ertis(ing|ements?))</quote> is optional, as are the
 individual sub-expressions: <quote>(er)</quote>,
 <quote>(ing|ements?)</quote>, and the <quote>s</quote>. The <quote>|</quote>
 means <quote>or</quote>. We have two of those. For instance, 
 <quote>(ing|ements?)</quote>, can expand to match either <quote>ing</quote> 
 <emphasis>OR</emphasis> <quote>ements?</quote>. What is being done here, is an
 attempt at matching as many variations of <quote>advertisement</quote>, and 
 similar, as possible. So this would expand to match just <quote>adv</quote>,
 or <quote>advert</quote>, or <quote>adverts</quote>, or
 <quote>advertising</quote>, or <quote>advertisement</quote>, or
 <quote>advertisements</quote>. You get the idea. But it would not match 
 <quote>advertizements</quote> (with a <quote>z</quote>). We could fix that by
 changing our regular expression to: 
 <quote>/.*/adv((er)?ts?|erti(s|z)(ing|ements?))?/</quote>, which would then match
 either spelling.
</para>

<para>
 <emphasis><literal>/.*/advert[0-9]+\.(gif|jpe?g)</literal></emphasis> - Again 
 another path statement with forward slashes. Anything in the square brackets 
 <quote>[]</quote> can be matched. This is using <quote>0-9</quote> as a
 shorthand expression to mean any digit one through nine. It is the same as
 saying <quote>0123456789</quote>. So any digit matches. The <quote>+</quote>
 means one or more of the preceding expression must be included. The preceding 
 expression here is what is in the square brackets -- in this case, any digit 
 one through nine. Then, at the end, we have a grouping: <quote>(gif|jpe?g)</quote>. 
 This includes a <quote>|</quote>, so this needs to match the expression on
 either side of that bar character also. A simple <quote>gif</quote> on one side, and the other
 side will in turn match either <quote>jpeg</quote> or <quote>jpg</quote>,
 since the <quote>?</quote> means the letter <quote>e</quote> is optional and
 can be matched once or not at all. So we are building an expression here to
 match image GIF or JPEG type image file. It must include the literal
 string <quote>advert</quote>, then one or more digits, and a <quote>.</quote>
 (which is now a literal, and not a special character, since it is escaped
 with <quote>\</quote>), and lastly either <quote>gif</quote>, or
 <quote>jpeg</quote>, or <quote>jpg</quote>. Some possible matches would
 include: <quote>//advert1.jpg</quote>,
 <quote>/nasty/ads/advert1234.gif</quote>,
 <quote>/banners/from/hell/advert99.jpg</quote>. It would not match
 <quote>advert1.gif</quote> (no leading slash), or
 <quote>/adverts232.jpg</quote> (the expression does not include an
 <quote>s</quote>), or <quote>/advert1.jsp</quote> (<quote>jsp</quote> is not
 in the expression anywhere).
</para>

<para>
 We are barely scratching the surface of regular expressions here so that you
 can understand the default <application>Privoxy</application>
 configuration files, and maybe use this knowledge to customize your own
 installation. There is much, much more that can be done with regular
 expressions. Now that you know enough to get started, you can learn more on
 your own :/
</para>

<para>
 More reading on Perl Compatible Regular expressions: 
 <ulink url="http://www.perldoc.com/perl5.6/pod/perlre.html">http://www.perldoc.com/perl5.6/pod/perlre.html</ulink>
</para>

<para>
 For information on regular expression based substitutions and their applications
 in filters, please see the <link linkend="filter-file">filter file tutorial</link>
 in this manual.
</para>
</sect2>

<!--  ~  End section  ~  -->


<!--   ~~~~~       New section      ~~~~~     -->
<sect2>
<title><application>Privoxy</application>'s Internal Pages</title>

<para>
 Since <application>Privoxy</application> proxies each requested 
 web page, it is easy for <application>Privoxy</application> to 
 trap certain special URLs. In this way, we can talk directly to
 <application>Privoxy</application>, and see how it is 
 configured, see how our rules are being applied, change these 
 rules and other configuration options, and even turn
 <application>Privoxy's</application> filtering off, all with 
 a web browser.

</para>

<para>
 The URLs listed below are the special ones that allow direct access 
 to <application>Privoxy</application>. Of course,
 <application>Privoxy</application> must be running to access these. If 
 not, you will get a friendly error message. Internet access is not 
 necessary either.
</para>

<para>
 <itemizedlist>

 <listitem>
  <para>  
   Privoxy main page: 
  </para>
  <blockquote>
   <para> 
     <ulink url="http://config.privoxy.org/">http://config.privoxy.org/</ulink>
   </para>
  </blockquote>
  <para>
   There is a shortcut: <ulink url="http://p.p/">http://p.p/</ulink> (But it
   doesn't provide a fall-back to a real page, in case the request is not
   sent through <application>Privoxy</application>)
  </para>
 </listitem>

 <listitem>
  <para>  
    Show information about the current configuration, including viewing and 
    editing of actions files:
  </para>
   <blockquote>
   <para> 
    <ulink url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status</ulink>
   </para>
  </blockquote>
 </listitem>
 
 <listitem>
  <para>  
    Show the source code version numbers:
  </para>
  <blockquote>
   <para> 
    <ulink url="http://config.privoxy.org/show-version">http://config.privoxy.org/show-version</ulink>
   </para>
  </blockquote>
 </listitem>
 
 <listitem>
  <para>  
   Show the browser's request headers:
  </para>
  <blockquote>
   <para> 
    <ulink url="http://config.privoxy.org/show-request">http://config.privoxy.org/show-request</ulink>
   </para>
  </blockquote>
 </listitem>
 
 <listitem>
  <para>  
   Show which actions apply to a URL and why:
  </para>
   <blockquote>
   <para> 
    <ulink url="http://config.privoxy.org/show-url-info">http://config.privoxy.org/show-url-info</ulink>
   </para>
  </blockquote>
 </listitem>
 
 <listitem>
  <para>  
   Toggle Privoxy on or off. In this case, <quote>Privoxy</quote> continues 
   to run, but only as a pass-through proxy, with no actions taking place:
  </para>
   <blockquote>
   <para> 
    <ulink url="http://config.privoxy.org/toggle">http://config.privoxy.org/toggle</ulink>
   </para>
  </blockquote>
  <para>
   Short cuts. Turn off, then on: 
  </para>
   <blockquote>
   <para> 
     <ulink url="http://config.privoxy.org/toggle?set=disable">http://config.privoxy.org/toggle?set=disable</ulink>
   </para>
  </blockquote>
   <blockquote>
   <para> 
     <ulink url="http://config.privoxy.org/toggle?set=enable">http://config.privoxy.org/toggle?set=enable</ulink>
   </para>
  </blockquote>
 </listitem>
 
 </itemizedlist>
</para>

<para>
 These may be bookmarked for quick reference. See next.

</para>

<sect3 id="bookmarklets">
<title>Bookmarklets</title>
<para>
 Below are some <quote>bookmarklets</quote> to allow you to easily access a
 <quote>mini</quote> version of some of <application>Privoxy's</application>
 special pages. They are designed for MS Internet Explorer, but should work
 equally well in Netscape, Mozilla, and other browsers which support
 JavaScript. They are designed to run directly from your bookmarks - not by
 clicking the links below (although that should work for testing).
</para>
<para>
 To save them, right-click the link and choose <quote>Add to Favorites</quote>
 (IE) or <quote>Add Bookmark</quote> (Netscape). You will get a warning that
 the bookmark <quote>may not be safe</quote> - just click OK. Then you can run the
 Bookmarklet directly from your favorites/bookmarks. For even faster access,
 you can put them on the <quote>Links</quote> bar (IE) or the <quote>Personal
 Toolbar</quote> (Netscape), and run them with a single click. 
</para>

<para>
 <itemizedlist>

  <listitem>
   <para>
    <ulink
    url="javascript:void(window.open('http://config.privoxy.org/toggle?mini=y&#38;set=enabled','ijbstatus','width=250,height=100,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Privoxy - Enable</ulink>
   </para>
  </listitem> 

  <listitem>
   <para>
    <ulink
    url="javascript:void(window.open('http://config.privoxy.org/toggle?mini=y&#38;set=disabled','ijbstatus','width=250,height=100,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Privoxy - Disable</ulink>
   </para>
  </listitem> 

  <listitem>
   <para>
    <ulink
    url="javascript:void(window.open('http://config.privoxy.org/toggle?mini=y&#38;set=toggle','ijbstatus','width=250,height=100,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Privoxy - Toggle Privoxy</ulink> (Toggles between enabled and disabled)
   </para>
  </listitem> 

  <listitem>
   <para>
    <ulink
    url="javascript:void(window.open('http://config.privoxy.org/toggle?mini=y','ijbstatus','width=250,height=2,resizable=yes,scrollbars=no,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Privoxy- View Status</ulink>
   </para>
  </listitem> 

  <listitem>
   <para>
    <ulink url="javascript:w=Math.floor(screen.width/2);h=Math.floor(screen.height*0.9);void(window.open('http://www.privoxy.org/actions/index.php?url='+escape(location.href),'Feedback','screenx='+w+',width='+w+',height='+h+',scrollbars=yes,toolbar=no,location=no,directories=no,status=no,menubar=no,copyhistory=no').focus());">Privoxy - Submit Actions File Feedback</ulink>
   </para>
  </listitem> 
  <listitem>
   <para>
    <ulink url="javascript:void(window.open('http://config.privoxy.org/show-url-info?url='+escape(location.href),'Why').focus());">Privoxy - Why?</ulink>
   </para>
  </listitem> 
 </itemizedlist>
</para>

<para>
 Credit: The site which gave us the general idea for these bookmarklets is
 <ulink url="http://www.bookmarklets.com/">www.bookmarklets.com</ulink>. They
 have more information about bookmarklets. 
</para>


</sect3>

</sect2>


<!--   ~~~~~       New section      ~~~~~     -->
<sect2 id="chain">
<title>Chain of Events</title>
<para>
 Let's take a quick look at the basic sequence of events when a web page is 
 requested by your browser and <application>Privoxy</application> is on duty:
</para>

<para>
 <itemizedlist>
 <listitem>
  <para>
   First, your web browser requests a web page. The browser knows to send 
   the request to <application>Privoxy</application>, which will in turn, 
   relay the request to the remote web server after passing the following 
   tests: 
  </para>
 </listitem> 
 <listitem>
  <para>
   <application>Privoxy</application> traps any request for its own internal CGI 
   pages (e.g http://p.p/) and sends the CGI page back to the browser.
  </para>
 </listitem> 
 <listitem>
  <para>
   Next, <application>Privoxy</application> checks to see if the URL 
   matches any <link
   linkend="BLOCK"><quote>+block</quote></link> patterns. If
   so, the URL is then blocked, and the remote web server will not be contacted.
   <link linkend="HANDLE-AS-IMAGE"><quote>+handle-as-image</quote></link> 
   is then checked and if it does not match, an 
   HTML <quote>BLOCKED</quote> page is sent back. Otherwise, if it does match,
   an image is returned. The type of image depends on the setting of <link
   linkend="SET-IMAGE-BLOCKER"><quote>+set-image-blocker</quote></link>
   (blank, checkerboard pattern, or an HTTP redirect to an image elsewhere).
  </para>
 </listitem> 
 <listitem>
  <para>
   Untrusted URLs are blocked. If URLs are being added to the
   <filename>trust</filename> file, then that is done.
  </para>
 </listitem> 
 <listitem>
  <para>
   If the URL pattern matches the <link
   linkend="FAST-REDIRECTS"><quote>+fast-redirects</quote></link> action,
   it is then processed. Unwanted parts of the requested URL are stripped.
  </para>
 </listitem> 
 <listitem>
  <para>
   Now the rest of the client browser's request headers are processed. If any
   of these match any of the relevant actions (e.g. <link
   linkend="HIDE-USER-AGENT"><quote>+hide-user-agent</quote></link>,
   etc.), headers are suppressed or forged as determined by these actions and
   their parameters.
  </para>
 </listitem> 
 <listitem>
  <para>
   Now the web server starts sending its response back (i.e. typically a web page and related 
   data).
  </para>
 </listitem> 
 <listitem>
  <para>
   First, the server headers are read and processed to determine, among other
   things, the MIME type (document type) and encoding. The headers are then
   filtered as determined by the 
   <link linkend="CRUNCH-INCOMING-COOKIES"><quote>+crunch-incoming-cookies</quote></link>,
   <link linkend="SESSION-COOKIES-ONLY"><quote>+session-cookies-only</quote></link>,
   and <link linkend="DOWNGRADE-HTTP-VERSION"><quote>+downgrade-http-version</quote></link>
   actions.
  </para>
 </listitem> 
 <listitem>
  <para>
   If the <link linkend="KILL-POPUPS"><quote>+kill-popups</quote></link>
   action applies, and it is an HTML or JavaScript document, the popup-code in the
   response is filtered on-the-fly as it is received.
  </para>
 </listitem> 
 <listitem>
  <para>
   If a <link linkend="FILTER"><quote>+filter</quote></link>
   or <link
   linkend="DEANIMATE-GIFS"><quote>+deanimate-gifs</quote></link>
   action applies (and the document type fits the action), the rest of the page is
   read into memory (up to a configurable limit). Then the filter rules (from
   <filename>default.filter</filename>) are processed against the buffered
   content. Filters are applied in the order they are specified in the
   <filename>default.filter</filename> file. Animated GIFs, if present, are
   reduced to either the first or last frame, depending on the action
   setting.The entire page, which is now filtered, is then sent by
   <application>Privoxy</application> back to your browser. 
  </para>
  <para>
   If neither <link linkend="FILTER"><quote>+filter</quote></link>
   or <link
   linkend="DEANIMATE-GIFS"><quote>+deanimate-gifs</quote></link>
   matches, then <application>Privoxy</application> passes the raw data through 
   to the client browser as it becomes available.
  </para>
 </listitem> 
 <listitem>
  <para>
   As the browser receives the now (probably filtered) page content, it 
   reads and then requests any URLs that may be embedded within the page
   source, e.g. ad images, stylesheets, JavaScript, other HTML documents (e.g.
   frames), sounds, etc. For each of these objects, the browser issues a new
   request. And each such request is in turn processed as above. Note that a
   complex web page may have many such embedded URLs.
  </para>
 </listitem> 
 
 </itemizedlist>
</para>

</sect2>


<!--   ~~~~~       New section      ~~~~~     -->
<sect2 id="actionsanat">
<title>Anatomy of an Action</title>

<para>
 The way <application>Privoxy</application> applies 
 <link linkend="ACTIONS">actions</link> and <link linkend="FILTER">filters</link>
 to any given URL can be complex, and not always so
 easy to understand what is happening. And sometimes we need to be able to
 <emphasis>see</emphasis> just what <application>Privoxy</application> is
 doing. Especially, if something <application>Privoxy</application> is doing
 is causing us a problem inadvertently. It can be a little daunting to look at
 the actions and filters files themselves, since they tend to be filled with
 <link linkend="regex">regular expressions</link> whose consequences are not
 always so obvious. 
</para>

<para>
 One quick test to see if <application>Privoxy</application> is causing a problem 
 or not, is to disable it temporarily. This should be the first troubleshooting 
 step. See <link linkend="bookmarklets">the Bookmarklets</link> section on a quick 
 and easy way to do this (be sure to flush caches afterward!). Looking at the 
 logs is a good idea too.
</para>

<para>
 <application>Privoxy</application> also provides the 
 <ulink url="http://config.privoxy.org/show-url-info">http://config.privoxy.org/show-url-info</ulink>
 page that can show us very specifically how <application>actions</application>
 are being applied to any given URL. This is a big help for troubleshooting.
</para>

<para>
 First, enter one URL (or partial URL) at the prompt, and then
 <application>Privoxy</application> will tell us 
 how the current configuration will handle it. This will not
 help with filtering effects (i.e. the <link
 linkend="FILTER"><quote>+filter</quote></link> action) from
 the <filename>default.filter</filename> file since this is handled very
 differently and not so easy to trap! It also will not tell you about any other
 URLs that may be embedded within the URL you are testing. For instance, images
 such as ads are expressed as URLs within the raw page source of HTML pages. So
 you will only get info for the actual URL that is pasted into the prompt area
 -- not any sub-URLs. If you want to know about embedded URLs like ads, you
 will have to dig those out of the HTML source. Use your browser's <quote>View
 Page Source</quote> option for this. Or right click on the ad, and grab the
 URL.
</para>

<para>
 Let's try an example, <ulink url="http://google.com">google.com</ulink>, 
 and look at it one section at a time:
</para>

<para>
 <screen>
 Matches for http://google.com:

 In file: default.action <guibutton>[ View ]</guibutton> <guibutton>[ Edit ]</guibutton>

{-add-header 
 -block 
 -crunch-outgoing-cookies 
 -crunch-incoming-cookies 
 +deanimate-gifs{last} 
 -downgrade-http-version 
 +fast-redirects 
 -filter{popups} 
 -filter{fun} 
 -filter{shockwave-flash} 
 -filter{crude-parental} 
 +filter{html-annoyances} 
 +filter{js-annoyances} 
 +filter{content-cookies} 
 +filter{webbugs} 
 +filter{refresh-tags} 
 +filter{nimda} 
 +filter{banners-by-size} 
 +hide-forwarded-for-headers 
 +hide-from-header{block} 
 +hide-referer{forge} 
 -hide-user-agent 
 -handle-as-image 
 -kill-popups 
 -limit-connect 
 +prevent-compression 
 -send-vanilla-wafer 
 -send-wafer 
 +session-cookies-only 
 +set-image-blocker{pattern} }
/

 { -session-cookies-only }
 .google.com

 { -fast-redirects }
 .google.com

In file: user.action <guibutton>[ View ]</guibutton> <guibutton>[ Edit ]</guibutton>
(no matches in this file)  
</screen>
</para>

<para>
 This tells us how we have defined our 
 <link linkend="ACTIONS"><quote>actions</quote></link>, and
 which ones match for our example, <quote>google.com</quote>. The first listing
 is any matches for the <filename>standard.action</filename> file. No hits at
 all here on <quote>standard</quote>. Then next is <quote>default</quote>, or
 our <filename>default.action</filename> file. The large, multi-line listing,
 is how the actions are set to match for all URLs, i.e. our default settings.
 If you look at your <quote>actions</quote> file, this would be the section
 just below the <quote>aliases</quote> section near the top. This will apply to
 all URLs as signified by the single forward slash at the end of the listing
 -- <quote>/</quote>.
</para>

<para>
 But we can define additional actions that would be exceptions to these general
 rules, and then list specific URLs (or patterns) that these exceptions would
 apply to. Last match wins. Just below this then are two explicit matches for
 <quote>.google.com</quote>. The first is negating our previous cookie setting, 
 which was for <link
 linkend="SESSION-COOKIES-ONLY"><quote>+session-cookies-only</quote></link>
 (i.e. not persistent). So we will allow persistent cookies for google. The
 second turns <emphasis>off</emphasis> any 
 <link
 linkend="FAST-REDIRECTS"><quote>+fast-redirects</quote></link>
 action, allowing this to take place unmolested. Note that there is a leading
 dot here -- <quote>.google.com</quote>. This will match any hosts and
 sub-domains, in the google.com domain also, such as
 <quote>www.google.com</quote>. So, apparently, we have these two actions
 defined somewhere in the lower part of our <filename>default.action</filename>
 file, and <quote>google.com</quote> is referenced somewhere in these latter
 sections.
</para>

<para>
 Then, for our <filename>user.action</filename> file, we again have no hits.
</para>

<para>
 And finally we pull it all together in the bottom section and summarize how
 <application>Privoxy</application> is applying all its <quote>actions</quote> 
 to <quote>google.com</quote>:

</para>

<para>
 <screen>

 Final results:
 
 -add-header 
 -block 
 -crunch-outgoing-cookies 
 -crunch-incoming-cookies 
 +deanimate-gifs{last} 
 -downgrade-http-version 
 -fast-redirects 
 -filter{popups} 
 -filter{fun} 
 -filter{shockwave-flash} 
 -filter{crude-parental} 
 +filter{html-annoyances} 
 +filter{js-annoyances} 
 +filter{content-cookies} 
 +filter{webbugs} 
 +filter{refresh-tags} 
 +filter{nimda} 
 +filter{banners-by-size} 
 +hide-forwarded-for-headers 
 +hide-from-header{block} 
 +hide-referer{forge} 
 -hide-user-agent 
 -handle-as-image 
 -kill-popups 
 -limit-connect 
 +prevent-compression 
 -send-vanilla-wafer 
 -send-wafer
 -session-cookies-only 
 +set-image-blocker{pattern} 
</screen>
</para>

<para>
 Notice the only difference here to the previous listing, is to 
 <quote>fast-redirects</quote> and <quote>session-cookies-only</quote>.
</para>

<para>
 Now another example, <quote>ad.doubleclick.net</quote>:
</para>

<para>
 <screen>

 { +block +handle-as-image }
  .ad.doubleclick.net

 { +block +handle-as-image }
  ad*.

 { +block +handle-as-image }
  .doubleclick.net
</screen>
</para>

<para>
 We'll just show the interesting part here, the explicit matches. It is 
 matched three different times. Each as an <quote>+block +handle-as-image</quote>,
 which is the expanded form of one of our aliases that had been defined as: 
 <quote>+imageblock</quote>. (<link
 linkend="ALIASES"><quote>Aliases</quote></link> are defined in
 the first section of the actions file and typically used to combine more 
 than one action.)
</para>

<para>
 Any one of these would have done the trick and blocked this as an unwanted 
 image. This is unnecessarily redundant since the last case effectively 
 would also cover the first. No point in taking chances with these guys 
 though ;-) Note that if you want an ad or obnoxious 
 URL to be invisible, it should be defined as <quote>ad.doubleclick.net</quote>
 is done here -- as both a <link
 linkend="BLOCK"><quote>+block</quote></link>
 <emphasis>and</emphasis> an 
 <link
 linkend="HANDLE-AS-IMAGE"><quote>+handle-as-image</quote></link>.
 The custom alias <quote>+imageblock</quote> just simplifies the process and make 
 it more readable.
</para>

<para>
 One last example. Let's try <quote>http://www.rhapsodyk.net/adsl/HOWTO/</quote>.
 This one is giving us problems. We are getting a blank page. Hmmm ...
</para>

<para>
 <screen>

 Matches for http://www.rhapsodyk.net/adsl/HOWTO/:

 In file: default.action <guibutton>[ View ]</guibutton> <guibutton>[ Edit ]</guibutton>

 {-add-header 
  -block 
  -crunch-incoming-cookies 
  -crunch-outgoing-cookies 
  +deanimate-gifs 
  -downgrade-http-version 
  +fast-redirects 
  +filter{html-annoyances} 
  +filter{js-annoyances} 
  +filter{kill-popups} 
  +filter{webbugs} 
  +filter{nimda} 
  +filter{banners-by-size} 
  +filter{hal} 
  +filter{fun} 
  +hide-forwarded-for-headers 
  +hide-from-header{block} 
  +hide-referer{forge} 
  -hide-user-agent 
  -handle-as-image 
  +kill-popups 
  +prevent-compression 
  -send-vanilla-wafer 
  -send-wafer 
  +session-cookies-only 
  +set-image-blocker{blank} }
   /

 { +block +handle-as-image }
  /ads
</screen>
</para>

<para>
 Ooops, the <quote>/adsl/</quote> is matching <quote>/ads</quote>! But 
 we did not want this at all! Now we see why we get the blank page. We could
 now add a new action below this that explicitly does <emphasis>not</emphasis>
 block (<quote>{-block}</quote>) paths with <quote>adsl</quote>. There are
 various ways to handle such exceptions. Example:
</para>

<para>
 <screen>

 { -block }
  /adsl
</screen>
</para>

<para>
 Now the page displays ;-) Be sure to flush your browser's caches when 
 making such changes. Or, try using <literal>Shift+Reload</literal>.
</para>

<para>
 But now what about a situation where we get no explicit matches like 
 we did with:
</para>

<para>
 <screen>

 { +block +handle-as-image }
 /ads
</screen>
</para>

<para>
 That actually was very telling and pointed us quickly to where the problem
 was. If you don't get this kind of match, then it means one of the default 
 rules in the first section is causing the problem. This would require some 
 guesswork, and maybe a little trial and error to isolate the offending rule.
 One likely cause would be one of the <quote>{+filter}</quote> actions. These 
 tend to be harder to troubleshoot. Try adding the URL for the site to one of
 aliases that turn off <quote>+filter</quote>:
</para>

<para>
 <screen>

 {shop}
 .quietpc.com
 .worldpay.com   # for quietpc.com
 .jungle.com
 .scan.co.uk
 .forbes.com
</screen>
</para>

<para>
 <quote>{shop}</quote> is an <quote>alias</quote> that expands to 
 <quote>{ -filter -session-cookies-only }</quote>.
 Or you could do your own exception to negate filtering:

</para>

<para>
 <screen>

 {-filter}
 .forbes.com
</screen>
</para>

<para>
 This would turn off all filtering for that site. This would probably be most
 appropriately put in <filename>user.action</filename>, for local site
 exceptions.
</para>

<para>
 Images that are inexplicably being blocked, may well be hitting the 
 <quote>+filter{banners-by-size}</quote> rule, which assumes 
 that images of certain sizes are ad banners (works well most of the time 
 since these tend to be standardized).
</para>

<para>
 <quote>{fragile}</quote> is an alias that disables most actions. This can be 
 used as a last resort for problem sites. Remember to flush caches! If this 
 still does not work, you will have to go through the remaining actions one by
 one to find which one(s) is causing the problem.
</para>

</sect2>

</sect1>

 <!--

 This program 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.

 This program is distributed in the hope that it will
 be useful, but WITHOUT ANY WARRANTY; without even the
 implied warranty of MERCHANTABILITY or FITNESS FOR A
 PARTICULAR PURPOSE.  See the GNU General Public
 License for more details.

 The GNU General Public License should be included with
 this file.  If not, you can view it at
 http://www.gnu.org/copyleft/gpl.html
 or write to the Free Software Foundation, Inc., 59
 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

 $Log: user-manual.sgml,v $
 Revision 1.1.1.2  2003/05/23 11:55:17  lionel
 Upstream 13:40 23 May 2003 CVS

 Revision 2.10  2003/05/08 18:19:36  roro
 Use apt-get instead of dpkg to install Debian package, which is more
 solid, uses the correct and most recent Debian version automatically.

 Revision 2.9  2003/04/11 03:14:53  hal9
 Add small note about one filter file may be defined.

 Revision 2.8  2002/10/21 02:46:09  hal9
 Port changes to user.action examples section from 3.0.

 Revision 2.7  2002/10/12 01:14:42  hal9
 Updates for demoronizer filter, Radical profile, and the srvany.exe/icon
 win32 fix.

 Revision 2.6  2002/10/10 04:10:38  hal9
 s/Advanced/Radical/ for standard.action change.

 Revision 2.5  2002/10/10 03:50:38  hal9
 Update cookie sections for pre-existing condition, and content cookies not
 effected by session-cookies setting.

 Revision 2.4  2002/09/26 05:58:07  hal9
 Change development status from working on 3.0 to 3.2.

 Revision 2.3  2002/09/26 00:12:17  hal9
 Additional notes on Privoxy patterns, and filtering vs SSL.

 Revision 2.2  2002/09/05 05:45:30  hal9
 Syncing with 3.0. This should be it for doc sources. Not all builds tested
 yet. No new content, just catching up.

 Revision 1.123.2.18  2002/08/22 23:47:58  hal9
 Add 'Documentation' to Privoxy Menu shot in Configuration section to match
 CGIs.

 Revision 1.123.2.17  2002/08/18 01:13:05  hal9
 Spell checked (only one typo this time!).

 Revision 1.123.2.16  2002/08/09 19:20:54  david__schmidt
 Update to Mac OSX startup script name

 Revision 1.123.2.15  2002/08/07 17:32:11  oes
 Converted some internal links from ulink to link for PDF creation; no content changed

 Revision 1.123.2.14  2002/08/06 09:16:13  oes
 Nits re: actions file download

 Revision 1.123.2.13  2002/08/02 18:23:19  g_sauthoff
 Just 2 small corrections to the Gentoo sections

 Revision 1.123.2.12  2002/08/02 18:17:21  g_sauthoff
 Added 2 Gentoo sections

 Revision 1.123.2.11  2002/07/26 15:20:31  oes
 - Added version info to title
 - Added info on new filters
 - Revised parts of the filter file tutorial
 - Added info on where to get updated actions files

 Revision 1.123.2.10  2002/07/25 21:42:29  hal9
 Add brief notes on not proxying non-HTTP protocols.

 Revision 1.123.2.9  2002/07/11 03:40:28  david__schmidt

 Updated Mac OSX sections due to installation location change

 Revision 1.123.2.8  2002/06/09 16:36:32  hal9
 Clarifications on filtering and MIME. Hardcode 'latest release' in index.html.

 Revision 1.123.2.7  2002/06/09 00:29:34  hal9
 Touch ups on filtering, in actions section and Anatomy.

 Revision 1.123.2.6  2002/06/06 23:11:03  hal9
 Fix broken link. Linkchecked all docs.

 Revision 1.123.2.5  2002/05/29 02:01:02  hal9
 This is break out of the entire config section from u-m, so it can
 eventually be used to generate the comments, etc in the main config file
 so that these are in sync with each other.

 Revision 1.123.2.4  2002/05/27 03:28:45  hal9
 Ooops missed something from David.

 Revision 1.123.2.3  2002/05/27 03:23:17  hal9
 Fix FIXMEs for OS2 and OSX startup. Fix Redhat typos (should be Red Hat).
 That's a wrap, I think.

 Revision 1.123.2.2  2002/05/26 19:02:09  hal9
 Move Amiga stuff around to take of FIXME in start up section.

 Revision 1.123.2.1  2002/05/26 17:04:25  hal9
 -Spellcheck, very minor edits, and sync across branches

 Revision 1.123  2002/05/24 23:19:23  hal9
 Include new image (Proxy setup). More fun with guibutton.
 Minor corrections/clarifications here and there.

 Revision 1.122  2002/05/24 13:24:08  oes
 Added Bookmarklet for one-click pre-filled access to show-url-info

 Revision 1.121  2002/05/23 23:20:17  oes
  - Changed more (all?) references to actions to the
    <literal><link> style.
  - Small fixes in the actions chapter
  - Small clarifications in the quickstart to ad blocking
  - Removed <emphasis> from <title>s since the new doc CSS
    renders them red (bad in TOC).

 Revision 1.120  2002/05/23 19:16:43  roro
 Correct Debian specials (installation and startup).

 Revision 1.119  2002/05/22 17:17:05  oes
 Added Security hint

 Revision 1.118  2002/05/21 04:54:55  hal9
 -New Section: Quickstart to Ad Blocking
 -Reformat Actions Anatomy to match new CGI layout

 Revision 1.117  2002/05/17 13:56:16  oes
  - Reworked & extended Templates chapter
  - Small changes to Regex appendix
  - #included authors.sgml into (C) and hist chapter

 Revision 1.116  2002/05/17 03:23:46  hal9
 Fixing merge conflict in Quickstart section.

 Revision 1.115  2002/05/16 16:25:00  oes
 Extended the Filter File chapter & minor fixes

 Revision 1.114  2002/05/16 09:42:50  oes
 More ulink->link, added some hints to Quickstart section

 Revision 1.113  2002/05/15 21:07:25  oes
 Extended and further commented the example actions files

 Revision 1.112  2002/05/15 03:57:14  hal9
 Spell check. A few minor edits here and there for better syntax and
 clarification.

 Revision 1.111  2002/05/14 23:01:36  oes
 Fixing the fixes   

 Revision 1.110  2002/05/14 19:10:45  oes
 Restored alphabetical order of actions

 Revision 1.109  2002/05/14 17:23:11  oes
 Renamed the prevent-*-cookies actions, extended aliases section and moved it before the example AFs

 Revision 1.108  2002/05/14 15:29:12  oes
 Completed proofreading the actions chapter

 Revision 1.107  2002/05/12 03:20:41  hal9
 Small clarifications for 127.0.0.1 vs localhost for listen-address since this
 apparently an important distinction for some OS's.

 Revision 1.106  2002/05/10 01:48:20  hal9
 This is mostly proposed copyright/licensing additions and changes. Docs
 are still GPL, but licensing and copyright are more visible. Also, copyright
 changed in doc header comments (eliminate references to JB except FAQ).

 Revision 1.105  2002/05/05 20:26:02  hal9
 Sorting out license vs copyright in these docs.

 Revision 1.104  2002/05/04 08:44:45  swa
 bumped version

 Revision 1.103  2002/05/04 00:40:53  hal9
 -Remove the TOC first page kludge. It's fixed proper now in ldp.dsl.in.
 -Some minor additions to Quickstart.

 Revision 1.102  2002/05/03 17:46:00  oes
 Further proofread & reactivated short build instructions

 Revision 1.101  2002/05/03 03:58:30  hal9
 Move the user-manual config directive to top of section. Add note about
 Privoxy needing read permissions for configs, and write for logs.

 Revision 1.100  2002/04/29 03:05:55  hal9
 Add clarification on differences of new actions files.

 Revision 1.99  2002/04/28 16:59:05  swa
 more structure in starting section

 Revision 1.98  2002/04/28 05:43:59  hal9
 This is the break up of configuration.html into multiple files. This
 will probably break links elsewhere :(

 Revision 1.97  2002/04/27 21:04:42  hal9
 -Rewrite of Actions File example.
 -Add section for user-manual directive in config.

 Revision 1.96  2002/04/27 05:32:00  hal9
 -Add short section to Filter Files to tie in with +filter action.
 -Start rewrite of examples in Actions Examples (not finished).

 Revision 1.95  2002/04/26 17:23:29  swa
 bookmarks cleaned, changed structure of user manual, screen and programlisting cleanups, and numerous other changes that I forgot

 Revision 1.94  2002/04/26 05:24:36  hal9
 -Add most of Andreas suggestions to Chain of Events section.
 -A few other minor corrections and touch up.

 Revision 1.92  2002/04/25 18:55:13  hal9
 More catchups on new actions files, and new actions names.
 Other assorted cleanups, and minor modifications.

 Revision 1.91  2002/04/24 02:39:31  hal9
 Add 'Chain of Events' section.

 Revision 1.90  2002/04/23 21:41:25  hal9
 Linuxconf is deprecated on RH, substitute chkconfig.

 Revision 1.89  2002/04/23 21:05:28  oes
 Added hint for startup on Red Hat

 Revision 1.88  2002/04/23 05:37:54  hal9
 Add AmigaOS install stuff.

 Revision 1.87  2002/04/23 02:53:15  david__schmidt
 Updated OSX installation section
 Added a few English tweaks here an there

 Revision 1.86  2002/04/21 01:46:32  hal9
 Re-write actions section.

 Revision 1.85  2002/04/18 21:23:23  hal9
 Fix ugly typo (mine).

 Revision 1.84  2002/04/18 21:17:13  hal9
 Spell Redhat correctly (ie Red Hat). A few minor grammar corrections.

 Revision 1.83  2002/04/18 18:21:12  oes
 Added RPM install detail

 Revision 1.82  2002/04/18 12:04:50  oes
 Cosmetics

 Revision 1.81  2002/04/18 11:50:24  oes
 Extended Install section - needs fixing by packagers

 Revision 1.80  2002/04/18 10:45:19  oes
 Moved text to buildsource.sgml, renamed some filters, details

 Revision 1.79  2002/04/18 03:18:06  hal9
 Spellcheck, and minor touchups.

 Revision 1.78  2002/04/17 18:04:16  oes
 Proofreading part 2

 Revision 1.77  2002/04/17 13:51:23  oes
 Proofreading, part one

 Revision 1.76  2002/04/16 04:25:51  hal9
 -Added 'Note to Upgraders' and re-ordered the 'Quickstart' section.
 -Note about proxy may need requests to re-read config files.

 Revision 1.75  2002/04/12 02:08:48  david__schmidt
 Remove OS/2 building info... it is already in the developer-manual

 Revision 1.74  2002/04/11 00:54:38  hal9
 Add small section on submitting actions.

 Revision 1.73  2002/04/10 18:45:15  swa
 generated

 Revision 1.72  2002/04/10 04:06:19  hal9
 Added actions feedback  to Bookmarklets section

 Revision 1.71  2002/04/08 22:59:26  hal9
 Version update. Spell chkconfig correctly :)

 Revision 1.70  2002/04/08 20:53:56  swa
 ?

 Revision 1.69  2002/04/06 05:07:29  hal9
 -Add privoxy-man-page.sgml, for man page.
 -Add authors.sgml for AUTHORS (and p-authors.sgml)
 -Reworked various aspects of various docs.
 -Added additional comments to sub-docs.

 Revision 1.68  2002/04/04 18:46:47  swa
 consistent look. reuse of copyright, history et. al.

 Revision 1.67  2002/04/04 17:27:57  swa
 more single file to be included at multiple points. make maintaining easier

 Revision 1.66  2002/04/04 06:48:37  hal9
 Structural changes to allow for conditional inclusion/exclusion of content
 based on entity toggles, e.g. 'entity % p-not-stable  "INCLUDE"'. And
 definition of internal entities, e.g. 'entity p-version "2.9.13"' that will
 eventually be set by Makefile.
 More boilerplate text for use across multiple docs.

 Revision 1.65  2002/04/03 19:52:07  swa
 enhance squid section due to user suggestion

 Revision 1.64  2002/04/03 03:53:43  hal9
 A few minor bug fixes, and touch ups. Ready for review.

 Revision 1.63  2002/04/01 16:24:49  hal9
 Define entities to include boilerplate text. See doc/source/*.

 Revision 1.62  2002/03/30 04:15:53  hal9
 - Fix privoxy.org/config links.
 - Paste in Bookmarklets from Toggle page.
 - Move Quickstart nearer top, and minor rework.

 Revision 1.61  2002/03/29 01:31:08  hal9
 Minor update.

 Revision 1.60  2002/03/27 01:57:34  hal9
 Added more to Anatomy section.

 Revision 1.59  2002/03/27 00:54:33  hal9
 Touch up intro for new name.

 Revision 1.58  2002/03/26 22:29:55  swa
 we have a new homepage!

 Revision 1.57  2002/03/24 20:33:30  hal9
 A few minor catch ups with name change.

 Revision 1.56  2002/03/24 16:17:06  swa
 configure needs to be generated.

 Revision 1.55  2002/03/24 16:08:08  swa
 we are too lazy to make a block-built
 privoxy logo. hence removed the option.

 Revision 1.54  2002/03/24 15:46:20  swa
 name change related issue.

 Revision 1.53  2002/03/24 11:51:00  swa
 name change. changed filenames.

 Revision 1.52  2002/03/24 11:01:06  swa
 name change

 Revision 1.51  2002/03/23 15:13:11  swa
 renamed every reference to the old name with foobar.
 fixed "application foobar application" tag, fixed
 "the foobar" with "foobar". left junkbustser in cvs
 comments and remarks to history untouched.

 Revision 1.50  2002/03/23 05:06:21  hal9
 Touch up.

 Revision 1.49  2002/03/21 17:01:05  hal9
 New section in Appendix.

 Revision 1.48  2002/03/12 06:33:01  hal9
 Catching up to Andreas and re_filterfile changes.

 Revision 1.47  2002/03/11 13:13:27  swa
 correct feedback channels

 Revision 1.46  2002/03/10 00:51:08  hal9
 Added section on JB internal pages in Appendix.

 Revision 1.45  2002/03/09 17:43:53  swa
 more distros

 Revision 1.44  2002/03/09 17:08:48  hal9
 New section on Jon's actions file editor, and move some stuff around.

 Revision 1.43  2002/03/08 00:47:32  hal9
 Added imageblock{pattern}.

 Revision 1.42  2002/03/07 18:16:55  swa
 looks better

 Revision 1.41  2002/03/07 16:46:43  hal9
 Fix a few markup problems for jade.

 Revision 1.40  2002/03/07 16:28:39  swa
 provide correct feedback channels

 Revision 1.39  2002/03/06 16:19:28  hal9
 Note on perceived filtering slowdown per FR.

 Revision 1.38  2002/03/05 23:55:14  hal9
 Stupid I did it again. Double hyphen in comment breaks jade.

 Revision 1.37  2002/03/05 23:53:49  hal9
 jade barfs on '- -' embedded in comments. - -user option broke it.

 Revision 1.36  2002/03/05 22:53:28  hal9
 Add new - - user option.

 Revision 1.35  2002/03/05 00:17:27  hal9
 Added section on command line options.

 Revision 1.34  2002/03/04 19:32:07  oes
 Changed default port to 8118

 Revision 1.33  2002/03/03 19:46:13  hal9
 Emphasis on where/how to report bugs, etc

 Revision 1.32  2002/03/03 09:26:06  joergs
 AmigaOS changes, config is now loaded from PROGDIR: instead of
 AmiTCP:db/junkbuster/ if no configuration file is specified on the
 command line.

 Revision 1.31  2002/03/02 22:45:52  david__schmidt
 Just tweaking

 Revision 1.30  2002/03/02 22:00:14  hal9
 Updated 'New Features' list. Ran through spell-checker.

 Revision 1.29  2002/03/02 20:34:07  david__schmidt
 Update OS/2 build section

 Revision 1.28  2002/02/24 14:34:24  jongfoster
 Formatting changes.  Now changing the doctype to DocBook XML 4.1
 will work - no other changes are needed.

 Revision 1.27  2002/01/11 14:14:32  hal9
 Added a very short section on Templates

 Revision 1.26  2002/01/09 20:02:50  hal9
 Fix bug re: auto-detect config file changes.

 Revision 1.25  2002/01/09 18:20:30  hal9
 Touch ups for *.action files.

 Revision 1.24  2001/12/02 01:13:42  hal9
 Fix typo.

 Revision 1.23  2001/12/02 00:20:41  hal9
 Updates for recent changes.

 Revision 1.22  2001/11/05 23:57:51  hal9
 Minor update for startup now daemon mode.

 Revision 1.21  2001/10/31 21:11:03  hal9
 Correct 2 minor errors

 Revision 1.18  2001/10/24 18:45:26  hal9
 *** empty log message ***

 Revision 1.17  2001/10/24 17:10:55  hal9
 Catching up with Jon's recent work, and a few other things.

 Revision 1.16  2001/10/21 17:19:21  swa
 wrong url in documentation

 Revision 1.15  2001/10/14 23:46:24  hal9
 Various minor changes. Fleshed out SEE ALSO section.

 Revision 1.13  2001/10/10 17:28:33  hal9
 Very minor changes.

 Revision 1.12  2001/09/28 02:57:04  hal9
 Ditto :/

 Revision 1.11  2001/09/28 02:25:20  hal9
 Ditto.

 Revision 1.9  2001/09/27 23:50:29  hal9
 A few changes. A short section on regular expression in appendix.

 Revision 1.8  2001/09/25 00:34:59  hal9
 Some additions, and re-arranging.

 Revision 1.7  2001/09/24 14:31:36  hal9
 Diddling.

 Revision 1.6  2001/09/24 14:10:32  hal9
 Including David's OS/2 installation instructions.

 Revision 1.2  2001/09/13 15:27:40  swa
 cosmetics

 Revision 1.1  2001/09/12 15:36:41  swa
 source files for junkbuster documentation

 Revision 1.3  2001/09/10 17:43:59  swa
 first proposal of a structure.

 Revision 1.2  2001/06/13 14:28:31  swa
 docs should have an author.

 Revision 1.1  2001/06/13 14:20:37  swa
 first import of project's documentation for the webserver.

 -->

</article>
