Remove some entries from the previous release that snuck in
[privoxy.git] / doc / source / user-manual.sgml
1 <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
2 <!entity % dummy "IGNORE">
3 <!entity supported SYSTEM "supported.sgml">
4 <!entity newfeatures SYSTEM "newfeatures.sgml">
5 <!entity p-intro SYSTEM "privoxy.sgml">
6 <!entity seealso SYSTEM "seealso.sgml">
7 <!entity buildsource SYSTEM "buildsource.sgml">
8 <!entity contacting SYSTEM "contacting.sgml">
9 <!entity history SYSTEM "history.sgml">
10 <!entity copyright SYSTEM "copyright.sgml">
11 <!entity license SYSTEM "license.sgml">
12 <!entity p-authors SYSTEM "p-authors.sgml">
13 <!entity config SYSTEM "p-config.sgml">
14 <!entity p-version "3.0.20">
15 <!entity p-status "beta">
16 <!entity % p-authors-formal "INCLUDE"> <!-- include additional text, etc  -->
17 <!entity % p-not-stable "INCLUDE">
18 <!entity % p-stable "IGNORE">
19 <!entity % p-text "IGNORE">        <!-- define we are not a text only doc -->
20 <!entity % p-doc "INCLUDE">        <!-- and we are a formal doc           -->
21 <!entity % p-readme "IGNORE">
22 <!entity % user-man "IGNORE">
23 <!entity % config-file "IGNORE">
24 <!entity % p-supp-userman "IGNORE"> <!-- Omit some from supported.sgml    -->
25 <!entity  my-copy "&copy;">         <!-- kludge for docbook2man           -->
26 <!entity % draft "IGNORE">          <!-- WIP stuff    -->
27 <!entity % seealso-extra "INCLUDE"> <!-- extra stuff from seealso.sgml    -->
28 <!entity  my-app "<application>Privoxy</application>">
29 ]>
30 <!--
31  File        :  $Source: /cvsroot/ijbswa/current/doc/source/user-manual.sgml,v $
32
33  Purpose     :  user manual
34                 This file belongs into
35                 ijbswa.sourceforge.net:/home/groups/i/ij/ijbswa/htdocs/
36
37  $Id: user-manual.sgml,v 2.161 2013/01/12 12:21:38 fabiankeil Exp $
38
39  Copyright (C) 2001-2013 Privoxy Developers http://www.privoxy.org/
40  See LICENSE.
41
42  ========================================================================
43  NOTE: Please read developer-manual/documentation.html before touching
44  anything in this, or other Privoxy documentation.
45  ========================================================================
46
47 -->
48
49 <article id="index">
50 <artheader>
51
52 <title>Privoxy &p-version; User Manual</title>
53
54 <pubdate>
55  <subscript>
56 <!-- Completely the wrong markup, but very little is allowed  -->
57 <!-- in this part of an article. FIXME -->
58  <link linkend="copyright">Copyright</link> &my-copy; 2001-2013 by
59  <ulink url="http://www.privoxy.org/">Privoxy Developers</ulink>
60  </subscript>
61 </pubdate>
62
63 <pubdate>$Id: user-manual.sgml,v 2.161 2013/01/12 12:21:38 fabiankeil Exp $</pubdate>
64
65 <!--
66
67 Note: the following should generate a separate page, and a live link to it,
68 all nicely done. But it doesn't for some mysterious reason. Please leave
69 commented unless it can be fixed proper. For the time being, the
70 copyright/license declarations will be in their own sgml.
71
72 Hal.
73
74
75 -->
76
77
78 <abstract>
79
80 <![%dummy;[
81  <para>
82  <comment>
83   This is here to keep vim syntax file from breaking :/
84   If I knew enough to fix it, I would.
85   PLEASE DO NOT REMOVE! HB: hal@foobox.net
86  </comment>
87  </para>
88 ]]>
89
90  <para>
91   The <citetitle>Privoxy User Manual</citetitle> gives users information on how to
92   install, configure and use <ulink
93   url="http://www.privoxy.org/">Privoxy</ulink>.
94  </para>
95
96 <!-- Include privoxy.sgml boilerplate: -->
97  &p-intro;
98 <!-- end privoxy.sgml -->
99
100  <para>
101   You can find the latest version of the <citetitle>Privoxy User Manual</citetitle> at  <ulink
102   url="http://www.privoxy.org/user-manual/">http://www.privoxy.org/user-manual/</ulink>.
103   Please see the <link linkend="contact">Contact section</link> on how to
104   contact the developers.
105  </para>
106
107 <!--   <para> -->
108 <!--    Feel free to send a note to the developers at <email>ijbswa-developers@lists.sourceforge.net</email>. -->
109 <!--   </para> -->
110 </abstract>
111
112 </artheader>
113
114 <!--   ~~~~~       New section      ~~~~~     -->
115 <sect1 label="1" id="introduction"><title>Introduction</title>
116 <para>
117  This documentation is included with the current &p-status; version of
118  <application>Privoxy</application>, v.&p-version;<![%p-not-stable;[,
119  and is mostly complete at this point. The most up to date reference for the
120  time being is still the comments in the source files and in the individual
121  configuration files. Development of a new version is currently nearing
122  completion, and includes significant changes and enhancements over
123  earlier versions]]>.
124 </para>
125
126 <!-- include only in non-stable versions -->
127 <![%p-not-stable;[
128 <para>
129  Since this is a &p-status; version, not all new features are well tested. This
130  documentation may be slightly out of sync as a result (especially with
131  CVS sources). And there <emphasis>may be</emphasis> bugs, though hopefully
132  not many!
133 </para>
134 ]]>
135
136 <!--   ~~~~~       New section      ~~~~~     -->
137 <sect2 id="features"><title>Features</title>
138 <para>
139  In addition to the core
140  features of ad blocking and
141  <ulink url="http://en.wikipedia.org/wiki/Browser_cookie">cookie</ulink> management,
142  <application>Privoxy</application> provides many supplemental
143  features<![%p-not-stable;[, some of them currently under development]]>,
144  that give the end-user more control, more privacy and more freedom:
145 </para>
146 <!-- Include newfeatures.sgml boilerplate here: -->
147  &newfeatures;
148 <!-- end boilerplate -->
149 </sect2>
150
151 </sect1>
152
153 <!--  ~  End section  ~  -->
154
155
156 <!--   ~~~~~       New section      ~~~~~     -->
157 <sect1 id="installation"><title>Installation</title>
158
159 <para>
160  <application>Privoxy</application> is available both in convenient pre-compiled
161  packages for a wide range of operating systems, and as raw source code.
162  For most users, we recommend using the packages, which can be downloaded from our
163  <ulink url="http://sourceforge.net/projects/ijbswa/">Privoxy Project
164  Page</ulink>.
165 </para>
166
167 <para>
168  Note:
169  On some platforms, the installer may remove previously installed versions, if
170  found. (See below for your platform). In any case <emphasis>be sure to backup
171  your old configuration if it is valuable to you.</emphasis> See the <link
172  linkend="upgradersnote">note to upgraders</link> section below.
173 </para>
174
175 <!--   ~~~~~       New section      ~~~~~     -->
176 <sect2 id="installation-packages"><title>Binary Packages</title>
177 <para>
178 How to install the binary packages depends on your operating system:
179 </para>
180
181 <!-- XXX: The installation sections should be sorted -->
182
183 <!--   ~~~~~       New section      ~~~~~     -->
184 <sect3 id="installation-deb"><title>Debian and Ubuntu</title>
185 <para>
186  DEBs can be installed with <literal>apt-get install privoxy</literal>,
187  and will use <filename>/etc/privoxy</filename> for the location of
188  configuration files.
189 </para>
190 </sect3>
191
192 <!--   ~~~~~       New section      ~~~~~     -->
193 <sect3 id="installation-pack-win"><title>Windows</title>
194
195 <para>
196  Just double-click the installer, which will guide you through
197  the installation process. You will find the configuration files
198  in the same directory as you installed <application>Privoxy</application> in.
199 </para>
200 <para>
201  Version 3.0.5 beta introduced full <application>Windows</application> service
202  functionality. On Windows only, the <application>Privoxy</application>
203  program has two new command line arguments to install and uninstall
204  <application>Privoxy</application> as a <emphasis>service</emphasis>.
205 </para>
206  <variablelist>
207   <varlistentry>
208    <term>Arguments:</term>
209    <listitem>
210     <para>
211      <replaceable class="parameter">--install</replaceable>[:<replaceable class="parameter">service_name</replaceable>]
212     </para>
213     <para>
214      <replaceable class="parameter">--uninstall</replaceable>[:<replaceable class="parameter">service_name</replaceable>]
215     </para>
216    </listitem>
217   </varlistentry>
218  </variablelist>
219  <para>
220  After invoking <application>Privoxy</application> with
221  <command>--install</command>, you will need to bring up the
222  <application>Windows</application> service console to assign the user you
223  want <application>Privoxy</application> to run under, and whether or not you
224  want it to run whenever the system starts. You can start the
225  <application>Windows</application> services console with the following
226  command: <command>services.msc</command>.  If you do not take the manual step
227  of modifying <application>Privoxy's</application> service settings, it will
228  not start.  Note too that you will need to give Privoxy a user account that
229  actually exists, or it will not be permitted to
230  write to its log and configuration files.
231 </para>
232
233 </sect3>
234
235 <!--   ~~~~~       New section      ~~~~~     -->
236 <sect3 id="installation-os2"><title>OS/2</title>
237
238 <para>
239  First, make sure that no previous installations of
240  <application>Junkbuster</application> and / or
241  <application>Privoxy</application> are left on your
242  system. Check that no <application>Junkbuster</application>
243  or <application>Privoxy</application> objects are in
244  your startup folder.
245
246 </para>
247
248 <para>
249  Then, just double-click the WarpIN self-installing archive, which will
250  guide you through the installation process. A shadow of the
251  <application>Privoxy</application> executable will be placed in your
252  startup folder so it will start automatically whenever OS/2 starts.
253 </para>
254
255 <para>
256  The directory you choose to install <application>Privoxy</application>
257  into will contain all of the configuration files.
258 </para>
259 </sect3>
260
261 <!--   ~~~~~       New section      ~~~~~     -->
262 <sect3 id="installation-mac"><title>Mac OS X</title>
263 <para>
264  Installation instructions for the OS X platform depend upon whether
265  you downloaded a ready-built installation package (.pkg or .mpkg) or have
266  downloaded the source code.
267 </para>
268 </sect3>
269 <sect3 renderas="sect4" id="OS-X-install-from-package">
270 <title>Installation from ready-built package</title>
271 <para>
272  The downloaded file will either be a .pkg (for OS X 10.5 upwards) or a bzipped
273  .mpkg file (for OS X 10.4). The former can be double-clicked as is and the
274  installation will start; double-clicking the latter will unzip the .mpkg file
275  which can then be double-clicked to commence the installation.
276 </para>
277 <para>
278  The privoxy service will automatically start after a successful installation
279  (and thereafter every time your computer starts up) however you will need to
280  configure your web browser(s) to use it. To do so, configure them to use a
281  proxy for HTTP and HTTPS at the address 127.0.0.1:8118.
282 </para>
283 <para>
284  To prevent the privoxy service from automatically starting when your computer
285  starts up, remove or rename the file <literal>/Library/LaunchDaemons/org.ijbswa.privoxy.plist</literal>
286  (on OS X 10.5 and higher) or the folder named
287  <literal>/Library/StartupItems/Privoxy</literal> (on OS X 10.4 'Tiger').
288 </para>
289 <para>
290  To manually start or stop the privoxy service, use the scripts startPrivoxy.sh
291  and stopPrivoxy.sh supplied in /Applications/Privoxy. They must be run from an
292  administrator account, using sudo.
293 </para>
294 <para>
295  To uninstall, run /Applications/Privoxy/uninstall.command as sudo from an
296  administrator account.
297 </para>
298 </sect3>
299 <sect3 renderas="sect4" id="OS-X-install-from-source">
300 <title>Installation from source</title>
301 <para>
302  To build and install the Privoxy source code on OS X you will need to obtain
303  the macsetup module from the Privoxy Sourceforge CVS repository (refer to
304  Sourceforge help for details of how to set up a CVS client to have read-only
305  access to the repository). This module contains scripts that leverage the usual
306  open-source tools (available as part of Apple's free of charge Xcode
307  distribution or via the usual open-source software package managers for OS X
308  (MacPorts, Homebrew, Fink etc.) to build and then install the privoxy binary
309  and associated files. The macsetup module's README file contains complete
310  instructions for its use.
311 </para>
312 <para>
313  The privoxy service will automatically start after a successful installation
314  (and thereafter every time your computer starts up) however you will need to
315  configure your web browser(s) to use it. To do so, configure them to use a
316  proxy for HTTP and HTTPS at the address 127.0.0.1:8118.
317 </para>
318 <para>
319  To prevent the privoxy service from automatically starting when your computer
320  starts up, remove or rename the file <literal>/Library/LaunchDaemons/org.ijbswa.privoxy.plist</literal>
321  (on OS X 10.5 and higher) or the folder named
322  <literal>/Library/StartupItems/Privoxy</literal> (on OS X 10.4 'Tiger').
323 </para>
324 <para>
325  To manually start or stop the privoxy service, use the Privoxy Utility
326  for Mac OS X (also part of the macsetup module).  This application can start
327  and stop the privoxy service and display its log and configuration files.
328 </para>
329 <para>
330  To uninstall, run the macsetup module's uninstall.sh as sudo from an
331  administrator account.
332 </para>
333 </sect3>
334
335 <!--   ~~~~~       New section      ~~~~~     -->
336 <sect3 id="installation-tbz"><title>FreeBSD</title>
337
338 <para>
339  Privoxy is part of FreeBSD's Ports Collection, you can build and install
340  it with <literal>cd /usr/ports/www/privoxy; make install clean</literal>.
341 </para>
342 <para>
343  If you don't use the ports, you can fetch and install
344  the package with <literal>pkg_add -r privoxy</literal>.
345 </para>
346 <para>
347  The port skeleton and the package can also be downloaded from the
348  <ulink url="https://sourceforge.net/project/showfiles.php?group_id=11118">File Release
349  Page</ulink>, but there's no reason to use them unless you're interested in the
350  beta releases which are only available there.
351 </para>
352 </sect3>
353
354 </sect2>
355
356 <!--   ~~~~~       New section      ~~~~~     -->
357 <sect2 id="installation-source"><title>Building from Source</title>
358
359 <para>
360  The most convenient way to obtain the <application>Privoxy</application> sources
361  is to download the source tarball from our
362  <ulink url="http://sourceforge.net/project/showfiles.php?group_id=11118&amp;package_id=10571">project download
363  page</ulink>.
364 </para>
365
366 <para>
367  If you like to live on the bleeding edge and are not afraid of using
368  possibly unstable development versions, you can check out the up-to-the-minute
369  version directly from <ulink url="http://sourceforge.net/cvs/?group_id=11118">the
370  CVS repository</ulink>.
371 <!--
372  deprecated...out of business.
373  or simply download <ulink
374  url="http://cvs.sourceforge.net/cvstarballs/ijbswa-cvsroot.tar.bz2">the nightly CVS
375  tarball.</ulink>
376 -->
377 </para>
378
379 <!-- include buildsource.sgml boilerplate: -->
380 &buildsource;
381 <!-- end boilerplate -->
382
383 </sect2>
384 <!--   ~~~~~       New section      ~~~~~     -->
385 <sect2 id="installation-keepupdated"><title>Keeping your Installation Up-to-Date</title>
386
387 <para>
388  If you wish to receive an email notification whenever we release updates of
389  <application>Privoxy</application> or the actions file, <ulink
390  url="http://lists.sourceforge.net/lists/listinfo/ijbswa-announce/">subscribe
391  to our announce  mailing list</ulink>, ijbswa-announce@lists.sourceforge.net.
392 </para>
393
394 <para>
395  In order not to lose your personal changes and adjustments when updating
396  to the latest <literal>default.action</literal> file we <emphasis>strongly
397  recommend</emphasis> that you use <literal>user.action</literal> and
398  <literal>user.filter</literal> for your local
399  customizations of <application>Privoxy</application>. See the <link
400  linkend="actions-file">Chapter on actions files</link> for details.
401 </para>
402
403 </sect2>
404
405
406 </sect1>
407
408 <!--  ~  End section  ~  -->
409
410 <!--   ~~~~~       New section      ~~~~~     -->
411 <sect1 id="whatsnew">
412 <title>What's New in this Release</title>
413 <para>
414  <application>Privoxy 3.0.20</application> is a beta release.
415  The changes since 3.0.19 stable are:
416 </para>
417
418 <para>
419  <itemizedlist>
420     <listitem>
421    <para>
422     Bug fixes:
423     <itemizedlist>
424     <listitem>
425      <para>
426       Client sockets are now properly shutdown and drained before being
427       closed. This fixes page truncation issues with clients that aggressively
428       pipeline data on platforms that otherwise discard already written data.
429       The issue mainly affected Opera users and was initially reported
430       by Kevin in #3464439, szotsaki provided additional information to track
431       down the cause.
432      </para>
433     </listitem>
434     <listitem>
435      <para>
436       Fix latency calculation for shared connections (disabled by default).
437       It was broken since their introduction in 2009. The calculated latency
438       for most connections would be 0 in which case the timeout detection
439       failed to account for the real latency.
440      </para>
441     </listitem>
442     <listitem>
443      <para>
444       Reject URLs with invalid port. Previously they were parsed incorrectly and
445       characters between the port number and the first slash were silently
446       dropped as shown by curl test 187.
447      </para>
448     </listitem>
449     <listitem>
450      <para>
451       The default-server-timeout and socket-timeout directives accept 0 as
452       valid value.
453      </para>
454     </listitem>
455     <listitem>
456      <para>
457       Fix a race condition on Windows that could cause Privoxy to become
458       unresponsive after toggling it on or off through the taskbar icon.
459       Reported by Tim H. in #3525694.
460      </para>
461     </listitem>
462     <listitem>
463      <para>
464       Fix the compilation on Windows when configured without IPv6 support.
465      </para>
466     </listitem>
467     <listitem>
468      <para>
469       Fix an assertion that could cause debug builds to abort() in case of
470       socks5 connection failures with "debug 2" enabled.
471      </para>
472     </listitem>
473     <listitem>
474      <para>
475       Fix an assertion that could cause debug builds to abort() if a filter
476       contained nul bytes in the replacement text.
477      </para>
478      </listitem>
479     </itemizedlist>
480    </para>
481   </listitem>
482   <listitem>
483    <para>
484     General improvements:
485     <itemizedlist>
486     <listitem>
487      <para>
488       Significantly improved keep-alive support for both client and server
489       connections.
490      </para>
491     </listitem>
492     <listitem>
493      <para>
494       New debug log level 65536 which logs all actions that were applied to
495       the request.
496      </para>
497     </listitem>
498     <listitem>
499      <para>
500       New directive client-header-order to forward client headers in a
501       different order than the one in which they arrived.
502      </para>
503     </listitem>
504     <listitem>
505      <para>
506       New directive tolerate-pipelining to allow client-side pipelining.
507       If enabled (3.0.20 beta enables it by default), Privoxy will keep
508       pipelined client requests around to deal with them once the current
509       request has been served.
510      </para>
511     </listitem>
512     <listitem>
513      <para>
514       New --config-test option to let Privoxy exit after checking whether or not
515       the configuration seems valid. The limitations noted in TODO #22 and #23
516       still apply. Based on a patch by Ramkumar Chinchani.
517      </para>
518     </listitem>
519     <listitem>
520      <para>
521       New limit-cookie-lifetime{} action to let cookies expire before the end
522       of the session. Suggested by Rick Sykes in #1049575.
523      </para>
524     </listitem>
525     <listitem>
526      <para>
527       Increase the hard-coded maximum number of actions and filter files from
528       10 to 30 (each). It doesn't significantly affect Privoxy's memory usage
529       and recompiling wasn't an option for all Privoxy users that reached the
530       limit.
531      </para>
532     </listitem>
533     <listitem>
534      <para>
535       Add support for chunk-encoded client request bodies. Previously
536       chunk-encoded request bodies weren't guaranteed to be forwarded correctly,
537       so this can also be considered a bug fix although chunk-encoded request
538       bodies aren't commonly used in the real world.
539      </para>
540     </listitem>
541     <listitem>
542      <para>
543       Add support for Tor's optimistic-data SOCKS extension, which can reduce the
544       latency for requests on newly created connections. Currently only the
545       headers are sent optimistically and only if the client request has already
546       been read completely which rules out requests with large bodies.
547      </para>
548     </listitem>
549     <listitem>
550      <para>
551       After preventing the client from pipelining, don't signal keep-alive
552       intentions. When looking at the response headers alone, it previously
553       wasn't obvious from the client's perspective that no additional responses
554       should be expected.
555      </para>
556     </listitem>
557     <listitem>
558      <para>
559       Stop considering client sockets tainted after receving a request with body.
560       It hasn't been necessary for a while now and unnecessarily causes test
561       failures when using curl's test suite.
562      </para>
563     </listitem>
564     <listitem>
565      <para>
566       Allow HTTP/1.0 clients to signal interest in keep-alive through the
567       Proxy-Connection header. While such client are rare in the real world, it
568       doesn't hurt and couple of curl tests rely on it.
569      </para>
570     </listitem>
571     <listitem>
572      <para>
573       Only remove duplicated Content-Type headers when filters are enabled.
574       If they are not it doesn't cause ill effects and the user might not want it.
575       Downgrade the removal message to LOG_LEVEL_HEADER to clarify that it's not
576       an error in Privoxy and is unlikely to cause any problems in general.
577       Anonymously reported in #3599335.
578      </para>
579     </listitem>
580     <listitem>
581      <para>
582       Set the socket option SO_LINGER for the client socket.
583      </para>
584     </listitem>
585     <listitem>
586      <para>
587       Move several variable declarations to the beginning of their code block.
588       It's required when compiling with gcc 2.95 which is still used on some
589       platforms. Initial patch submitted by Simon South in #3564815.
590      </para>
591     </listitem>
592     <listitem>
593      <para>
594       Optionally try to sanity-check strptime() results before trusting them.
595       Broken strptime() implementations have caused problems in the past and
596       the most recent offender seems to be FreeBSD's libc (standards/173421).
597      </para>
598     </listitem>
599     <listitem>
600      <para>
601       When filtering is enabled, let Range headers pass if the range starts at
602       the beginning. This should work around (or at least reduce ) the video
603       playback issues with various Apple clients as reported by Duc in #3426305.
604      </para>
605     </listitem>
606     <listitem>
607      <para>
608       Do not confuse a client hanging up with a connection time out. If a client
609       closes its side of the connection without sending a request line, do not
610       send the CLIENT_CONNECTION_TIMEOUT_RESPONSE, but report the condition
611       properly.
612      </para>
613     </listitem>
614     <listitem>
615      <para>
616       Allow closing curly braces as part of action values as long as they are
617       escaped.
618      </para>
619     </listitem>
620     <listitem>
621      <para>
622       On Windows, the logfile is now written before showing the GUI error
623       message which blocks until the user acknowledges it.
624       Reported by Adriaan in #3593603.
625      </para>
626     </listitem>
627     <listitem>
628      <para>
629       Remove an unreasonable parameter limit in the CGI interface. The new
630       parameter limit depends on the memory available and is currently unlikely
631       to be reachable, due to other limits in both Privoxy and common clients.
632       Reported by Andrew on ijbswa-users@.
633      </para>
634     </listitem>
635     <listitem>
636      <para>
637       Decrease the chances of parse failures after requests with unsupported
638       methods were sent to the CGI interface.
639      </para>
640      </listitem>
641     </itemizedlist>
642    </para>
643   </listitem>
644   <listitem>
645    <para>
646     Action file improvements:
647     <itemizedlist>
648     <listitem>
649      <para>
650       Remove the comment that indicated that updated default.action versions
651       are released on their own.
652      </para>
653     </listitem>
654     <listitem>
655      <para>
656       Block 'optimize.indieclick.com/' and 'optimized-by.rubiconproject.com/'
657      </para>
658     </listitem>
659     <listitem>
660      <para>
661       Unblock 'adjamblog.wordpress.com/' and 'adjamblog.files.wordpress.com/'.
662       Reported by Ryan Farmer in #3496116.
663      </para>
664     </listitem>
665     <listitem>
666      <para>
667       Unblock '/.*Bugtracker'. Reported by pwhk in #3522341.
668      </para>
669     </listitem>
670     <listitem>
671      <para>
672       Add test URLs for '.freebsd.org' and '.watson.org'.
673      </para>
674     </listitem>
675     <listitem>
676      <para>
677       Unblock '.urbandictionary.com/popular'.
678      </para>
679     </listitem>
680     <listitem>
681      <para>
682       Block '.adnxs.com/'.
683      </para>
684     </listitem>
685     <listitem>
686      <para>
687       Block 'farm.plista.com/widgetdata.php'.
688      </para>
689     </listitem>
690     <listitem>
691      <para>
692       Block 'rotation.linuxnewmedia.com/'.
693      </para>
694     </listitem>
695     <listitem>
696      <para>
697       Block 'reklamy.sfd.pl/'. Reported by kacperdominik in #3399948.
698      </para>
699     </listitem>
700     <listitem>
701      <para>
702       Block 'g.adspeed.net/'.
703      </para>
704     </listitem>
705     <listitem>
706      <para>
707       Unblock 'websupport.wdc.com/'. Reported by Adam Piggot in #3577851.
708      </para>
709     </listitem>
710     <listitem>
711      <para>
712       Block '/openx/www/delivery/'.
713      </para>
714     </listitem>
715     <listitem>
716      <para>
717       Disable fast-redirects for '.googleapis.com/'.
718      </para>
719     </listitem>
720     <listitem>
721      <para>
722       Block 'imp.double.net/'. Reported by David Bo in #3070411.
723      </para>
724     </listitem>
725     <listitem>
726      <para>
727       Block 'gm-link.com/' whis is used for email tracking.
728       Reported by David Bo in #1812733.
729      </para>
730     </listitem>
731     <listitem>
732      <para>
733       Verify that requests to "bwp." are blocked. URL taken from #1736879
734       submitted by Francois Marier.
735      </para>
736     </listitem>
737     <listitem>
738      <para>
739       Block '/.*bannerid='. Reported by Adam Piggott in #2975779.
740      </para>
741     </listitem>
742     <listitem>
743      <para>
744       Block 'cltomedia.info/delivery/' and '.adexprt.com/'.
745       Anonymously reported in #2965254.
746      </para>
747     </listitem>
748     <listitem>
749      <para>
750       Block 'de17a.com/'. Reported by David Bo in #3061472.
751      </para>
752     </listitem>
753     <listitem>
754      <para>
755       Block 'oskar.tradera.com/'. Reported by David Bo in #3060596.
756      </para>
757     </listitem>
758     <listitem>
759      <para>
760       Block '/scripts/webtrends\.js'. Reported by johnd16 in #3002729.
761      </para>
762     </listitem>
763     <listitem>
764      <para>
765       Block requests for 'pool.*.adhese.com/'. Reported by johnd16 in #3002716.
766      </para>
767     </listitem>
768     <listitem>
769      <para>
770       Update path pattern for Coremetrics and add tests.
771       Pattern and URLs submitted by Adam Piggott #3168443.
772      </para>
773     </listitem>
774     <listitem>
775      <para>
776       Enable +fast-redirects{check-decoded-url} for 'tr.anp.se/'.
777       Reported by David Bo in #3268832.
778      </para>
779     </listitem>
780     <listitem>
781      <para>
782       Unblock '.conrad.se/newsletter/banners/'. Reported by David Bo in #3413824.
783      </para>
784     </listitem>
785     <listitem>
786      <para>
787       Block '.tynt.com/'. Reported by Dan Stahlke in #3421767.
788      </para>
789     </listitem>
790     <listitem>
791      <para>
792       Unblock '.bbci.co.uk/radio/'. Reported by Adam Piggott in #3569603.
793      </para>
794     </listitem>
795     <listitem>
796      <para>
797       Block requests to 'service.maxymiser.net/'.
798       Reported by johnd16 in #3118401 (with a previous URL).
799      </para>
800     </listitem>
801     <listitem>
802      <para>
803       Disable fast-redirects for Google's "let's pretend your computer is
804       infected" page.
805      </para>
806     </listitem>
807     <listitem>
808      <para>
809       Unblock '/.*download' to resolve actionsfile feedback #3498129.
810       Submitted by Steven Kolins (soundcloud.com not working).
811      </para>
812     </listitem>
813     <listitem>
814      <para>
815       Unblock '.wlxrs.com/' which is required by hotmail.com.
816       Fixes #3413827 submitted by David Bo.
817      </para>
818     </listitem>
819     <listitem>
820      <para>
821       Add two unblock patterns for popup radio and TV players.
822       Submitted by Adam Piggott in #3596089.
823      </para>
824      </listitem>
825     </itemizedlist>
826    </para>
827   </listitem>
828   <listitem>
829    <para>
830     Filter file improvements & bug fixes:
831     <itemizedlist>
832     <listitem>
833      <para>
834       Add a referer tagger.
835      </para>
836     </listitem>
837     <listitem>
838      <para>
839       Reduce the likelihood that the google filter messes up HTML-generating
840       JavaScript. Reported by Zeno Kugy in #3520260.
841      </para>
842      </listitem>
843     </itemizedlist>
844    </para>
845   </listitem>
846   <listitem>
847    <para>
848     Documentation improvements:
849     <itemizedlist>
850     <listitem>
851      <para>
852       Revised all OS X sections due to new packaging module (OSXPackageBuilder).
853      </para>
854     </listitem>
855     <listitem>
856      <para>
857       Update the list of supported operating systems to clarify that all Windows
858       versions after 95 are expected to work and note that the platform-specific
859       code for AmigaOS and QNX currently isn't maintained.
860      </para>
861     </listitem>
862     <listitem>
863      <para>
864       Update 'Signals' section, the only explicitly handled signals are SIGINT,
865       SIGTERM and SIGHUP.
866      </para>
867     </listitem>
868     <listitem>
869      <para>
870       Add Haiku to the list of operating systems on which Privoxy is known to
871       run.
872      </para>
873     </listitem>
874     <listitem>
875      <para>
876       Add DragonFly to the list of BSDs on which Privoxy is known to run.
877      </para>
878     </listitem>
879     <listitem>
880      <para>
881       Removed references to redhat-specific documentation set since it no longer
882       exists.
883      </para>
884     </listitem>
885     <listitem>
886      <para>
887       Removed references to building PDFs since we no longer do so.
888      </para>
889     </listitem>
890     <listitem>
891      <para>
892       Multiple listen-address directives are supported since 3.0.18, correct the
893       documentation to say so.
894      </para>
895     </listitem>
896     <listitem>
897      <para>
898       Remove bogus section about long and short being preferable to int.
899      </para>
900     </listitem>
901     <listitem>
902      <para>
903       Corrected some Internet JunkBuster references to Privoxy.
904      </para>
905     </listitem>
906     <listitem>
907      <para>
908       Removed references to www.junkbusters.com since it is no longer
909       maintained. Reported by Angelina Matson.
910      </para>
911     </listitem>
912     <listitem>
913      <para>
914       Various grammar and spelling corrections
915      </para>
916     </listitem>
917     <listitem>
918      <para>
919       Add a client-header-tagger{} example for disabling filtering for range
920       requests.
921      </para>
922     </listitem>
923     <listitem>
924      <para>
925       Correct a URL in the "Privoxy with Tor" FAQ.
926      </para>
927     </listitem>
928     <listitem>
929      <para>
930       Spell 'refresh-tags' correctly. Reported by Don in #3571927.
931      </para>
932     </listitem>
933     <listitem>
934      <para>
935       Sort manpage options alphabetically.
936      </para>
937     </listitem>
938     <listitem>
939      <para>
940       Remove an incorrect sentence in the toggle section. The toggle state
941       doesn't affect whether or not the Windows version uses the tray icon.
942       Reported by Zeno Kugy in #3596395.
943      </para>
944     </listitem>
945     <listitem>
946      <para>
947       Add new contributors since 3.0.19.
948      </para>
949      </listitem>
950     </itemizedlist>
951    </para>
952   </listitem>
953   <listitem>
954    <para>
955     Log message improvements:
956     <itemizedlist>
957     <listitem>
958      <para>
959       When stopping to watch a client socket due to pipelining, additionally log
960       the socket number.
961      </para>
962     </listitem>
963     <listitem>
964      <para>
965       Log the client socket and its condition before closing it. This makes it
966       more obvious that the socket actually gets closed and should help when
967       diagnosing problems like #3464439.
968      </para>
969     </listitem>
970     <listitem>
971      <para>
972       In case of SOCKS5 failures, do not explicitly log the server's response.
973       It hasn't helped so far and the response can already be logged by enabling
974       "debug 32768" anyway. This reverts v1.81 and the follow-up bug fix v1.84.
975      </para>
976     </listitem>
977     <listitem>
978      <para>
979       Relocate the connection-accepted message from listen_loop() to serve().
980       This way it's printed by the thread that is actually serving the
981       connection which is nice when grepping for thread ids in log files.
982      </para>
983      </listitem>
984     </itemizedlist>
985    </para>
986   </listitem>
987   <listitem>
988    <para>
989     Code cleanups:
990     <itemizedlist>
991     <listitem>
992      <para>
993       Remove compatibility layer for versions prior to 3.0 since it has been
994       obsolete for more than 10 years now.
995      </para>
996     </listitem>
997     <listitem>
998      <para>
999       Remove the ijb_isupper() and ijb_tolower() macros from parsers.c since
1000       they aren't used in this file.
1001      </para>
1002     </listitem>
1003     <listitem>
1004      <para>
1005       Removed the 'Functions declared include:' comment sections since they tend
1006       to be incomplete, incorrect and out of date and the benefit seems
1007       questionable.
1008      </para>
1009     </listitem>
1010     <listitem>
1011      <para>
1012       Various comment grammar and comprehensibility improvements.
1013      </para>
1014     </listitem>
1015     <listitem>
1016      <para>
1017       Remove a pointless fflush() call in chat(). Flushing all streams pretty
1018       much all the time for no obvious reason is ridiculous.
1019      </para>
1020     </listitem>
1021     <listitem>
1022      <para>
1023       Relocate ijb_isupper()'s definition to project.h and get the ijb_tolower()
1024       definition from there, too.
1025      </para>
1026     </listitem>
1027     <listitem>
1028      <para>
1029       Relocate ijb_isdigit()'s definition to project.h.
1030      </para>
1031     </listitem>
1032     <listitem>
1033      <para>
1034       Rename ijb_foo macros to privoxy_foo.
1035      </para>
1036     </listitem>
1037     <listitem>
1038      <para>
1039       Add malloc_or_die() which will allow to simplify code paths where malloc()
1040       failures don't need to be handled gracefully.
1041      </para>
1042     </listitem>
1043     <listitem>
1044      <para>
1045       Add strdup_or_die() which will allow to simplify code paths where strdup()
1046       failures don't need to be handled gracefully.
1047      </para>
1048     </listitem>
1049     <listitem>
1050      <para>
1051       Replace strdup() calls with strdup_or_die() calls where it's safe and
1052       simplifies the code.
1053      </para>
1054     </listitem>
1055     <listitem>
1056      <para>
1057       Fix white-space around parentheses.
1058      </para>
1059     </listitem>
1060     <listitem>
1061      <para>
1062       Add missing white-space behind if's and the following parentheses.
1063      </para>
1064     </listitem>
1065     <listitem>
1066      <para>
1067       Unwrap a memcpy() call in resolve_hostname_to_ip().
1068      </para>
1069     </listitem>
1070     <listitem>
1071      <para>
1072       Declare pcrs_get_delimiter()'s delimiters[] static const.
1073      </para>
1074     </listitem>
1075     <listitem>
1076      <para>
1077       Various optimisations to remove dead code and merge inefficient code
1078       structures for improved clarity, performance or code compactness.
1079      </para>
1080     </listitem>
1081     <listitem>
1082      <para>
1083       Various data type corrections.
1084      </para>
1085     </listitem>
1086     <listitem>
1087      <para>
1088       Change visibility of several code segments when compiling without
1089       FEATURE_CONNECTION_KEEP_ALIVE enabled for clarity.
1090      </para>
1091     </listitem>
1092     <listitem>
1093      <para>
1094       In pcrs_get_delimiter(), do not use delimiters ouside the ASCII range.
1095       Fixes a clang complaint.
1096      </para>
1097     </listitem>
1098     <listitem>
1099      <para>
1100       Fix an error message in get_last_url() nobody is supposed to see.
1101       Reported by Matthew Fischer in #3507301.
1102      </para>
1103     </listitem>
1104     <listitem>
1105      <para>
1106       Fix a typo in the no-zlib-support complaint. Patch submitted by Matthew
1107       Fischer in #3507304.
1108      </para>
1109     </listitem>
1110     <listitem>
1111      <para>
1112       Shorten ssplit()'s prototype by removing the last two arguments. We always
1113       want to skip empty fields and ignore leading delimiters, so having
1114       parameters for this only complicates the API.
1115      </para>
1116     </listitem>
1117     <listitem>
1118      <para>
1119       Use an enum for the type of the action value.
1120      </para>
1121     </listitem>
1122     <listitem>
1123      <para>
1124       Rename action_name's member takes_value to value_type as it isn't used as
1125       boolean.
1126      </para>
1127     </listitem>
1128     <listitem>
1129      <para>
1130       Turn family mismatches in match_sockaddr() into fatal errors.
1131      </para>
1132     </listitem>
1133     <listitem>
1134      <para>
1135       Let enlist_unique_header() verify that the caller didn't pass a header
1136       containing either \r or \n.
1137      </para>
1138     </listitem>
1139     <listitem>
1140      <para>
1141       Change the hashes used in load_config() to unsigned int. That's what
1142       hash_string() actually returns and using a potentiallly larger type
1143       is at best useless.
1144      </para>
1145     </listitem>
1146     <listitem>
1147      <para>
1148       Use privoxy_tolower() instead of vanilla tolower() with manual casting of
1149       the argument.
1150      </para>
1151     </listitem>
1152     <listitem>
1153      <para>
1154       Catch ssplit() failures in parse_cgi_parameters().
1155      </para>
1156      </listitem>
1157     </itemizedlist>
1158    </para>
1159   </listitem>
1160   <listitem>
1161    <para>
1162     Privoxy-Regression-Test:
1163     <itemizedlist>
1164     <listitem>
1165      <para>
1166       Add an 'Overwrite condition' directive to skip any matching tests before
1167       it. As it has a global scope, using it is more convenient than clowning
1168       around with the Ignore directive.
1169      </para>
1170     </listitem>
1171     <listitem>
1172      <para>
1173       Log to STDOUT instead of STDERR.
1174      </para>
1175     </listitem>
1176     <listitem>
1177      <para>
1178       Include the Privoxy version in the output.
1179      </para>
1180     </listitem>
1181     <listitem>
1182      <para>
1183       Various grammar and spelling corrections in documentation and code.
1184      </para>
1185     </listitem>
1186     <listitem>
1187      <para>
1188       Additional tests for range requests with filtering enabled.
1189      </para>
1190     </listitem>
1191     <listitem>
1192      <para>
1193       Tests with mostly invalid range request.
1194      </para>
1195     </listitem>
1196     <listitem>
1197      <para>
1198       Add a couple of hide-if-modified-since{} tests with different date formats.
1199      </para>
1200     </listitem>
1201     <listitem>
1202      <para>
1203       Cleaned up the format of the regression-tests.action file to match the
1204       format of default.action.
1205      </para>
1206     </listitem>
1207     <listitem>
1208      <para>
1209       Remove the "Copyright" line from print_version(). When using --help, every
1210       line of screen space matters and thus shouldn't be wasted on things the
1211       user doesn't care about.
1212      </para>
1213      </listitem>
1214     </itemizedlist>
1215    </para>
1216   </listitem>
1217   <listitem>
1218    <para>
1219     Privoxy-Log-Parser:
1220     <itemizedlist>
1221     <listitem>
1222      <para>
1223       Improve the --statistics performance by skipping sanity checks for input
1224       that shouldn't affect the results anyway. Add a --strict-checks option
1225       that enables some of the checks again, just in case anybody cares.
1226      </para>
1227     </listitem>
1228     <listitem>
1229      <para>
1230       The distribution of client requests per connection is included in
1231       the --statistic output.
1232      </para>
1233     </listitem>
1234     <listitem>
1235      <para>
1236       The --accept-unknown-messages option has been removed and the behavior
1237       is now the default.
1238      </para>
1239     </listitem>
1240     <listitem>
1241      <para>
1242       Accept and (mostly) highlight new log messages introduced with
1243       Privoxy 3.0.20.
1244      </para>
1245      </listitem>
1246     </itemizedlist>
1247    </para>
1248   </listitem>
1249   <listitem>
1250    <para>
1251     uagen:
1252     <itemizedlist>
1253     <listitem>
1254      <para>
1255       Bump generated Firefox version to 17.
1256      </para>
1257      </listitem>
1258     </itemizedlist>
1259    </para>
1260   </listitem>
1261   <listitem>
1262    <para>
1263     GNUmakefile improvements:
1264     <itemizedlist>
1265     <listitem>
1266      <para>
1267       The dok-tidy target no longer taints documents with a tidy-mark
1268      </para>
1269     </listitem>
1270     <listitem>
1271      <para>
1272       Change RA_MODE from 0664 to 0644. Suggested by Markus Dittrich in
1273       #3505445.
1274      </para>
1275     </listitem>
1276     <listitem>
1277      <para>
1278       Remove tidy's clean flag as it changes the scope of attributes.
1279       Link-specific colors end up being applied to all text. Reported by Adam
1280       Piggott in #3569551.
1281      </para>
1282     </listitem>
1283     <listitem>
1284      <para>
1285       Leave it up to the user whether or not smart tags are inserted.
1286      </para>
1287     </listitem>
1288     <listitem>
1289      <para>
1290       Let w3m itself do the line wrapping for the config file. It works better
1291       than fmt as it can honour pre tags causing less unintentional line breaks.
1292      </para>
1293     </listitem>
1294     <listitem>
1295      <para>
1296       Ditch a pointless '-r' passed to rm to delete files.
1297      </para>
1298     </listitem>
1299     <listitem>
1300      <para>
1301       The config-file target now requires less manual intervention and updates
1302       the original config.
1303      </para>
1304     </listitem>
1305     <listitem>
1306      <para>
1307       Change WDUMP to generate ASCII. Add WDUMP_UTF8 to allow UTF-8 in the
1308       AUTHORS file so the names are right.
1309      </para>
1310     </listitem>
1311     <listitem>
1312      <para>
1313       Stop pretending that lynx and links are supported for the documentation.
1314      </para>
1315      </listitem>
1316     </itemizedlist>
1317    </para>
1318   </listitem>
1319   <listitem>
1320    <para>
1321     configure improvements:
1322     <itemizedlist>
1323     <listitem>
1324      <para>
1325       On Haiku, do not pass -lpthread to the compiler. Haiku's pthreads
1326       implementation is contained in its system library, libroot, so no
1327       additional library needs to be searched.
1328       Patch submitted by Simon South in #3564815.
1329      </para>
1330     </listitem>
1331     <listitem>
1332      <para>
1333       Additional Haiku-specific improvements. Disable checks intended for
1334       multi-user systems as Haiku is presently single-user. Group Haiku-specific
1335       settings in their own section, following the pattern for Solaris, OS/2 and
1336       AmigaOS. Add additional library-related settings to remove the need for
1337       providing configure with custom LDFLAGS.
1338       Submitted by Simon South in #3574538.
1339       *** Version 3.0.19 Stable ***
1340      </para>
1341      </listitem>
1342     </itemizedlist>
1343    </para>
1344   </listitem>
1345  </itemizedlist>
1346 </para>
1347
1348
1349 <!--   ~~~~~       New section      ~~~~~     -->
1350
1351 <sect2 id="upgradersnote">
1352 <title>Note to Upgraders</title>
1353
1354 <para>
1355  A quick list of things to be aware of before upgrading from earlier
1356  versions of <application>Privoxy</application>:
1357 </para>
1358
1359 <para>
1360  <itemizedlist>
1361
1362  <listitem>
1363   <para>
1364    The recommended way to upgrade &my-app; is to backup your old
1365    configuration files, install the new ones, verify that &my-app;
1366    is working correctly and finally merge back your changes using
1367    <application>diff</application> and maybe <application>patch</application>.
1368   </para>
1369   <para>
1370    There are a number of new features in each &my-app; release and
1371    most of them have to be explicitly enabled in the configuration
1372    files. Old configuration files obviously don't do that and due
1373    to syntax changes using old configuration files with a new
1374    &my-app; isn't always possible anyway.
1375   </para>
1376  </listitem>
1377  <listitem>
1378   <para>
1379     Note that some installers remove earlier versions completely,
1380     including configuration files, therefore you should really save
1381     any important configuration files!
1382   </para>
1383  </listitem>
1384  <listitem>
1385   <para>
1386    On the other hand, other installers don't overwrite existing configuration
1387    files, thinking you will want to do that yourself.
1388   </para>
1389  </listitem>
1390  <listitem>
1391   <para>
1392    <filename>standard.action</filename> has been merged into
1393    the <filename>default.action</filename> file.
1394   </para>
1395  </listitem>
1396  <listitem>
1397   <para>
1398    In the default configuration only fatal errors are logged now.
1399    You can change that in the <link linkend="DEBUG">debug section</link>
1400    of the configuration file. You may also want to enable more verbose
1401    logging until you verified that the new &my-app; version is working
1402    as expected.
1403   </para>
1404  </listitem>
1405
1406  <listitem>
1407     <para>
1408      Three other config file settings are now off by default:
1409      <link linkend="enable-remote-toggle">enable-remote-toggle</link>,
1410      <link linkend="enable-remote-http-toggle">enable-remote-http-toggle</link>,
1411      and  <link linkend="enable-edit-actions">enable-edit-actions</link>.
1412      If you use or want these, you will need to explicitly enable them, and
1413      be aware of the security issues involved.
1414     </para>
1415   </listitem>
1416
1417 <!--
1418  <listitem>
1419   <para>
1420    What constitutes a <quote>default</quote> configuration has changed,
1421    and you may want to review which actions are <quote>on</quote> by
1422    default. This is primarily a matter of emphasis, but some features
1423    you may have been used to, may now be <quote>off</quote> by default.
1424    There are also a number of new actions and filters you may want to
1425    consider, most of which are not fully incorporated into the default
1426    settings as yet (see above).
1427   </para>
1428  </listitem>
1429 -->
1430 <!--
1431   <listitem>
1432    <para>
1433     The default actions setting is now <literal>Cautious</literal>. Previous
1434     releases had a default setting of <literal>Medium</literal>. Experienced
1435     users may want to adjust this, as it is fairly conservative by &my-app;
1436     standards and past practices. See <ulink
1437     url="http://config.privoxy.org/edit-actions-list?f=default">
1438     http://config.privoxy.org/edit-actions-list?f=default</ulink>. New users
1439     should try the default settings for a while before turning up the volume.
1440    </para>
1441   </listitem>
1442
1443   <listitem>
1444    <para>
1445     The default setting has filtering turned <emphasis>off</emphasis>, which
1446     subsequently means that compression is <emphasis>on</emphasis>. Remember
1447     that filtering does not work on compressed pages, so if you use, or want to
1448     use, filtering, you will need to force compression off. Example:
1449    </para>
1450    <para>
1451  <screen>
1452   { +<link linkend="filter">filter</link>{google}  +<link linkend="prevent-compression">prevent-compression</link> }
1453    .google.</screen>
1454    </para>
1455    <para>
1456     Or if you use a number of filters, or filter many sites, you may just want
1457     to turn off compression for all sites in
1458     <filename>default.action</filename> (or
1459     <filename>user.action</filename>).
1460    </para>
1461
1462   </listitem>
1463
1464   <listitem>
1465   <para>
1466    Also, <link linkend="SESSION-COOKIES-ONLY">session-cookies-only</link> is
1467    off by default now. If you've liked this feature in the past, you may want
1468    to turn it back on in <filename>user.action</filename> now.
1469   </para>
1470   </listitem>
1471
1472
1473   <listitem>
1474   <para>
1475    Some installers may not automatically start
1476    <application>Privoxy</application> after installation.
1477   </para>
1478  </listitem>
1479 -->
1480
1481  </itemizedlist>
1482 </para>
1483
1484 </sect2>
1485 </sect1>
1486
1487 <!--   ~~~~~       New section      ~~~~~     -->
1488 <sect1 id="quickstart"><title>Quickstart to Using Privoxy</title>
1489 <para>
1490  <itemizedlist>
1491
1492  <listitem>
1493   <para>
1494   Install <application>Privoxy</application>. See the <link
1495   linkend="installation">Installation Section</link> below for platform specific
1496   information.
1497  </para>
1498  </listitem>
1499
1500  <listitem>
1501   <para>
1502    Advanced users and those who want to offer <application>Privoxy</application>
1503    service to more than just their local machine should check the <link
1504    linkend="config">main config file</link>, especially the <link
1505    linkend="access-control">security-relevant</link> options. These are
1506    off by default.
1507   </para>
1508  </listitem>
1509
1510  <listitem>
1511   <para>
1512   Start <application>Privoxy</application>, if the installation program has
1513   not done this already (may vary according to platform). See the section
1514   <link linkend="startup">Starting <application>Privoxy</application></link>.
1515   </para>
1516  </listitem>
1517
1518  <listitem>
1519   <para>
1520    Set your browser to use <application>Privoxy</application> as HTTP and
1521    HTTPS (SSL)  <ulink url="http://en.wikipedia.org/wiki/Proxy_server">proxy</ulink>
1522    by setting the proxy configuration for address of
1523    <literal>127.0.0.1</literal> and port <literal>8118</literal>.
1524    <emphasis>DO NOT</emphasis> activate proxying for <literal>FTP</literal> or
1525    any protocols besides HTTP and HTTPS (SSL) unless you intend to prevent your
1526    browser from using these protocols.
1527   </para>
1528  </listitem>
1529
1530  <listitem>
1531   <para>
1532     Flush your browser's disk and memory caches, to remove any cached ad images.
1533     If using <application>Privoxy</application> to manage
1534     <ulink url="http://en.wikipedia.org/wiki/Browser_cookie">cookies</ulink>,
1535     you should remove any currently stored cookies too.
1536   </para>
1537  </listitem>
1538
1539  <listitem>
1540   <para>
1541    A default installation should provide a reasonable starting point for
1542    most. There will undoubtedly be occasions where you will want to adjust the
1543    configuration, but that can be dealt with as the need arises. Little
1544    to no initial configuration is required in most cases, you may want
1545    to enable the
1546    <ulink url="config.html#ENABLE-EDIT-ACTIONS">web-based action editor</ulink> though.
1547    Be sure to read the warnings first.
1548   </para>
1549   <para>
1550    See the <link linkend="configuration">Configuration section</link> for more
1551    configuration options, and how to customize your installation.
1552    You might also want to look at the <link
1553    linkend="quickstart-ad-blocking">next section</link> for a quick
1554    introduction to how <application>Privoxy</application> blocks ads and
1555    banners.
1556 </para>
1557  </listitem>
1558
1559  <listitem>
1560   <para>
1561     If you experience ads that slip through, innocent images that are
1562     blocked, or otherwise feel the need to fine-tune
1563     <application>Privoxy's</application> behavior, take a look at the <link
1564     linkend="actions-file">actions files</link>. As a quick start, you might
1565     find the <link linkend="act-examples">richly commented examples</link>
1566     helpful. You can also view and edit the actions files through the <ulink
1567     url="http://config.privoxy.org">web-based user interface</ulink>. The
1568     Appendix <quote><link linkend="actionsanat">Troubleshooting: Anatomy of an
1569     Action</link></quote> has hints on how to understand and debug actions that
1570     <quote>misbehave</quote>.
1571   </para>
1572  </listitem>
1573
1574 <!--
1575  Did anyone test these lately?
1576  fk 2007-11-10
1577  <listitem>
1578   <para>
1579    For easy access to &my-app;'s most important controls, drag the provided
1580    <link linkend="bookmarklets">Bookmarklets</link> into your browser's
1581    personal toolbar.
1582   </para>
1583  </listitem>
1584 -->
1585
1586  <listitem>
1587   <para>
1588    Please see the section <link linkend="contact">Contacting the
1589    Developers</link> on how to report bugs, problems with websites or to get
1590    help.
1591   </para>
1592  </listitem>
1593
1594  <listitem>
1595   <para>
1596    Now enjoy surfing with enhanced control, comfort and privacy!
1597   </para>
1598  </listitem>
1599
1600  </itemizedlist>
1601 </para>
1602
1603
1604 <!--   ~~~~~       New section      ~~~~~     -->
1605
1606 <sect2 id="quickstart-ad-blocking">
1607 <title>Quickstart to Ad Blocking</title>
1608 <!--
1609  NOTE:  This section is deliberately redundant for those that don't
1610  want to read the whole thing (which is getting lengthy).
1611 -->
1612 <para>
1613  Ad blocking is but one of <application>Privoxy's</application>
1614  array of features. Many of these features are for the technically minded advanced
1615  user. But, ad and banner blocking is surely common ground for everybody.
1616 </para>
1617 <para>
1618  This section will provide a quick summary of ad blocking so
1619  you can get up to speed quickly without having to read the more extensive
1620  information provided below, though this is highly recommended.
1621 </para>
1622 <para>
1623  First a bit of a warning ... blocking ads is much like blocking SPAM: the
1624  more aggressive you are about it, the more likely you are to block
1625  things that were not intended. And the more likely that some things
1626  may not work as intended. So there is a trade off here. If you want
1627  extreme ad free browsing, be prepared to deal with more
1628  <quote>problem</quote> sites, and to spend more time adjusting the
1629  configuration to solve these unintended consequences. In short, there is
1630  not an easy way to eliminate <emphasis>all</emphasis> ads. Either take
1631  the easy way and settle for <emphasis>most</emphasis> ads blocked with the
1632  default configuration, or jump in and tweak it for your personal surfing
1633  habits and preferences.
1634 </para>
1635 <para>
1636  Secondly, a brief explanation of <application>Privoxy's </application>
1637  <quote>actions</quote>. <quote>Actions</quote> in this context, are
1638  the directives we use to tell <application>Privoxy</application> to perform
1639  some task relating to HTTP transactions (i.e. web browsing). We tell
1640  <application>Privoxy</application> to take some <quote>action</quote>. Each
1641  action has a unique name and function. While there are many potential
1642  <application>actions</application> in <application>Privoxy's</application>
1643  arsenal, only a few are used for ad blocking. <link
1644  linkend="actions">Actions</link>, and <link linkend="actions-file">action
1645  configuration files</link>, are explained in depth below.
1646 </para>
1647 <para>
1648  Actions are specified in <application>Privoxy's</application> configuration,
1649  followed by one or more URLs to which the action should apply. URLs
1650  can actually be URL type <link linkend="af-patterns">patterns</link> that use
1651  wildcards so they can apply potentially to a range of similar URLs. The
1652  actions, together with the URL patterns are called a section.
1653 </para>
1654 <para>
1655  When you connect to a website, the full URL will either match one or more
1656  of the sections as defined in <application>Privoxy's</application> configuration,
1657  or not. If so, then <application>Privoxy</application> will perform the
1658  respective actions. If not, then nothing special happens. Furthermore, web
1659  pages may contain embedded, secondary URLs that your web browser will
1660  use to load additional components of the page, as it parses the
1661  original page's HTML content. An ad image for instance, is just an URL
1662  embedded in the page somewhere. The image itself may be on the same server,
1663  or a server somewhere else on the Internet. Complex web pages will have many
1664  such embedded URLs. &my-app; can deal with each URL individually, so, for
1665  instance, the main page text is not touched, but images from such-and-such
1666  server are blocked.
1667 </para>
1668
1669 <para>
1670  The most important actions for basic ad blocking are:  <literal><link
1671  linkend="block">block</link></literal>, <literal><link
1672  linkend="handle-as-image">handle-as-image</link></literal>,
1673  <literal><link
1674  linkend="handle-as-empty-document">handle-as-empty-document</link></literal>,and
1675  <literal><link linkend="set-image-blocker">set-image-blocker</link></literal>:
1676 </para>
1677
1678 <para>
1679  <itemizedlist>
1680
1681  <listitem>
1682   <para>
1683    <literal><link linkend="block">block</link></literal> - this is perhaps
1684    the single most used action, and is particularly important for ad blocking.
1685    This action stops any contact between your browser and any URL patterns
1686    that match this action's configuration. It can be used for blocking ads,
1687    but also anything that is determined to be unwanted. By itself, it simply
1688    stops any communication with the remote server and sends
1689    <application>Privoxy</application>'s own built-in BLOCKED page instead to
1690    let you now what has happened (with some exceptions, see below).
1691   </para>
1692  </listitem>
1693
1694  <listitem>
1695   <para>
1696    <literal><link linkend="handle-as-image">handle-as-image</link></literal> -
1697    tells <application>Privoxy</application> to treat this URL as an image.
1698    <application>Privoxy</application>'s default configuration already does this
1699    for all common image types (e.g. GIF), but there are many situations where this
1700    is not so easy to determine. So we'll force it in these cases. This is particularly
1701    important for ad blocking, since  only if we know that it's an image of
1702    some kind, can we replace it with an image of our choosing, instead of the
1703    <application>Privoxy</application> BLOCKED page (which would only result in
1704    a <quote>broken image</quote> icon). There are some limitations to this
1705    though. For instance, you can't just brute-force an image substitution for
1706    an entire HTML page in most situations.
1707   </para>
1708  </listitem>
1709
1710  <listitem>
1711   <para>
1712    <literal><link linkend="handle-as-empty-document">handle-as-empty-document</link></literal> -
1713    sends an empty document instead of <application>Privoxy's</application>
1714    normal BLOCKED HTML page. This is useful for file types that are neither
1715    HTML nor images, such as blocking JavaScript files.
1716   </para>
1717  </listitem>
1718
1719  <listitem>
1720   <para>
1721    <literal><link
1722    linkend="set-image-blocker">set-image-blocker</link></literal> - tells
1723    <application>Privoxy</application> what to display in place of an ad image that
1724    has hit a block rule. For this to come into play, the URL must match a
1725    <literal><link linkend="block">block</link></literal> action somewhere in the
1726    configuration, <emphasis>and</emphasis>, it must also match an
1727    <literal><link linkend="handle-as-image">handle-as-image</link></literal> action.
1728   </para>
1729   <para>
1730    The configuration options on what to display instead of the ad are:
1731   </para>
1732   <simplelist>
1733    <member>
1734     &nbsp;&nbsp;&nbsp;<emphasis>pattern</emphasis> - a checkerboard pattern, so that an ad
1735     replacement is obvious. This is the default.
1736    </member>
1737   </simplelist>
1738   <simplelist>
1739    <member>
1740     &nbsp;&nbsp;&nbsp;<emphasis>blank</emphasis> - A very small empty GIF image is displayed.
1741     This is the so-called <quote>invisible</quote> configuration option.
1742    </member>
1743   </simplelist>
1744   <simplelist>
1745    <member>
1746     &nbsp;&nbsp;&nbsp;<emphasis>http://&lt;URL&gt;</emphasis> - A redirect to any image anywhere
1747     of the user's choosing (advanced usage).
1748    </member>
1749   </simplelist>
1750   </listitem>
1751
1752 </itemizedlist>
1753 </para>
1754
1755 <para>
1756  Advanced users will eventually want to explore &my-app;
1757  <literal><link linkend="filter">filters</link></literal> as well. Filters
1758  are very different from <literal><link
1759  linkend="block">blocks</link></literal>.
1760  A <quote>block</quote> blocks a site, page, or unwanted contented. Filters
1761  are a way of filtering or modifying what is actually on the page. An example
1762  filter usage: a text replacement of <quote>no-no</quote> for
1763  <quote>nasty-word</quote>. That is a very simple example. This process can be
1764  used for ad blocking, but it is more in the realm of advanced usage and has
1765  some pitfalls to be wary off.
1766 </para>
1767
1768 <para>
1769  The quickest way to adjust any of these settings is with your browser through
1770  the special <application>Privoxy</application> editor at <ulink
1771  url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status</ulink>
1772  (shortcut: <ulink url="http://p.p/">http://p.p/show-status</ulink>). This
1773  is an internal page, and does not require Internet access.
1774 </para>
1775
1776 <para>
1777  Note that as of <application>Privoxy</application> 3.0.7 beta the
1778  action editor is disabled by default. Check the
1779  <ulink url="config.html#ENABLE-EDIT-ACTIONS">enable-edit-actions
1780   section in the configuration file</ulink> to learn why and in which
1781  cases it's safe to enable again.
1782 </para>
1783
1784 <para>
1785  If you decided to enable the action editor, select the appropriate
1786  <quote>actions</quote> file, and click
1787  <quote><guibutton>Edit</guibutton></quote>. It is best to put personal or
1788  local preferences in <filename>user.action</filename> since this is not
1789  meant to be overwritten during upgrades, and will over-ride the settings in
1790  other files. Here you can insert new <quote>actions</quote>, and URLs for ad
1791  blocking or other purposes, and make other adjustments to the configuration.
1792  <application>Privoxy</application> will detect these changes automatically.
1793 </para>
1794
1795 <para>
1796  A quick and simple step by step example:
1797 </para>
1798
1799 <para>
1800  <itemizedlist>
1801
1802   <listitem>
1803    <para>
1804      Right click on the ad image to be blocked, then select
1805      <quote><guimenuitem>Copy Link Location</guimenuitem></quote> from the
1806      pop-up menu.
1807    </para>
1808   </listitem>
1809   <listitem>
1810    <para>
1811     Set your browser to
1812     <ulink
1813  url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status</ulink>
1814    </para>
1815   </listitem>
1816   <listitem>
1817    <para>
1818     Find <filename>user.action</filename> in the top section, and click
1819     on <quote><guibutton>Edit</guibutton></quote>:
1820    </para>
1821
1822  <!-- image of editor and actions files selections -->
1823  <para>
1824   <figure pgwide="0" float="0"><title>Actions Files in Use</title>
1825    <mediaobject>
1826      <imageobject>
1827       <imagedata  fileref="files-in-use.jpg" format="jpg">
1828        </imageobject>
1829        <textobject>
1830         <phrase>[ Screenshot of Actions Files in Use ]</phrase>
1831       </textobject>
1832    </mediaobject>
1833   </figure>
1834  </para>
1835  </listitem>
1836
1837  <listitem>
1838   <para>
1839    You should have a section with only
1840    <literal><link linkend="block">block</link></literal> listed under
1841    <quote>Actions:</quote>.
1842    If not, click a <quote><guibutton>Insert new section below</guibutton></quote>
1843    button, and in the new section that just appeared, click the
1844    <guibutton>Edit</guibutton> button right under the word <quote>Actions:</quote>.
1845    This will bring up a list of all actions. Find
1846    <literal><link linkend="block">block</link></literal> near the top, and click
1847    in the <quote>Enabled</quote> column, then <quote><guibutton>Submit</guibutton></quote>
1848    just below the list.
1849   </para>
1850  </listitem>
1851  <listitem>
1852   <para>
1853    Now, in the <literal><link linkend="block">block</link></literal> actions section,
1854    click the <quote><guibutton>Add</guibutton></quote> button, and paste the URL the
1855    browser got from <quote><guimenuitem>Copy Link Location</guimenuitem></quote>.
1856    Remove the <literal>http://</literal> at the beginning of the URL. Then, click
1857    <quote><guibutton>Submit</guibutton></quote> (or
1858    <quote><guibutton>OK</guibutton></quote> if in a pop-up window).
1859   </para>
1860  </listitem>
1861  <listitem>
1862   <para>
1863    Now go back to the original page, and press <keycap>SHIFT-Reload</keycap>
1864    (or flush all browser caches). The image should be gone now.
1865   </para>
1866  </listitem>
1867
1868  </itemizedlist>
1869 </para>
1870
1871 <para>
1872  This is a very crude and simple example. There might be good reasons to use a
1873  wildcard pattern match to include potentially similar images from the same
1874  site. For a more extensive explanation of <quote>patterns</quote>, and
1875  the entire actions concept, see <link linkend="actions-file">the Actions
1876  section</link>.
1877 </para>
1878
1879 <para>
1880  For advanced users who want to hand edit their config files, you might want
1881  to now go to the <link linkend="act-examples">Actions Files Tutorial</link>.
1882  The ideas explained therein also apply to the web-based editor.
1883 </para>
1884 <para>
1885  There are also various
1886  <link linkend="filter">filters</link> that can be used for ad blocking
1887  (filters are a special subset of actions). These
1888  fall into the <quote>advanced</quote> usage category, and are explained in
1889  depth in later sections.
1890 </para>
1891
1892 </sect2>
1893
1894 </sect1>
1895
1896 <!--  ~  End section  ~  -->
1897
1898
1899 <!--   ~~~~~       New section      ~~~~~     -->
1900 <sect1 id="startup">
1901 <title>Starting Privoxy</title>
1902 <para>
1903  Before launching <application>Privoxy</application> for the first time, you
1904  will want to configure your browser(s) to use
1905  <application>Privoxy</application> as a HTTP and HTTPS (SSL)
1906  <ulink url="http://en.wikipedia.org/wiki/Proxy_server">proxy</ulink>. The default is
1907  127.0.0.1 (or localhost) for the proxy address, and port 8118 (earlier versions
1908  used port 8000). This is the one configuration step <emphasis>that must be done
1909 </emphasis>!
1910 </para>
1911 <para>
1912  Please note that <application>Privoxy</application> can only proxy HTTP and
1913  HTTPS traffic. It will not work with FTP or other protocols.
1914 </para>
1915
1916  <!-- image of Mozilla Proxy configuration -->
1917  <para>
1918   <figure pgwide="0" float="0"><title>Proxy Configuration Showing
1919   Mozilla/Netscape HTTP and HTTPS (SSL) Settings</title>
1920    <mediaobject>
1921      <imageobject>
1922       <imagedata  fileref="proxy_setup.jpg" format="jpg">
1923        </imageobject>
1924        <textobject>
1925         <phrase>[ Screenshot of Mozilla Proxy Configuration ]</phrase>
1926       </textobject>
1927    </mediaobject>
1928   </figure>
1929  </para>
1930
1931
1932 <para>
1933  With <application>Firefox</application>, this is typically set under:
1934 </para>
1935
1936 <literallayout>
1937  <guibutton>Tools</guibutton> -> <guibutton>Options</guibutton> ->  <guibutton>Advanced</guibutton> -> <guibutton>Network</guibutton> -><guibutton>Connection</guibutton> -> <guibutton>Settings</guibutton>
1938
1939 </literallayout>
1940
1941 <para>
1942  Or optionally on some platforms:
1943 </para>
1944
1945 <literallayout>
1946  <guibutton>Edit</guibutton> -> <guibutton>Preferences</guibutton> -> <guibutton>General</guibutton> -> <guibutton>Connection Settings</guibutton> -> <guibutton>Manual Proxy Configuration</guibutton>
1947
1948 </literallayout>
1949
1950
1951 <para>
1952  With <application>Netscape</application> (and
1953  <application>Mozilla</application>), this can be set under:
1954 </para>
1955
1956
1957 <literallayout>
1958 <!-- Mix ascii and gui art, something for everybody -->
1959 <!-- spacing on this is tricky -->
1960  <guibutton>Edit</guibutton> -> <guibutton>Preferences</guibutton> -> <guibutton>Advanced</guibutton> -> <guibutton>Proxies</guibutton> -> <guibutton>HTTP Proxy</guibutton>
1961
1962 </literallayout>
1963
1964 <para>
1965  For <application>Internet Explorer v.5-7</application>:
1966 </para>
1967
1968 <literallayout>
1969  <guibutton>Tools</guibutton> -> <guibutton>Internet Options</guibutton> -> <guibutton>Connections</guibutton> -> <guibutton>LAN Settings</guibutton>
1970 </literallayout>
1971
1972 <para>
1973  Then, check <quote>Use Proxy</quote> and fill in the appropriate info
1974  (Address: 127.0.0.1, Port: 8118). Include HTTPS (SSL), if you want HTTPS
1975  proxy support too (sometimes labeled <quote>Secure</quote>). Make sure any
1976  checkboxes like <quote>Use the same proxy server for all protocols</quote> is
1977  <emphasis>UNCHECKED</emphasis>. You want only HTTP and HTTPS (SSL)!
1978 </para>
1979
1980  <!-- image of IE Proxy configuration -->
1981  <para>
1982   <figure pgwide="0" float="0"><title>Proxy Configuration Showing
1983   Internet Explorer HTTP and HTTPS (Secure) Settings</title>
1984    <mediaobject>
1985      <imageobject>
1986       <imagedata  fileref="proxy2.jpg" format="jpg">
1987        </imageobject>
1988        <textobject>
1989         <phrase>[ Screenshot of IE Proxy Configuration ]</phrase>
1990       </textobject>
1991    </mediaobject>
1992   </figure>
1993  </para>
1994
1995
1996 <para>
1997  After doing this, flush your browser's disk and memory caches to force a
1998  re-reading of all pages and to get rid of any ads that may be cached. Remove
1999  any <ulink url="http://en.wikipedia.org/wiki/Browser_cookie">cookies</ulink>,
2000  if you want <application>Privoxy</application> to manage that. You are now
2001  ready to start enjoying the benefits of using
2002  <application>Privoxy</application>!
2003 </para>
2004
2005 <para>
2006  <application>Privoxy</application> itself is typically started by specifying the
2007  main configuration file to be used on the command line. If no configuration
2008  file is specified on the command line, <application>Privoxy</application>
2009  will look for a file named <filename>config</filename> in the current
2010  directory. Except on Win32 where it will try <filename>config.txt</filename>.
2011 </para>
2012
2013 <sect2 id="start-redhat">
2014 <title>Red Hat and Fedora</title>
2015 <para>
2016  A default Red Hat installation may not start &my-app; upon boot. It will use
2017  the file <filename>/etc/privoxy/config</filename> as its main configuration
2018  file.
2019 </para>
2020 <para>
2021  <screen>
2022  # /etc/rc.d/init.d/privoxy start
2023 </screen>
2024 </para>
2025 <para>
2026  Or ...
2027 </para>
2028 <para>
2029  <screen>
2030  # service privoxy start
2031 </screen>
2032 </para>
2033 </sect2>
2034
2035 <sect2 id="start-debian">
2036 <title>Debian</title>
2037 <para>
2038  We use a script. Note that Debian typically starts &my-app; upon booting per
2039  default.  It will use the file
2040  <filename>/etc/privoxy/config</filename> as its main configuration
2041  file.
2042 </para>
2043 <para>
2044  <screen>
2045  # /etc/init.d/privoxy start
2046 </screen>
2047 </para>
2048 </sect2>
2049
2050 <sect2 id="start-windows">
2051 <title>Windows</title>
2052 <para>
2053 Click on the &my-app; Icon to start <application>Privoxy</application>. If no configuration file is
2054  specified on the command line, <application>Privoxy</application> will look
2055  for a file named <filename>config.txt</filename>. Note that Windows will
2056  automatically start &my-app; when the system starts if you chose that option
2057  when installing.
2058 </para>
2059 <para>
2060  <application>Privoxy</application> can run with full Windows service functionality.
2061  On Windows only, the &my-app; program has two new command line arguments
2062  to install and uninstall &my-app; as a service. See the
2063  <link linkend="installation-pack-win">Windows Installation
2064  instructions</link> for details.
2065 </para>
2066 </sect2>
2067
2068 <sect2 id="start-unices">
2069 <title>Solaris, NetBSD, FreeBSD, HP-UX and others</title>
2070 <para>
2071 Example Unix startup command:
2072 </para>
2073 <para>
2074  <screen>
2075  # /usr/sbin/privoxy /etc/privoxy/config
2076 </screen>
2077 </para>
2078 </sect2>
2079
2080 <sect2 id="start-os2">
2081 <title>OS/2</title>
2082 <para>
2083  During installation, <application>Privoxy</application> is configured to
2084  start automatically when the system restarts. You can start it manually by
2085  double-clicking on the <application>Privoxy</application> icon in the
2086  <application>Privoxy</application> folder.
2087 </para>
2088 </sect2>
2089
2090 <sect2 id="start-macosx">
2091 <title>Mac OS X</title>
2092 <para>
2093   After downloading the privoxy software, unzip the downloaded file by
2094   double-clicking on the zip file icon.  Then, double-click on the
2095   installer package icon and follow the installation process.
2096 </para>
2097 <para>
2098   The privoxy service will automatically start after a successful
2099   installation.  In addition, the privoxy service will automatically
2100   start every time your computer starts up.
2101 </para>
2102 <para>
2103   To prevent the privoxy service from automatically starting when your
2104   computer starts up, remove or rename the folder named
2105   /Library/StartupItems/Privoxy.
2106 </para>
2107 <para>
2108   A simple application named Privoxy Utility has been created which
2109   enables administrators to easily start and stop the privoxy service.
2110 </para>
2111 <para>
2112   In addition, the Privoxy Utility presents a simple way for
2113   administrators to edit the various privoxy config files.  A method
2114   to uninstall the software is also available.
2115 </para>
2116 <para>
2117   An administrator username and password must be supplied in order for
2118   the Privoxy Utility to perform any of the tasks.
2119 </para>
2120 </sect2>
2121
2122
2123 <sect2 id="start-amigaos">
2124 <title>AmigaOS</title>
2125 <para>
2126  Start <application>Privoxy</application> (with RUN &lt;&gt;NIL:) in your
2127  <filename>startnet</filename> script (AmiTCP), in
2128  <filename>s:user-startup</filename> (RoadShow), as startup program in your
2129  startup script (Genesis), or as startup action (Miami and MiamiDx).
2130  <application>Privoxy</application> will automatically quit when you quit your
2131  TCP/IP stack (just ignore the harmless warning your TCP/IP stack may display that
2132  <application>Privoxy</application> is still running).
2133 </para>
2134 </sect2>
2135
2136 <sect2 id="start-gentoo">
2137 <title>Gentoo</title>
2138 <para>
2139  A script is again used. It will use the file <filename>/etc/privoxy/config
2140  </filename> as its main configuration file.
2141 </para>
2142 <para>
2143  <screen>
2144  /etc/init.d/privoxy start
2145  </screen>
2146 </para>
2147 <para>
2148  Note that <application>Privoxy</application> is not automatically started at
2149  boot time by default. You can change this with the <literal>rc-update</literal>
2150  command.
2151 </para>
2152 <para>
2153  <screen>
2154  rc-update add privoxy default
2155  </screen>
2156 </para>
2157 </sect2>
2158
2159 <!--
2160
2161 <para>
2162  See the section <link linkend="cmdoptions">Command line options</link> for
2163  further info.
2164 </para>
2165
2166 must find a better place for this paragraph
2167
2168 <para>
2169  The included default configuration files should give a reasonable starting
2170  point. Most of the per site configuration is done in the
2171  <ulink url="actions-file.html"><quote>actions</quote></ulink> files. These are
2172  where various cookie actions are defined, ad and banner blocking, and other
2173  aspects of <application>Privoxy</application> configuration. There are several
2174  such files included, with varying levels of aggressiveness.
2175 </para>
2176
2177 <para>
2178  You will probably want to keep an eye out for sites for which you may prefer
2179  persistent cookies, and add these to your actions configuration as needed. By
2180  default, most of these will be accepted only during the current browser
2181  session (aka <quote>session cookies</quote>), unless you add them to the
2182  configuration. If you want the browser to handle this instead, you will need
2183  to edit <filename>user.action</filename> (or through the web based interface)
2184  and disable this feature. If you use more than one browser, it would make
2185  more sense to let <application>Privoxy</application> handle this. In which
2186  case, the browser(s) should be set to accept all cookies.
2187 </para>
2188
2189 <para>
2190  Another feature where you will probably want to define exceptions for trusted
2191  sites is the popup-killing (through  <ulink
2192  url="actions-file.html#FILTER-POPUPS"><quote>+filter{popups}</quote></ulink>),
2193  because your favorite shopping, banking, or leisure site may need
2194  popups (explained below).
2195 </para>
2196
2197 <para>
2198  <application>Privoxy</application> does not support all of the optional HTTP/1.1
2199  features yet. In the unlikely event that you experience inexplicable problems
2200  with browsers that use HTTP/1.1 per default
2201  (like <application>Mozilla</application> or recent versions of I.E.), you might
2202  try to force HTTP/1.0 compatibility. For Mozilla, look under <literal>Edit -&gt;
2203  Preferences -&gt; Debug -&gt; Networking</literal>.
2204  Alternatively, set the <quote>+downgrade-http-version</quote> config option in
2205  <filename>default.action</filename> which will downgrade your browser's HTTP
2206  requests from HTTP/1.1 to HTTP/1.0 before processing them.
2207 </para>
2208
2209 <para>
2210  After running <application>Privoxy</application> for a while, you can
2211  start to fine tune the configuration to suit your personal, or site,
2212  preferences and requirements. There are many, many aspects that can
2213  be customized. <quote>Actions</quote>
2214  can be adjusted by pointing your browser to
2215  <ulink url="http://config.privoxy.org/">http://config.privoxy.org/</ulink>
2216  (shortcut: <ulink url="http://p.p/">http://p.p/</ulink>),
2217  and then follow the link to <quote>View &#38; Change the Current Configuration</quote>.
2218  (This is an internal page and does not require Internet access.)
2219 </para>
2220
2221 <para>
2222  In fact, various aspects of <application>Privoxy</application>
2223  configuration can be viewed from this page, including
2224  current configuration parameters, source code version numbers,
2225  the browser's request headers, and <quote>actions</quote> that apply
2226  to a given URL. In addition to the actions file
2227  editor mentioned above, <application>Privoxy</application> can also
2228  be turned <quote>on</quote> and <quote>off</quote> (toggled) from this page.
2229 </para>
2230
2231 <para>
2232  If you encounter problems, try loading the page without
2233  <application>Privoxy</application>. If that helps, enter the URL where
2234  you have the problems into <ulink url="http://p.p/show-url-info">the browser
2235  based rule tracing utility</ulink>. See which rules apply and why, and
2236  then try turning them off for that site one after the other, until the problem
2237  is gone. When you have found the culprit, you might want to turn the rest on
2238  again.
2239 </para>
2240
2241 <para>
2242  If the above paragraph sounds gibberish to you, you might want to <link
2243  linkend="actions-file">read more about the actions concept</link>
2244  or even dive deep into the <link linkend="actionsanat">Appendix
2245  on actions</link>.
2246 </para>
2247
2248 <para>
2249  If you can't get rid of the problem at all, think you've found a bug in
2250  Privoxy, want to propose a new feature or smarter rules, please see the
2251  section <link linkend="contact"><quote>Contacting the
2252  Developers</quote></link> below.
2253 </para>
2254
2255 -->
2256
2257 <!--   ~~~~~       New section      ~~~~~     -->
2258 <sect2 id="cmdoptions">
2259 <title>Command Line Options</title>
2260 <para>
2261  <application>Privoxy</application> may be invoked with the following
2262  command-line options:
2263 </para>
2264
2265 <para>
2266  <itemizedlist>
2267
2268  <listitem>
2269   <para>
2270    <emphasis>--config-test</emphasis>
2271   </para>
2272   <para>
2273    Exit after loading the configuration files before binding to
2274    the listen address. The exit code signals whether or not the
2275    configuration files have been successfully loaded.
2276   </para>
2277   <para>
2278    If the exit code is 1, at least one of the configuration files
2279    is invalid, if it is 0, all the configuration files have been
2280    successfully loaded (but may still contain errors that can
2281    currently only be detected at run time).
2282   </para>
2283   <para>
2284    This option doesn't affect the log setting, combination with
2285    <emphasis>--no-daemon</emphasis> is recommended if a configured
2286    log file shouldn't be used.
2287   </para>
2288  </listitem>
2289  <listitem>
2290   <para>
2291     <emphasis>--version</emphasis>
2292   </para>
2293   <para>
2294      Print version info and exit. Unix only.
2295   </para>
2296  </listitem>
2297  <listitem>
2298   <para>
2299     <emphasis>--help</emphasis>
2300   </para>
2301   <para>
2302    Print short usage info and exit. Unix only.
2303   </para>
2304  </listitem>
2305  <listitem>
2306   <para>
2307    <emphasis>--no-daemon</emphasis>
2308   </para>
2309   <para>
2310    Don't become a daemon, i.e. don't fork and become process group
2311    leader, and don't detach from controlling tty. Unix only.
2312   </para>
2313  </listitem>
2314  <listitem>
2315   <para>
2316    <emphasis>--pidfile FILE</emphasis>
2317   </para>
2318   <para>
2319    On startup, write the process ID to <emphasis>FILE</emphasis>. Delete the
2320    <emphasis>FILE</emphasis> on exit. Failure to create or delete the
2321    <emphasis>FILE</emphasis> is non-fatal. If no <emphasis>FILE</emphasis>
2322    option is given, no PID file will be used. Unix only.
2323   </para>
2324  </listitem>
2325  <listitem>
2326   <para>
2327    <emphasis>--user USER[.GROUP]</emphasis>
2328   </para>
2329   <para>
2330    After (optionally) writing the PID file, assume the user  ID  of
2331    <emphasis>USER</emphasis>, and if included the GID of GROUP.  Exit if the
2332    privileges are not sufficient to do so. Unix only.
2333   </para>
2334  </listitem>
2335  <listitem>
2336   <para>
2337    <emphasis>--chroot</emphasis>
2338   </para>
2339   <para>
2340    Before changing to the user ID given in the <emphasis>--user</emphasis> option,
2341    chroot to that user's home directory, i.e. make the kernel pretend to the &my-app;
2342    process that the directory tree starts there. If set up carefully, this can limit
2343    the impact of possible vulnerabilities in &my-app; to the files contained in that hierarchy.
2344    Unix only.
2345   </para>
2346  </listitem>
2347  <listitem>
2348   <para>
2349    <emphasis>--pre-chroot-nslookup hostname</emphasis>
2350   </para>
2351   <para>
2352    Specifies a hostname to look up before doing a chroot. On some systems, initializing the
2353    resolver library involves reading config files from /etc and/or loading additional shared
2354    libraries from /lib. On these systems, doing a hostname lookup before the chroot reduces
2355    the number of files that must be copied into the chroot tree.
2356   </para>
2357   <para>
2358    For fastest startup speed, a good value is a hostname that is not in /etc/hosts but that
2359    your local name server (listed in /etc/resolv.conf) can resolve without recursion
2360    (that is, without having to ask any other name servers). The hostname need not exist,
2361    but if it doesn't, an error message (which can be ignored) will be output.
2362   </para>
2363  </listitem>
2364
2365  <listitem>
2366   <para>
2367     <emphasis>configfile</emphasis>
2368   </para>
2369   <para>
2370     If no <emphasis>configfile</emphasis> is included on the command line,
2371     <application>Privoxy</application> will look for a file named
2372     <quote>config</quote> in the current directory (except on Win32
2373     where it will look for <quote>config.txt</quote> instead). Specify
2374     full path to avoid confusion. If no config file is found,
2375     <application>Privoxy</application> will fail to start.
2376   </para>
2377  </listitem>
2378
2379  </itemizedlist>
2380 </para>
2381
2382 <para>
2383  On <application>MS Windows</application> only there are two additional
2384  command-line options to allow <application>Privoxy</application> to install and
2385  run as a <emphasis>service</emphasis>. See the
2386 <link linkend="installation-pack-win">Window Installation section</link>
2387 for details.
2388 </para>
2389
2390 </sect2>
2391
2392 </sect1>
2393
2394 <!--  ~  End section  ~  -->
2395
2396
2397 <!--   ~~~~~       New section      ~~~~~     -->
2398 <sect1 id="configuration"><title>Privoxy Configuration</title>
2399  <para>
2400   All <application>Privoxy</application> configuration is stored
2401   in text files. These files can be edited with a text editor.
2402   Many important aspects of <application>Privoxy</application> can
2403   also be controlled easily with a web browser.
2404  </para>
2405
2406
2407 <!--   ~~~~~       New section      ~~~~~     -->
2408
2409 <sect2>
2410 <title>Controlling Privoxy with Your Web Browser</title>
2411 <para>
2412  <application>Privoxy</application>'s user interface can be reached through the special
2413  URL <ulink url="http://config.privoxy.org/">http://config.privoxy.org/</ulink>
2414  (shortcut: <ulink url="http://p.p/">http://p.p/</ulink>),
2415  which is a built-in page and works without Internet access.
2416  You will see the following section:
2417
2418 </para>
2419
2420 <!-- Needs to be put in a table and colorized  -->
2421 <screen>
2422  <msgtext>
2423  <bridgehead renderas="sect2">&nbsp;&nbsp;&nbsp;&nbsp;Privoxy Menu</bridgehead>
2424
2425  <simplelist>
2426  <member>
2427   &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>
2428  </member>
2429  <member>
2430   &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>
2431  </member>
2432  <member>
2433   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&squf;&nbsp;&nbsp;<ulink url="http://config.privoxy.org/show-request">View the request headers.</ulink>
2434  </member>
2435  <member>
2436   &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>
2437  </member>
2438  <member>
2439   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&squf;&nbsp;&nbsp;<ulink url="http://config.privoxy.org/toggle">Toggle Privoxy on or off</ulink>
2440  </member>
2441  <member>
2442   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&squf;&nbsp;&nbsp;<ulink
2443   url="http://www.privoxy.org/&p-version;/user-manual/">Documentation</ulink>
2444  </member>
2445  </simplelist>
2446  </msgtext>
2447 </screen>
2448
2449
2450 <para>
2451  This should be self-explanatory. Note the first item leads to an editor for the
2452  <link linkend="actions-file">actions files</link>, which is where the ad, banner,
2453  cookie, and URL blocking magic is configured as well as other advanced features of
2454  <application>Privoxy</application>. This is an easy way to adjust various
2455  aspects of <application>Privoxy</application> configuration. The actions
2456  file, and other configuration files, are explained in detail below.
2457 </para>
2458
2459 <para>
2460  <quote>Toggle Privoxy On or Off</quote> is handy for sites that might
2461  have problems with your current actions and filters. You can in fact use
2462  it as a test to see whether it is <application>Privoxy</application>
2463  causing the problem or not. <application>Privoxy</application> continues
2464  to run as a proxy in this case, but all manipulation is disabled, i.e.
2465  <application>Privoxy</application> acts like a normal forwarding proxy. There
2466  is even a toggle <link linkend="bookmarklets">Bookmarklet</link> offered, so
2467  that you can toggle <application>Privoxy</application> with one click from
2468  your browser.
2469 </para>
2470
2471 <para>
2472  Note that several of the features described above are disabled by default
2473  in <application>Privoxy</application> 3.0.7 beta and later.
2474  Check the
2475  <ulink url="config.html">configuration file</ulink> to learn why
2476  and in which cases it's safe to enable them again.
2477 </para>
2478
2479 </sect2>
2480
2481 <!--  ~  End section  ~  -->
2482
2483
2484
2485
2486 <!--   ~~~~~       New section      ~~~~~     -->
2487
2488 <sect2 id="confoverview">
2489 <title>Configuration Files Overview</title>
2490 <para>
2491  For Unix, *BSD and Linux, all configuration files are located in
2492  <filename>/etc/privoxy/</filename> by default. For MS Windows, OS/2, and
2493  AmigaOS these are all in the same directory as the
2494  <application>Privoxy</application> executable. <![%p-not-stable;[ The name
2495  and number of configuration files has changed from previous versions, and is
2496  subject to change as development progresses.]]>
2497 </para>
2498
2499 <para>
2500  The installed defaults provide a reasonable starting point, though
2501  some settings may be aggressive by some standards. For the time being, the
2502  principle configuration files are:
2503 </para>
2504
2505 <para>
2506  <itemizedlist>
2507
2508   <listitem>
2509    <para>
2510      The <link linkend="config">main configuration file</link> is named <filename>config</filename>
2511      on Linux, Unix, BSD, OS/2, and AmigaOS and <filename>config.txt</filename>
2512      on Windows. This is a required file.
2513    </para>
2514   </listitem>
2515
2516   <listitem>
2517    <para>
2518     <filename>match-all.action</filename> is used to define which <quote>actions</quote>
2519     relating to banner-blocking, images, pop-ups, content modification, cookie handling
2520     etc should be applied by default. It should be the first actions file loaded.
2521    </para>
2522    <para>
2523     <filename>default.action</filename> defines many exceptions (both positive and negative)
2524     from the default set of actions that's configured in <filename>match-all.action</filename>.
2525     It should be the second actions file loaded and shouldn't be edited by the user.
2526    </para>
2527    <para>
2528     Multiple actions files may be defined in <filename>config</filename>. These
2529     are processed in the order they are defined. Local customizations and locally
2530     preferred exceptions to the default policies as defined in
2531     <filename>match-all.action</filename> (which you will most probably want
2532     to define sooner or later) are best applied in <filename>user.action</filename>,
2533     where you can preserve them across upgrades. The file isn't installed by all
2534     installers, but you can easily create it yourself with a text editor.
2535    </para>
2536    <para>
2537     There is also a web based editor that can be accessed from
2538     <ulink
2539     url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status</ulink>
2540     (Shortcut: <ulink
2541     url="http://p.p/show-status">http://p.p/show-status</ulink>) for the
2542     various actions files.
2543    </para>
2544   </listitem>
2545
2546   <listitem>
2547    <para>
2548     <quote>Filter files</quote> (the <link linkend="filter-file">filter
2549     file</link>) can be used to re-write the raw page content, including
2550     viewable text as well as embedded HTML and JavaScript, and whatever else
2551     lurks on any given web page. The filtering jobs are only pre-defined here;
2552     whether to apply them or not is up to the actions files.
2553     <filename>default.filter</filename> includes various filters made
2554     available for use by the developers. Some are much more intrusive than
2555     others, and all should be used with caution. You may define additional
2556     filter files in <filename>config</filename> as you can with
2557     actions files. We suggest <filename>user.filter</filename> for any
2558     locally defined filters or customizations.
2559    </para>
2560   </listitem>
2561
2562  </itemizedlist>
2563 </para>
2564
2565 <para>
2566  The syntax of the configuration and filter files may change between different
2567  Privoxy versions, unfortunately some enhancements cost backwards compatibility.
2568  <!-- Add link to documentation-->
2569 </para>
2570
2571 <para>
2572  All files use the <quote><literal>#</literal></quote> character to denote a
2573  comment (the rest of the line will be ignored) and understand line continuation
2574  through placing a backslash ("<literal>\</literal>") as the very last character
2575  in a line. If the <literal>#</literal> is preceded by a backslash, it looses
2576  its special function. Placing a <literal>#</literal> in front of an otherwise
2577  valid configuration line to prevent it from being interpreted is called "commenting
2578  out" that line. Blank lines are ignored.
2579 </para>
2580
2581 <para>
2582  The actions files and filter files
2583  can use Perl style <link linkend="regex">regular expressions</link> for
2584  maximum flexibility.
2585 </para>
2586
2587 <para>
2588  After making any changes, there is no need to restart
2589  <application>Privoxy</application> in order for the changes to take
2590  effect. <application>Privoxy</application> detects such changes
2591  automatically. Note, however, that it may take one or two additional
2592  requests for the change to take effect. When changing the listening address
2593  of <application>Privoxy</application>, these <quote>wake up</quote> requests
2594  must obviously be sent to the <emphasis>old</emphasis> listening address.
2595 </para>
2596
2597 <![%p-not-stable;[
2598 <para>
2599  While under development, the configuration content is subject to change.
2600  The below documentation may not be accurate by the time you read this.
2601  Also, what constitutes a <quote>default</quote> setting, may change, so
2602  please check all your configuration files on important issues.
2603 </para>
2604 ]]>
2605
2606 </sect2>
2607 </sect1>
2608 <!--  ~  End section  ~  -->
2609
2610
2611 <!--   ~~~~~~~~       New section Header    ~~~~~~~~~     -->
2612
2613 <!-- **************************************************** -->
2614 <!-- Include config.sgml here -->
2615 <!-- This is where the entire config file is detailed. -->
2616  &config;
2617 <!-- end include  -->
2618
2619
2620 <!--  ~  End section  ~  -->
2621
2622
2623
2624 <!--   ~~~~~~~~       New section Header    ~~~~~~~~~     -->
2625
2626 <sect1 id="actions-file"><title>Actions Files</title>
2627
2628
2629 <!--
2630   XXX: similar descriptions are in the Configuration Files sections.
2631   We should only describe them at one place.
2632 -->
2633 <para>
2634  The actions files are used to define what <emphasis>actions</emphasis>
2635  <application>Privoxy</application> takes for which URLs, and thus determines
2636  how ad images, cookies and various other aspects of HTTP content and
2637  transactions are handled, and on which sites (or even parts thereof).
2638  There are a number of such actions, with a wide range of functionality.
2639  Each action does something a little different.
2640  These actions give us a veritable arsenal of tools with which to exert
2641  our control, preferences and independence. Actions can be combined so that
2642  their effects are aggregated when applied against a given set of URLs.
2643 </para>
2644 <para>
2645  There
2646  are three action files included with <application>Privoxy</application> with
2647  differing purposes:
2648 </para>
2649 <para>
2650  <itemizedlist>
2651   <listitem>
2652    <para>
2653     <filename>match-all.action</filename> - is used to define which
2654     <quote>actions</quote> relating to banner-blocking, images, pop-ups,
2655     content modification, cookie handling etc should be applied by default.
2656     It should be the first actions file loaded
2657    </para>
2658   </listitem>
2659   <listitem>
2660    <para>
2661     <filename>default.action</filename> - defines many exceptions (both
2662     positive and negative) from the default set of actions that's configured
2663     in <filename>match-all.action</filename>. It is a set of rules that should
2664     work reasonably well as-is for most users. This file is only supposed to
2665     be edited by the developers. It should be the second actions file loaded.
2666    </para>
2667   </listitem>
2668   <listitem>
2669    <para>
2670     <filename>user.action</filename> - is intended to be for local site
2671     preferences and exceptions. As an example, if your ISP or your bank
2672     has specific requirements, and need special handling, this kind of
2673     thing should go here. This file will not be upgraded.
2674    </para>
2675   </listitem>
2676   <listitem>
2677    <para>
2678     <guibutton>Edit</guibutton>  <guibutton>Set to Cautious</guibutton> <guibutton>Set to Medium</guibutton>  <guibutton>Set to Advanced</guibutton>
2679    </para>
2680    <para>
2681     These have increasing levels of aggressiveness <emphasis>and have no
2682     influence on your browsing unless you select them explicitly in the
2683     editor</emphasis>. A default installation should be pre-set to
2684     <literal>Cautious</literal>. New users should try this for a while before
2685     adjusting the settings to more aggressive levels. The more aggressive
2686     the settings, then the more likelihood there is of problems such as sites
2687     not working as they should.
2688    </para>
2689    <para>
2690     The <guibutton>Edit</guibutton> button allows you to turn each
2691     action on/off individually for fine-tuning. The <guibutton>Cautious</guibutton>
2692     button changes the actions list to low/safe settings which will activate
2693     ad blocking and a minimal set of &my-app;'s features, and subsequently
2694     there will be less of a chance for accidental problems. The
2695     <guibutton>Medium</guibutton> button sets the list to a medium level of
2696     other features and a low level set of privacy features. The
2697     <guibutton>Advanced</guibutton> button sets the list to a high level of
2698     ad blocking and medium level of privacy. See the chart below. The latter
2699     three buttons over-ride any changes via with the
2700     <guibutton>Edit</guibutton> button. More fine-tuning can be done in the
2701     lower sections of this internal page.
2702    </para>
2703    <para>
2704     While the actions file editor allows to enable these settings in all
2705     actions files, they are only supposed to be enabled in the first one
2706     to make sure you don't unintentionally overrule earlier rules.
2707    </para>
2708    <para>
2709     The default profiles, and their associated actions, as pre-defined in
2710     <filename>default.action</filename> are:
2711    </para>
2712    <para>
2713     <table frame=all><title>Default Configurations</title>
2714     <tgroup cols=4 align=left colsep=1 rowsep=1>
2715     <colspec colname=c1>
2716     <colspec colname=c2>
2717     <colspec colname=c3>
2718     <colspec colname=c4>
2719     <thead>
2720     <row>
2721       <entry>Feature</entry>
2722       <entry>Cautious</entry>
2723       <entry>Medium</entry>
2724       <entry>Advanced</entry>
2725     </row>
2726     </thead>
2727     <!--  <tfoot> -->
2728     <!--  <row> -->
2729     <!--    <entry>f1</entry> -->
2730     <!--    <entry>f2</entry> -->
2731     <!--    <entry>f3</entry> -->
2732     <!--    <entry>f4</entry> -->
2733     <!--  </row> -->
2734     <!--  </tfoot> -->
2735     <tbody>
2736
2737     <row>
2738       <entry>Ad-blocking Aggressiveness</entry>
2739       <entry>medium</entry>
2740       <entry>high</entry>
2741       <entry>high</entry>
2742     </row>
2743
2744     <row>
2745       <entry>Ad-filtering by size</entry>
2746       <entry>no</entry>
2747       <entry>yes</entry>
2748       <entry>yes</entry>
2749     </row>
2750
2751     <row>
2752       <entry>Ad-filtering by link</entry>
2753       <entry>no</entry>
2754       <entry>no</entry>
2755       <entry>yes</entry>
2756     </row>
2757     <row>
2758       <entry>Pop-up killing</entry>
2759       <entry>blocks only</entry>
2760       <entry>blocks only</entry>
2761       <entry>blocks only</entry>
2762     </row>
2763
2764     <row>
2765       <entry>Privacy Features</entry>
2766       <entry>low</entry>
2767       <entry>medium</entry>
2768       <entry>medium/high</entry>
2769     </row>
2770
2771     <row>
2772       <entry>Cookie handling</entry>
2773       <entry>none</entry>
2774       <entry>session-only</entry>
2775       <entry>kill</entry>
2776     </row>
2777
2778     <row>
2779       <entry>Referer forging</entry>
2780       <entry>no</entry>
2781       <entry>yes</entry>
2782       <entry>yes</entry>
2783     </row>
2784
2785     <row>
2786       <entry>GIF de-animation</entry>
2787       <entry>no</entry>
2788       <entry>yes</entry>
2789       <entry>yes</entry>
2790     </row>
2791
2792     <row>
2793       <entry>Fast redirects</entry>
2794       <entry>no</entry>
2795       <entry>no</entry>
2796       <entry>yes</entry>
2797     </row>
2798
2799     <row>
2800       <entry>HTML taming</entry>
2801       <entry>no</entry>
2802       <entry>no</entry>
2803       <entry>yes</entry>
2804     </row>
2805
2806     <row>
2807       <entry>JavaScript taming</entry>
2808       <entry>no</entry>
2809       <entry>no</entry>
2810       <entry>yes</entry>
2811     </row>
2812
2813     <row>
2814       <entry>Web-bug killing</entry>
2815       <entry>no</entry>
2816       <entry>yes</entry>
2817       <entry>yes</entry>
2818     </row>
2819
2820     <row>
2821       <entry>Image tag reordering</entry>
2822       <entry>no</entry>
2823       <entry>yes</entry>
2824       <entry>yes</entry>
2825     </row>
2826
2827     </tbody>
2828     </tgroup>
2829     </table>
2830     </para>
2831
2832   </listitem>
2833  </itemizedlist>
2834 </para>
2835
2836 <para>
2837  The list of actions files to be used are defined in the main configuration
2838  file, and are processed in the order they are defined (e.g.
2839  <filename>default.action</filename> is typically processed before
2840  <filename>user.action</filename>). The content of these can all be viewed and
2841  edited from <ulink
2842  url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status</ulink>.
2843  The over-riding principle when applying actions, is that the last action that
2844  matches a given URL wins. The broadest, most general rules go first
2845  (defined in <filename>default.action</filename>),
2846  followed by any exceptions (typically also in
2847  <filename>default.action</filename>), which are then followed lastly by any
2848  local preferences (typically in <emphasis>user</emphasis><filename>.action</filename>).
2849  Generally, <filename>user.action</filename> has the last word.
2850  </para>
2851
2852 <para>
2853  An actions file typically has multiple sections. If you want to use
2854  <quote>aliases</quote> in an actions file, you have to place the (optional)
2855  <link linkend="aliases">alias section</link> at the top of that file.
2856  Then comes the default set of rules which will apply universally to all
2857  sites and pages (be <emphasis>very careful</emphasis> with using such a
2858  universal set in <filename>user.action</filename> or any other actions file after
2859  <filename>default.action</filename>, because it will override the result
2860  from consulting any previous file). And then below that,
2861  exceptions to the defined universal policies. You can regard
2862  <filename>user.action</filename> as an appendix to <filename>default.action</filename>,
2863  with the advantage that it is a separate file, which makes preserving your
2864  personal settings across <application>Privoxy</application> upgrades easier.
2865 </para>
2866
2867 <para>
2868  Actions can be used to block anything you want, including ads, banners, or
2869  just some obnoxious URL whose content you would rather not see. Cookies can be accepted
2870  or rejected, or accepted only during the current browser session (i.e. not
2871  written to disk), content can be modified, some JavaScripts tamed, user-tracking
2872  fooled, and much more. See below for a <link linkend="actions">complete list
2873  of actions</link>.
2874 </para>
2875
2876 <!--   ~~~~~       New section      ~~~~~     -->
2877 <sect2>
2878 <title>Finding the Right Mix</title>
2879 <para>
2880  Note that some <link linkend="actions">actions</link>, like cookie suppression
2881  or script disabling, may render some sites unusable that rely on these
2882  techniques to work properly. Finding the right mix of actions is not always easy and
2883  certainly a matter of personal taste. And, things can always change, requiring
2884  refinements in the configuration. In general, it can be said that the more
2885  <quote>aggressive</quote> your default settings (in the top section of the
2886  actions file) are, the more exceptions for <quote>trusted</quote> sites you
2887  will have to make later. If, for example, you want to crunch all cookies per
2888  default, you'll have to make exceptions from that rule for sites that you
2889  regularly use and that require cookies for actually useful purposes, like maybe
2890  your bank, favorite shop, or newspaper.
2891 </para>
2892
2893 <para>
2894  We have tried to provide you with reasonable rules to start from in the
2895  distribution actions files. But there is no general rule of thumb on these
2896  things. There just are too many variables, and sites are constantly changing.
2897  Sooner or later you will want to change the rules (and read this chapter again :).
2898 </para>
2899 </sect2>
2900
2901 <!--   ~~~~~       New section      ~~~~~     -->
2902 <sect2>
2903 <title>How to Edit</title>
2904 <para>
2905  The easiest way to edit the actions files is with a browser by
2906  using our browser-based editor, which can be reached from <ulink
2907  url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status</ulink>.
2908  Note: the config file option <link
2909  linkend="enable-edit-actions">enable-edit-actions</link> must be enabled for
2910  this to work. The editor allows both fine-grained control over every single
2911  feature on a per-URL basis, and easy choosing from wholesale sets of defaults
2912  like <quote>Cautious</quote>, <quote>Medium</quote> or
2913  <quote>Advanced</quote>. Warning: the <quote>Advanced</quote> setting is more
2914  aggressive, and will be more likely to cause problems for some sites.
2915  Experienced users only!
2916  </para>
2917
2918 <para>
2919  If you prefer plain text editing to GUIs, you can of course also directly edit the
2920  the actions files with your favorite text editor. Look at
2921  <filename>default.action</filename> which is richly commented with many
2922  good examples.
2923 </para>
2924 </sect2>
2925
2926
2927 <sect2 id="actions-apply">
2928 <title>How Actions are Applied to Requests</title>
2929 <para>
2930  Actions files are divided into sections. There are special sections,
2931  like the <quote><link linkend="aliases">alias</link></quote> sections which will
2932  be discussed later. For now let's concentrate on regular sections: They have a
2933  heading line (often split up to multiple lines for readability) which consist
2934  of a list of actions, separated by whitespace and enclosed in curly braces.
2935  Below that, there is a list of URL and tag patterns, each on a separate line.
2936 </para>
2937
2938 <para>
2939  To determine which actions apply to a request, the URL of the request is
2940  compared to all URL patterns in each <quote>action file</quote>.
2941  Every time it matches, the list of applicable actions for the request is
2942  incrementally updated, using the heading of the section in which the
2943  pattern is located. The same is done again for tags and tag patterns later on.
2944 </para>
2945
2946 <para>
2947  If multiple applying sections set the same action differently,
2948  the last match wins. If not, the effects are aggregated.
2949  E.g. a URL might match a regular section with a heading line of <literal>{
2950  +<link linkend="handle-as-image">handle-as-image</link> }</literal>,
2951  then later another one with just <literal>{
2952  +<link linkend="block">block</link> }</literal>, resulting
2953  in <emphasis>both</emphasis> actions to apply. And there may well be
2954  cases where you will want to combine actions together. Such a section then
2955  might look like:
2956 </para>
2957
2958  <para>
2959  <screen>
2960   { +<literal>handle-as-image</literal>  +<literal>block{Banner ads.}</literal> }
2961   # Block these as if they were images. Send no block page.
2962    banners.example.com
2963    media.example.com/.*banners
2964    .example.com/images/ads/</screen>
2965  </para>
2966
2967 <para>
2968  You can trace this process for URL patterns and any given URL by visiting <ulink
2969  url="http://config.privoxy.org/show-url-info">http://config.privoxy.org/show-url-info</ulink>.
2970 </para>
2971
2972 <para>
2973  Examples and more detail on this is provided in the Appendix, <link linkend="ACTIONSANAT">
2974  Troubleshooting: Anatomy of an Action</link> section.
2975 </para>
2976 </sect2>
2977
2978 <!--   ~~~~~       New section      ~~~~~     -->
2979 <sect2 id="af-patterns">
2980 <title>Patterns</title>
2981 <para>
2982  As mentioned, <application>Privoxy</application> uses <quote>patterns</quote>
2983  to determine what <emphasis>actions</emphasis> might apply to which sites and
2984  pages your browser attempts to access. These <quote>patterns</quote> use wild
2985  card type <emphasis>pattern</emphasis> matching to achieve a high degree of
2986  flexibility. This allows one expression to be expanded and potentially match
2987  against many similar patterns.
2988 </para>
2989
2990 <para>
2991  Generally, an URL pattern has the form
2992  <literal>&lt;domain&gt;&lt;port&gt;/&lt;path&gt;</literal>, where the
2993  <literal>&lt;domain&gt;</literal>, the <literal>&lt;port&gt;</literal>
2994  and the <literal>&lt;path&gt;</literal> are optional. (This is why the special
2995  <literal>/</literal> pattern matches all URLs). Note that the protocol
2996  portion of the URL pattern (e.g. <literal>http://</literal>) should
2997  <emphasis>not</emphasis> be included in the pattern. This is assumed already!
2998 </para>
2999 <para>
3000  The pattern matching syntax is different for the domain and path parts of
3001  the URL. The domain part uses a simple globbing type matching technique,
3002  while the path part uses more flexible
3003  <ulink url="http://en.wikipedia.org/wiki/Regular_expressions"><quote>Regular
3004   Expressions</quote></ulink> (POSIX 1003.2).
3005 </para>
3006 <para>
3007  The port part of a pattern is a decimal port number preceded by a colon
3008  (<literal>:</literal>). If the domain part contains a numerical IPv6 address,
3009  it has to be put into angle brackets
3010  (<literal>&lt;</literal>, <literal>&gt;</literal>).
3011 </para>
3012
3013 <variablelist>
3014  <varlistentry>
3015   <term><literal>www.example.com/</literal></term>
3016   <listitem>
3017    <para>
3018     is a domain-only pattern and will match any request to <literal>www.example.com</literal>,
3019     regardless of which document on that server is requested. So ALL pages in
3020     this domain would be covered by the scope of this action. Note that a
3021     simple <literal>example.com</literal> is different and would NOT match.
3022    </para>
3023   </listitem>
3024  </varlistentry>
3025  <varlistentry>
3026   <term><literal>www.example.com</literal></term>
3027   <listitem>
3028    <para>
3029     means exactly the same. For domain-only patterns, the trailing <literal>/</literal> may
3030     be omitted.
3031    </para>
3032   </listitem>
3033  </varlistentry>
3034  <varlistentry>
3035   <term><literal>www.example.com/index.html</literal></term>
3036   <listitem>
3037    <para>
3038     matches all the documents on <literal>www.example.com</literal>
3039     whose name starts with <literal>/index.html</literal>.
3040    </para>
3041   </listitem>
3042  </varlistentry>
3043  <varlistentry>
3044   <term><literal>www.example.com/index.html$</literal></term>
3045   <listitem>
3046    <para>
3047     matches only the single document <literal>/index.html</literal>
3048     on <literal>www.example.com</literal>.
3049    </para>
3050   </listitem>
3051  </varlistentry>
3052  <varlistentry>
3053   <term><literal>/index.html$</literal></term>
3054   <listitem>
3055    <para>
3056     matches the document <literal>/index.html</literal>, regardless of the domain,
3057     i.e. on <emphasis>any</emphasis> web server anywhere.
3058    </para>
3059   </listitem>
3060  </varlistentry>
3061  <varlistentry>
3062   <term><literal>/</literal></term>
3063   <listitem>
3064    <para>
3065     Matches any URL because there's no requirement for either the
3066     domain or the path to match anything.
3067    </para>
3068   </listitem>
3069  </varlistentry>
3070  <varlistentry>
3071   <term><literal>:8000/</literal></term>
3072   <listitem>
3073    <para>
3074     Matches any URL pointing to TCP port 8000.
3075    </para>
3076   </listitem>
3077  </varlistentry>
3078  <varlistentry>
3079   <term><literal>&lt;2001:db8::1&gt;/</literal></term>
3080   <listitem>
3081    <para>
3082     Matches any URL with the host address <literal>2001:db8::1</literal>.
3083     (Note that the real URL uses plain brackets, not angle brackets.)
3084    </para>
3085   </listitem>
3086  </varlistentry>
3087  <varlistentry>
3088   <term><literal>index.html</literal></term>
3089   <listitem>
3090    <para>
3091     matches nothing, since it would be interpreted as a domain name and
3092     there is no top-level domain called <literal>.html</literal>. So its
3093     a mistake.
3094    </para>
3095   </listitem>
3096  </varlistentry>
3097 </variablelist>
3098
3099
3100 <!--   ~~~~~       New section      ~~~~~     -->
3101 <sect3><title>The Domain Pattern</title>
3102
3103 <para>
3104  The matching of the domain part offers some flexible options: if the
3105  domain starts or ends with a dot, it becomes unanchored at that end.
3106  For example:
3107 </para>
3108
3109 <variablelist>
3110  <varlistentry>
3111   <term><literal>.example.com</literal></term>
3112   <listitem>
3113    <para>
3114     matches any domain with first-level domain <literal>com</literal>
3115     and second-level domain <literal>example</literal>.
3116     For example <literal>www.example.com</literal>,
3117     <literal>example.com</literal> and <literal>foo.bar.baz.example.com</literal>.
3118     Note that it wouldn't match if the second-level domain was <literal>another-example</literal>.
3119    </para>
3120   </listitem>
3121  </varlistentry>
3122  <varlistentry>
3123   <term><literal>www.</literal></term>
3124   <listitem>
3125    <para>
3126     matches any domain that <emphasis>STARTS</emphasis> with
3127     <literal>www.</literal> (It also matches the domain
3128     <literal>www</literal> but most of the time that doesn't matter.)
3129    </para>
3130   </listitem>
3131  </varlistentry>
3132  <varlistentry>
3133   <term><literal>.example.</literal></term>
3134   <listitem>
3135    <para>
3136     matches any domain that <emphasis>CONTAINS</emphasis> <literal>.example.</literal>.
3137     And, by the way, also included would be any files or documents that exist
3138     within that domain since no path limitations are specified. (Correctly
3139     speaking: It matches any FQDN that contains <literal>example</literal> as
3140     a domain.) This might be <literal>www.example.com</literal>,
3141     <literal>news.example.de</literal>, or
3142     <literal>www.example.net/cgi/testing.pl</literal> for instance. All these
3143     cases are matched.
3144    </para>
3145   </listitem>
3146  </varlistentry>
3147 </variablelist>
3148
3149 <para>
3150  Additionally, there are wild-cards that you can use in the domain names
3151  themselves. These work similarly to shell globbing type wild-cards:
3152  <quote>*</quote> represents zero or more arbitrary characters (this is
3153  equivalent to the
3154  <ulink url="http://en.wikipedia.org/wiki/Regular_expressions"><quote>Regular
3155  Expression</quote></ulink> based syntax of <quote>.*</quote>),
3156  <quote>?</quote>  represents any single character (this is equivalent to the
3157  regular expression syntax of a simple <quote>.</quote>), and you can define
3158  <quote>character classes</quote> in square brackets which is similar to
3159  the same regular expression technique. All of this can be freely mixed:
3160 </para>
3161
3162 <variablelist>
3163  <varlistentry>
3164   <term><literal>ad*.example.com</literal></term>
3165   <listitem>
3166    <para>
3167     matches <quote>adserver.example.com</quote>,
3168     <quote>ads.example.com</quote>, etc but not <quote>sfads.example.com</quote>
3169    </para>
3170   </listitem>
3171  </varlistentry>
3172  <varlistentry>
3173   <term><literal>*ad*.example.com</literal></term>
3174   <listitem>
3175    <para>
3176     matches all of the above, and then some.
3177    </para>
3178   </listitem>
3179  </varlistentry>
3180  <varlistentry>
3181   <term><literal>.?pix.com</literal></term>
3182   <listitem>
3183    <para>
3184     matches <literal>www.ipix.com</literal>,
3185     <literal>pictures.epix.com</literal>, <literal>a.b.c.d.e.upix.com</literal> etc.
3186    </para>
3187   </listitem>
3188  </varlistentry>
3189  <varlistentry>
3190   <term><literal>www[1-9a-ez].example.c*</literal></term>
3191   <listitem>
3192    <para>
3193      matches <literal>www1.example.com</literal>,
3194      <literal>www4.example.cc</literal>, <literal>wwwd.example.cy</literal>,
3195      <literal>wwwz.example.com</literal> etc., but <emphasis>not</emphasis>
3196      <literal>wwww.example.com</literal>.
3197    </para>
3198   </listitem>
3199  </varlistentry>
3200 </variablelist>
3201
3202 <para>
3203  While flexible, this is not the sophistication of full regular expression based syntax.
3204 </para>
3205
3206 </sect3>
3207
3208 <!--  ~  End section  ~  -->
3209
3210
3211 <!--   ~~~~~       New section      ~~~~~     -->
3212 <sect3><title>The Path Pattern</title>
3213
3214 <para>
3215  <application>Privoxy</application> uses <quote>modern</quote> POSIX 1003.2
3216   <ulink url="http://en.wikipedia.org/wiki/Regular_expressions"><quote>Regular
3217   Expressions</quote></ulink> for matching the path portion (after the slash),
3218   and is thus more flexible.
3219 </para>
3220
3221 <para>
3222  There is an <link linkend="regex">Appendix</link> with a brief quick-start into regular
3223  expressions, you also might want to have a look at your operating system's documentation
3224  on regular expressions (try <literal>man re_format</literal>).
3225 </para>
3226
3227 <para>
3228  Note that the path pattern is automatically left-anchored at the <quote>/</quote>,
3229  i.e. it matches as if it would start with a <quote>^</quote> (regular expression speak
3230  for the beginning of a line).
3231 </para>
3232
3233 <para>
3234  Please also note that matching in the path is <emphasis>CASE INSENSITIVE</emphasis>
3235  by default, but you can switch to case sensitive at any point in the pattern by using the
3236  <quote>(?-i)</quote> switch: <literal>www.example.com/(?-i)PaTtErN.*</literal> will match
3237  only documents whose path starts with <literal>PaTtErN</literal> in
3238  <emphasis>exactly</emphasis> this capitalization.
3239 </para>
3240
3241 <variablelist>
3242  <varlistentry>
3243   <term><literal>.example.com/.*</literal></term>
3244   <listitem>
3245    <para>
3246      Is equivalent to just <quote>.example.com</quote>, since any documents
3247      within that domain are matched with or without the <quote>.*</quote>
3248      regular expression. This is redundant
3249    </para>
3250   </listitem>
3251  </varlistentry>
3252  <varlistentry>
3253   <term><literal>.example.com/.*/index.html$</literal></term>
3254   <listitem>
3255    <para>
3256     Will match any page in the domain of <quote>example.com</quote> that is
3257     named <quote>index.html</quote>, and that is part of some path. For
3258     example, it matches <quote>www.example.com/testing/index.html</quote> but
3259     NOT <quote>www.example.com/index.html</quote> because the regular
3260     expression called for at least two <quote>/'s</quote>, thus the path
3261     requirement. It also would match
3262     <quote>www.example.com/testing/index_html</quote>, because of the
3263     special meta-character <quote>.</quote>.
3264    </para>
3265   </listitem>
3266  </varlistentry>
3267  <varlistentry>
3268   <term><literal>.example.com/(.*/)?index\.html$</literal></term>
3269   <listitem>
3270    <para>
3271     This regular expression is conditional so it will match any page
3272     named <quote>index.html</quote> regardless of path which in this case can
3273     have one or more <quote>/'s</quote>. And this one must contain exactly
3274     <quote>.html</quote> (but does not have to end with that!).
3275    </para>
3276   </listitem>
3277  </varlistentry>
3278  <varlistentry>
3279   <term><literal>.example.com/(.*/)(ads|banners?|junk)</literal></term>
3280   <listitem>
3281    <para>
3282     This regular expression will match any path of <quote>example.com</quote>
3283     that contains any of the words <quote>ads</quote>, <quote>banner</quote>,
3284     <quote>banners</quote> (because of the <quote>?</quote>) or <quote>junk</quote>.
3285     The path does not have to end in these words, just contain them.
3286    </para>
3287   </listitem>
3288  </varlistentry>
3289  <varlistentry>
3290   <term><literal>.example.com/(.*/)(ads|banners?|junk)/.*\.(jpe?g|gif|png)$</literal></term>
3291   <listitem>
3292    <para>
3293     This is very much the same as above, except now it must end in either
3294     <quote>.jpg</quote>, <quote>.jpeg</quote>, <quote>.gif</quote> or <quote>.png</quote>. So this
3295     one is limited to common image formats.
3296    </para>
3297   </listitem>
3298  </varlistentry>
3299
3300 </variablelist>
3301 <para>
3302  There are many, many good examples to be found in <filename>default.action</filename>,
3303  and more tutorials below in <link linkend="regex">Appendix on regular expressions</link>.
3304 </para>
3305
3306 </sect3>
3307
3308 <!--  ~  End section  ~  -->
3309
3310
3311 <!--   ~~~~~       New section      ~~~~~     -->
3312 <sect3 id="tag-pattern"><title>The Tag Pattern</title>
3313
3314 <para>
3315  Tag patterns are used to change the applying actions based on the
3316  request's tags. Tags can be created with either the
3317  <link linkend="CLIENT-HEADER-TAGGER">client-header-tagger</link>
3318  or the  <link linkend="SERVER-HEADER-TAGGER">server-header-tagger</link> action.
3319 </para>
3320
3321 <para>
3322  Tag patterns have to start with <quote>TAG:</quote>, so &my-app;
3323  can tell them apart from URL patterns. Everything after the colon
3324  including white space, is interpreted as a regular expression with
3325  path pattern syntax, except that tag patterns aren't left-anchored
3326  automatically (&my-app; doesn't silently add a <quote>^</quote>,
3327  you have to do it yourself if you need it).
3328 </para>
3329
3330 <para>
3331  To match all requests that are tagged with <quote>foo</quote>
3332  your pattern line should be <quote>TAG:^foo$</quote>,
3333  <quote>TAG:foo</quote> would work as well, but it would also
3334  match requests whose tags contain <quote>foo</quote> somewhere.
3335  <quote>TAG: foo</quote> wouldn't work as it requires white space.
3336 </para>
3337
3338 <para>
3339  Sections can contain URL and tag patterns at the same time,
3340  but tag patterns are checked after the URL patterns and thus
3341  always overrule them, even if they are located before the URL patterns.
3342 </para>
3343
3344 <para>
3345  Once a new tag is added, Privoxy checks right away if it's matched by one
3346  of the tag patterns and updates the action settings accordingly. As a result
3347  tags can be used to activate other tagger actions, as long as these other
3348  taggers look for headers that haven't already be parsed.
3349 </para>
3350
3351 <para>
3352  For example you could tag client requests which use the
3353  <literal>POST</literal> method,
3354  then use this tag to activate another tagger that adds a tag if cookies
3355  are sent, and then use a block action based on the cookie tag. This allows
3356  the outcome of one action, to be input into a subsequent action. However if
3357  you'd reverse the position of the described taggers, and activated the
3358  method tagger based on the cookie tagger, no method tags would be created.
3359  The method tagger would look for the request line, but at the time
3360  the cookie tag is created, the request line has already been parsed.
3361 </para>
3362
3363 <para>
3364  While this is a limitation you should be aware of, this kind of
3365  indirection is seldom needed anyway and even the example doesn't
3366  make too much sense.
3367 </para>
3368
3369 </sect3>
3370
3371 </sect2>
3372
3373 <!--  ~  End section  ~  -->
3374
3375
3376 <!--   ~~~~~       New section      ~~~~~     -->
3377
3378 <sect2 id="actions">
3379 <title>Actions</title>
3380 <para>
3381  All actions are disabled by default, until they are explicitly enabled
3382  somewhere in an actions file. Actions are turned on if preceded with a
3383  <quote>+</quote>, and turned off if preceded with a <quote>-</quote>. So a
3384  <literal>+action</literal> means <quote>do that action</quote>, e.g.
3385  <literal>+block</literal> means <quote>please block URLs that match the
3386  following patterns</quote>, and <literal>-block</literal> means <quote>don't
3387  block URLs that match the following patterns, even if <literal>+block</literal>
3388  previously applied.</quote>
3389
3390 </para>
3391
3392 <para>
3393  Again, actions are invoked by placing them on a line, enclosed in curly braces and
3394  separated by whitespace, like in
3395  <literal>{+some-action -some-other-action{some-parameter}}</literal>,
3396  followed by a list of URL patterns, one per line, to which they apply.
3397  Together, the actions line and the following pattern lines make up a section
3398  of the actions file.
3399 </para>
3400
3401 <para>
3402  Actions fall into three categories:
3403 </para>
3404
3405 <para>
3406  <itemizedlist>
3407  <listitem>
3408   <para>
3409    Boolean, i.e the action can only be <quote>enabled</quote> or
3410    <quote>disabled</quote>. Syntax:
3411   </para>
3412   <para>
3413    <screen>
3414   +<replaceable class="function">name</replaceable>        # enable action <replaceable class="parameter">name</replaceable>
3415   -<replaceable class="function">name</replaceable>        # disable action <replaceable class="parameter">name</replaceable></screen>
3416   </para>
3417   <para>
3418    Example: <literal>+handle-as-image</literal>
3419   </para>
3420  </listitem>
3421
3422
3423  <listitem>
3424   <para>
3425    Parameterized, where some value is required in order to enable this type of action.
3426    Syntax:
3427   </para>
3428   <para>
3429    <screen>
3430   +<replaceable class="function">name</replaceable>{<replaceable class="parameter">param</replaceable>}  # enable action and set parameter to <replaceable class="parameter">param</replaceable>,
3431                # overwriting parameter from previous match if necessary
3432   -<replaceable class="function">name</replaceable>         # disable action. The parameter can be omitted</screen>
3433   </para>
3434   <para>
3435    Note that if the URL matches multiple positive forms of a parameterized action,
3436    the last match wins, i.e. the params from earlier matches are simply ignored.
3437   </para>
3438   <para>
3439    Example: <literal>+hide-user-agent{Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.1.4) Gecko/20070602 Firefox/2.0.0.4}</literal>
3440   </para>
3441  </listitem>
3442
3443  <listitem>
3444   <para>
3445    Multi-value. These look exactly like parameterized actions,
3446    but they behave differently: If the action applies multiple times to the
3447    same URL, but with different parameters, <emphasis>all</emphasis> the parameters
3448    from <emphasis>all</emphasis> matches are remembered. This is used for actions
3449    that can be executed for the same request repeatedly, like adding multiple
3450    headers, or filtering through multiple filters. Syntax:
3451   </para>
3452   <para>
3453    <screen>
3454   +<replaceable class="function">name</replaceable>{<replaceable class="parameter">param</replaceable>}   # enable action and add <replaceable class="parameter">param</replaceable> to the list of parameters
3455   -<replaceable class="function">name</replaceable>{<replaceable class="parameter">param</replaceable>}   # remove the parameter <replaceable class="parameter">param</replaceable> from the list of parameters
3456                 # If it was the last one left, disable the action.
3457   <replaceable class="parameter">-name</replaceable>          # disable this action completely and remove all parameters from the list</screen>
3458   </para>
3459   <para>
3460    Examples: <literal>+add-header{X-Fun-Header: Some text}</literal> and
3461    <literal>+filter{html-annoyances}</literal>
3462   </para>
3463  </listitem>
3464
3465  </itemizedlist>
3466 </para>
3467
3468 <para>
3469  If nothing is specified in any actions file, no <quote>actions</quote> are
3470  taken. So in this case <application>Privoxy</application> would just be a
3471  normal, non-blocking, non-filtering proxy. You must specifically enable the
3472  privacy and blocking features you need (although the provided default actions
3473  files will give a good starting point).
3474 </para>
3475
3476 <para>
3477  Later defined action sections always over-ride earlier ones of the same type.
3478  So exceptions to any rules you make, should come in the latter part of the file (or
3479  in a file that is processed later when using multiple actions files such
3480  as <filename>user.action</filename>). For multi-valued actions, the actions
3481  are applied in the order they are specified. Actions files are processed in
3482  the order they are defined in <filename>config</filename> (the default
3483  installation has three actions files). It also quite possible for any given
3484  URL to match more than one <quote>pattern</quote> (because of wildcards and
3485  regular expressions), and thus to trigger more than one set of actions! Last
3486  match wins.
3487 </para>
3488
3489 <!-- start actions listing -->
3490 <para>
3491  The list of valid <application>Privoxy</application> actions are:
3492 </para>
3493
3494
3495 <!-- ********************************************************** -->
3496 <!-- Please note the below defined actions use id's that are    -->
3497 <!-- probably linked from other places, so please don't change. -->
3498 <!--                                                            -->
3499 <!-- ********************************************************** -->
3500
3501
3502 <!--   ~~~~~       New section      ~~~~~     -->
3503
3504 <sect3 renderas="sect4" id="add-header">
3505 <title>add-header</title>
3506
3507 <variablelist>
3508  <varlistentry>
3509   <term>Typical use:</term>
3510   <listitem>
3511    <para>Confuse log analysis, custom applications</para>
3512   </listitem>
3513  </varlistentry>
3514
3515  <varlistentry>
3516   <term>Effect:</term>
3517   <listitem>
3518    <para>
3519     Sends a user defined HTTP header to the web server.
3520    </para>
3521   </listitem>
3522  </varlistentry>
3523
3524  <varlistentry>
3525   <term>Type:</term>
3526   <!-- boolean, parameterized, Multi-value -->
3527   <listitem>
3528    <para>Multi-value.</para>
3529   </listitem>
3530  </varlistentry>
3531
3532  <varlistentry>
3533   <term>Parameter:</term>
3534   <listitem>
3535    <para>
3536     Any string value is possible. Validity of the defined HTTP headers is not checked.
3537     It is recommended that you use the <quote><literal>X-</literal></quote> prefix
3538     for custom headers.
3539    </para>
3540   </listitem>
3541  </varlistentry>
3542
3543 <varlistentry>
3544   <term>Notes:</term>
3545   <listitem>
3546    <para>
3547     This action may be specified multiple times, in order to define multiple
3548     headers. This is rarely needed for the typical user. If you don't know what
3549     <quote>HTTP headers</quote> are, you definitely don't need to worry about this
3550     one.
3551    </para>
3552    <para>
3553     Headers added by this action are not modified by other actions.
3554    </para>
3555   </listitem>
3556  </varlistentry>
3557
3558  <varlistentry>
3559   <term>Example usage:</term>
3560   <listitem>
3561     <para>
3562      <screen>+add-header{X-User-Tracking: sucks}</screen>
3563    </para>
3564   </listitem>
3565  </varlistentry>
3566 </variablelist>
3567 </sect3>
3568
3569
3570 <!--   ~~~~~       New section      ~~~~~     -->
3571 <sect3 renderas="sect4" id="block">
3572 <title>block</title>
3573
3574 <variablelist>
3575  <varlistentry>
3576   <term>Typical use:</term>
3577   <listitem>
3578    <para>Block ads or other unwanted content</para>
3579   </listitem>
3580  </varlistentry>
3581
3582  <varlistentry>
3583   <term>Effect:</term>
3584   <listitem>
3585    <para>
3586     Requests for URLs to which this action applies are blocked, i.e. the
3587     requests are trapped by &my-app; and the requested URL is never retrieved,
3588     but is answered locally with a substitute page or image, as determined by
3589     the <literal><link
3590     linkend="handle-as-image">handle-as-image</link></literal>,
3591     <literal><link
3592     linkend="set-image-blocker">set-image-blocker</link></literal>, and
3593     <literal><link
3594     linkend="handle-as-empty-document">handle-as-empty-document</link></literal> actions.
3595
3596    </para>
3597   </listitem>
3598  </varlistentry>
3599
3600  <varlistentry>
3601   <term>Type:</term>
3602   <!-- boolean, parameterized, Multi-value -->
3603   <listitem>
3604    <para>Parameterized.</para>
3605   </listitem>
3606  </varlistentry>
3607
3608  <varlistentry>
3609   <term>Parameter:</term>
3610   <listitem>
3611    <para>A block reason that should be given to the user.</para>
3612   </listitem>
3613  </varlistentry>
3614
3615 <varlistentry>
3616   <term>Notes:</term>
3617   <listitem>
3618    <para>
3619     <application>Privoxy</application> sends a special <quote>BLOCKED</quote> page
3620     for requests to blocked pages. This page contains the block reason given as
3621     parameter, a link to find out why the block action applies, and a click-through
3622     to the blocked content (the latter only if the force feature is available and
3623     enabled).
3624    </para>
3625    <para>
3626     A very important exception occurs if <emphasis>both</emphasis>
3627     <literal>block</literal> and <literal><link linkend="handle-as-image">handle-as-image</link></literal>,
3628     apply to the same request: it will then be replaced by an image. If
3629     <literal><link linkend="set-image-blocker">set-image-blocker</link></literal>
3630     (see below) also applies, the type of image will be determined by its parameter,
3631     if not, the standard checkerboard pattern is sent.
3632    </para>
3633    <para>
3634     It is important to understand this process, in order
3635     to understand how <application>Privoxy</application> deals with
3636     ads and other unwanted content. Blocking is a core feature, and one
3637     upon which various other features depend.
3638    </para>
3639    <para>
3640     The <literal><link linkend="filter">filter</link></literal>
3641     action can perform a very similar task, by <quote>blocking</quote>
3642     banner images and other content through rewriting the relevant URLs in the
3643     document's HTML source, so they don't get requested in the first place.
3644     Note that this is a totally different technique, and it's easy to confuse the two.
3645    </para>
3646   </listitem>
3647  </varlistentry>
3648
3649  <varlistentry>
3650   <term>Example usage (section):</term>
3651   <listitem>
3652     <para>
3653      <screen>{+block{No nasty stuff for you.}}
3654 # Block and replace with "blocked" page
3655  .nasty-stuff.example.com
3656
3657 {+block{Doubleclick banners.} +handle-as-image}
3658 # Block and replace with image
3659  .ad.doubleclick.net
3660  .ads.r.us/banners/
3661
3662 {+block{Layered ads.} +handle-as-empty-document}
3663 # Block and then ignore
3664  adserver.example.net/.*\.js$</screen>
3665     </para>
3666   </listitem>
3667  </varlistentry>
3668
3669
3670 </variablelist>
3671 </sect3>
3672
3673
3674 <!--   ~~~~~       New section      ~~~~~     -->
3675 <sect3 renderas="sect4" id="change-x-forwarded-for">
3676 <title>change-x-forwarded-for</title>
3677
3678 <variablelist>
3679  <varlistentry>
3680   <term>Typical use:</term>
3681   <listitem>
3682    <para>Improve privacy by not forwarding the source of the request in the HTTP headers.</para>
3683   </listitem>
3684  </varlistentry>
3685
3686  <varlistentry>
3687   <term>Effect:</term>
3688   <listitem>
3689    <para>
3690     Deletes the <quote>X-Forwarded-For:</quote> HTTP header from the client request,
3691     or adds a new one.
3692    </para>
3693   </listitem>
3694  </varlistentry>
3695
3696  <varlistentry>
3697   <term>Type:</term>
3698   <!-- Boolean, Parameterized, Multi-value -->
3699   <listitem>
3700    <para>Parameterized.</para>
3701   </listitem>
3702  </varlistentry>
3703
3704  <varlistentry>
3705   <term>Parameter:</term>
3706   <listitem>
3707    <itemizedlist>
3708     <listitem>
3709      <para><quote>block</quote> to delete the header.</para>
3710     </listitem>
3711     <listitem>
3712      <para>
3713        <quote>add</quote> to create the header (or append
3714        the client's IP address to an already existing one).
3715      </para>
3716     </listitem>
3717    </itemizedlist>
3718   </listitem>
3719  </varlistentry>
3720
3721  <varlistentry>
3722   <term>Notes:</term>
3723   <listitem>
3724    <para>
3725     It is safe and recommended to use <literal>block</literal>.
3726    </para>
3727    <para>
3728     Forwarding the source address of the request may make
3729     sense in some multi-user setups but is also a privacy risk.
3730    </para>
3731   </listitem>
3732  </varlistentry>
3733  <varlistentry>
3734   <term>Example usage:</term>
3735   <listitem>
3736     <para>
3737      <screen>+change-x-forwarded-for{block}</screen>
3738    </para>
3739   </listitem>
3740  </varlistentry>
3741 </variablelist>
3742 </sect3>
3743
3744 <!--   ~~~~~       New section      ~~~~~     -->
3745 <sect3 renderas="sect4" id="client-header-filter">
3746 <title>client-header-filter</title>
3747
3748 <variablelist>
3749  <varlistentry>
3750   <term>Typical use:</term>
3751   <listitem>
3752    <para>
3753    Rewrite or remove single client headers.
3754    </para>
3755   </listitem>
3756  </varlistentry>
3757
3758  <varlistentry>
3759   <term>Effect:</term>
3760   <listitem>
3761    <para>
3762     All client headers to which this action applies are filtered on-the-fly through
3763     the specified regular expression based substitutions.
3764    </para>
3765   </listitem>
3766  </varlistentry>
3767
3768  <varlistentry>
3769   <term>Type:</term>
3770   <!-- boolean, parameterized, Multi-value -->
3771   <listitem>
3772    <para>Parameterized.</para>
3773   </listitem>
3774  </varlistentry>
3775
3776  <varlistentry>
3777   <term>Parameter:</term>
3778   <listitem>
3779    <para>
3780     The name of a client-header filter, as defined in one of the
3781     <link linkend="filter-file">filter files</link>.
3782    </para>
3783   </listitem>
3784  </varlistentry>
3785
3786  <varlistentry>
3787   <term>Notes:</term>
3788   <listitem>
3789    <para>
3790     Client-header filters are applied to each header on its own, not to
3791     all at once. This makes it easier to diagnose problems, but on the downside
3792     you can't write filters that only change header x if header y's value is z.
3793     You can do that by using tags though.
3794    </para>
3795    <para>
3796     Client-header filters are executed after the other header actions have finished
3797     and use their output as input.
3798    </para>
3799    <para>
3800     If the request URI gets changed, &my-app; will detect that and use the new
3801     one. This can be used to rewrite the request destination behind the client's
3802     back, for example to specify a Tor exit relay for certain requests.
3803    </para>
3804    <para>
3805     Please refer to the <link linkend="filter-file">filter file chapter</link>
3806     to learn which client-header filters are available by default, and how to
3807     create your own.
3808    </para>
3809
3810   </listitem>
3811  </varlistentry>
3812
3813  <varlistentry>
3814   <term>Example usage (section):</term>
3815   <listitem>
3816     <para>
3817      <screen>
3818 # Hide Tor exit notation in Host and Referer Headers
3819 {+client-header-filter{hide-tor-exit-notation}}
3820 /
3821     </screen>
3822    </para>
3823   </listitem>
3824  </varlistentry>
3825
3826 </variablelist>
3827 </sect3>
3828
3829
3830 <!--   ~~~~~       New section      ~~~~~     -->
3831 <sect3 renderas="sect4" id="client-header-tagger">
3832 <title>client-header-tagger</title>
3833
3834 <variablelist>
3835  <varlistentry>
3836   <term>Typical use:</term>
3837   <listitem>
3838    <para>
3839    Block requests based on their headers.
3840    </para>
3841   </listitem>
3842  </varlistentry>
3843
3844  <varlistentry>
3845   <term>Effect:</term>
3846   <listitem>
3847    <para>
3848     Client headers to which this action applies are filtered on-the-fly through
3849     the specified regular expression based substitutions, the result is used as
3850     tag.
3851    </para>
3852   </listitem>
3853  </varlistentry>
3854
3855  <varlistentry>
3856   <term>Type:</term>
3857   <!-- boolean, parameterized, Multi-value -->
3858   <listitem>
3859    <para>Parameterized.</para>
3860   </listitem>
3861  </varlistentry>
3862
3863  <varlistentry>
3864   <term>Parameter:</term>
3865   <listitem>
3866    <para>
3867     The name of a client-header tagger, as defined in one of the
3868     <link linkend="filter-file">filter files</link>.
3869    </para>
3870   </listitem>
3871  </varlistentry>
3872
3873  <varlistentry>
3874   <term>Notes:</term>
3875   <listitem>
3876    <para>
3877     Client-header taggers are applied to each header on its own,
3878     and as the header isn't modified, each tagger <quote>sees</quote>
3879     the original.
3880    </para>
3881    <para>
3882     Client-header taggers are the first actions that are executed
3883     and their tags can be used to control every other action.
3884    </para>
3885  </listitem>
3886  </varlistentry>
3887
3888  <varlistentry>
3889   <term>Example usage (section):</term>
3890   <listitem>
3891     <para>
3892      <screen>
3893 # Tag every request with the User-Agent header
3894 {+client-header-tagger{user-agent}}
3895 /
3896
3897 # Tagging itself doesn't change the action
3898 # settings, sections with TAG patterns do:
3899 #
3900 # If it's a download agent, use a different forwarding proxy,
3901 # show the real User-Agent and make sure resume works.
3902 {+forward-override{forward-socks5 10.0.0.2:2222 .} \
3903  -hide-if-modified-since      \
3904  -overwrite-last-modified     \
3905  -hide-user-agent             \
3906  -filter                      \
3907  -deanimate-gifs              \
3908 }
3909 TAG:^User-Agent: NetBSD-ftp/
3910 TAG:^User-Agent: Novell ZYPP Installer
3911 TAG:^User-Agent: RPM APT-HTTP/
3912 TAG:^User-Agent: fetch libfetch/
3913 TAG:^User-Agent: Ubuntu APT-HTTP/
3914 TAG:^User-Agent: MPlayer/
3915     </screen>
3916    </para>
3917    <para>
3918      <screen>
3919 # Tag all requests with the Range header set
3920 {+client-header-tagger{range-requests}}
3921 /
3922
3923 # Disable filtering for the tagged requests.
3924 #
3925 # With filtering enabled Privoxy would remove the Range headers
3926 # to be able to filter the whole response. The downside is that
3927 # it prevents clients from resuming downloads or skipping over
3928 # parts of multimedia files.
3929 {-filter -deanimate-gifs}
3930 TAG:^RANGE-REQUEST$
3931     </screen>
3932     </para>
3933   </listitem>
3934  </varlistentry>
3935
3936 </variablelist>
3937 </sect3>
3938
3939
3940 <!--   ~~~~~       New section      ~~~~~     -->
3941 <sect3 renderas="sect4" id="content-type-overwrite">
3942 <title>content-type-overwrite</title>
3943
3944 <variablelist>
3945  <varlistentry>
3946   <term>Typical use:</term>
3947   <listitem>
3948    <para>Stop useless download menus from popping up, or change the browser's rendering mode</para>
3949   </listitem>
3950  </varlistentry>
3951
3952  <varlistentry>
3953   <term>Effect:</term>
3954   <listitem>
3955    <para>
3956     Replaces the <quote>Content-Type:</quote> HTTP server header.
3957    </para>
3958   </listitem>
3959  </varlistentry>
3960
3961  <varlistentry>
3962   <term>Type:</term>
3963   <!-- Boolean, Parameterized, Multi-value -->
3964   <listitem>
3965    <para>Parameterized.</para>
3966   </listitem>
3967  </varlistentry>
3968
3969  <varlistentry>
3970   <term>Parameter:</term>
3971   <listitem>
3972    <para>
3973     Any string.
3974    </para>
3975   </listitem>
3976  </varlistentry>
3977
3978  <varlistentry>
3979   <term>Notes:</term>
3980   <listitem>
3981    <para>
3982     The <quote>Content-Type:</quote> HTTP server header is used by the
3983     browser to decide what to do with the document. The value of this
3984     header can cause the browser to open a download menu instead of
3985     displaying the document by itself, even if the document's format is
3986     supported by the browser.
3987    </para>
3988    <para>
3989     The declared content type can also affect which rendering mode
3990     the browser chooses. If XHTML is delivered as <quote>text/html</quote>,
3991     many browsers treat it as yet another broken HTML document.
3992     If it is send as <quote>application/xml</quote>, browsers with
3993     XHTML support will only display it, if the syntax is correct.
3994    </para>
3995    <para>
3996     If you see a web site that proudly uses XHTML buttons, but sets
3997     <quote>Content-Type: text/html</quote>, you can use &my-app;
3998     to overwrite it with <quote>application/xml</quote> and validate
3999     the web master's claim inside your XHTML-supporting browser.
4000     If the syntax is incorrect, the browser will complain loudly.
4001    </para>
4002    <para>
4003     You can also go the opposite direction: if your browser prints
4004     error messages instead of rendering a document falsely declared
4005     as XHTML, you can overwrite the content type with
4006     <quote>text/html</quote> and have it rendered as broken HTML document.
4007    </para>
4008    <para>
4009     By default <literal>content-type-overwrite</literal> only replaces
4010     <quote>Content-Type:</quote> headers that look like some kind of text.
4011     If you want to overwrite it unconditionally, you have to combine it with
4012     <literal><link linkend="force-text-mode">force-text-mode</link></literal>.
4013     This limitation exists for a reason, think twice before circumventing it.
4014    </para>
4015    <para>
4016     Most of the time it's easier to replace this action with a custom
4017     <literal><link linkend="server-header-filter">server-header filter</link></literal>.
4018     It allows you to activate it for every document of a certain site and it will still
4019     only replace the content types you aimed at.
4020    </para>
4021    <para>
4022     Of course you can apply <literal>content-type-overwrite</literal>
4023     to a whole site and then make URL based exceptions, but it's a lot
4024     more work to get the same precision.
4025    </para>
4026   </listitem>
4027  </varlistentry>
4028
4029  <varlistentry>
4030   <term>Example usage (sections):</term>
4031   <listitem>
4032     <para>
4033      <screen># Check if www.example.net/ really uses valid XHTML
4034 { +content-type-overwrite{application/xml} }
4035 www.example.net/
4036
4037 # but leave the content type unmodified if the URL looks like a style sheet
4038 {-content-type-overwrite}
4039 www.example.net/.*\.css$
4040 www.example.net/.*style
4041 </screen>
4042    </para>
4043   </listitem>
4044  </varlistentry>
4045 </variablelist>
4046 </sect3>
4047
4048
4049 <!--   ~~~~~       New section      ~~~~~     -->
4050 <sect3 renderas="sect4" id="crunch-client-header">
4051 <!--
4052 new action
4053 -->
4054 <title>crunch-client-header</title>
4055
4056 <variablelist>
4057  <varlistentry>
4058   <term>Typical use:</term>
4059   <listitem>
4060    <para>Remove a client header <application>Privoxy</application> has no dedicated action for.</para>
4061   </listitem>
4062  </varlistentry>
4063
4064  <varlistentry>
4065   <term>Effect:</term>
4066   <listitem>
4067    <para>
4068     Deletes every header sent by the client that contains the string the user supplied as parameter.
4069    </para>
4070   </listitem>
4071  </varlistentry>
4072
4073  <varlistentry>
4074   <term>Type:</term>
4075   <!-- Boolean, Parameterized, Multi-value -->
4076   <listitem>
4077    <para>Parameterized.</para>
4078   </listitem>
4079  </varlistentry>
4080
4081  <varlistentry>
4082   <term>Parameter:</term>
4083   <listitem>
4084    <para>
4085     Any string.
4086    </para>
4087   </listitem>
4088  </varlistentry>
4089
4090  <varlistentry>
4091   <term>Notes:</term>
4092   <listitem>
4093    <para>
4094     This action allows you to block client headers for which no dedicated
4095     <application>Privoxy</application> action exists.
4096     <application>Privoxy</application> will remove every client header that
4097     contains the string you supplied as parameter.
4098    </para>
4099    <para>
4100     Regular expressions are <emphasis>not supported</emphasis> and you can't
4101     use this action to block different headers in the same request, unless
4102     they contain the same string.
4103    </para>
4104    <para>
4105     <literal>crunch-client-header</literal> is only meant for quick tests.
4106     If you have to block several different headers, or only want to modify
4107     parts of them, you should use a
4108     <literal><link linkend="client-header-filter">client-header filter</link></literal>.
4109    </para>
4110     <warning>
4111      <para>
4112       Don't block any header without understanding the consequences.
4113      </para>
4114     </warning>
4115   </listitem>
4116  </varlistentry>
4117
4118  <varlistentry>
4119   <term>Example usage (section):</term>
4120   <listitem>
4121     <para>
4122      <screen># Block the non-existent "Privacy-Violation:" client header
4123 { +crunch-client-header{Privacy-Violation:} }
4124 /
4125     </screen>
4126    </para>
4127   </listitem>
4128  </varlistentry>
4129 </variablelist>
4130 </sect3>
4131
4132
4133 <!--   ~~~~~       New section      ~~~~~     -->
4134 <sect3 renderas="sect4" id="crunch-if-none-match">
4135 <title>crunch-if-none-match</title>
4136 <!--
4137 new action
4138 -->
4139 <variablelist>
4140  <varlistentry>
4141   <term>Typical use:</term>
4142   <listitem>
4143    <para>Prevent yet another way to track the user's steps between sessions.</para>
4144   </listitem>
4145  </varlistentry>
4146
4147  <varlistentry>
4148   <term>Effect:</term>
4149   <listitem>
4150    <para>
4151     Deletes the <quote>If-None-Match:</quote> HTTP client header.
4152    </para>
4153   </listitem>
4154  </varlistentry>
4155
4156  <varlistentry>
4157   <term>Type:</term>
4158   <!-- Boolean, Parameterized, Multi-value -->
4159   <listitem>
4160    <para>Boolean.</para>
4161   </listitem>
4162  </varlistentry>
4163
4164  <varlistentry>
4165   <term>Parameter:</term>
4166   <listitem>
4167    <para>
4168     N/A
4169    </para>
4170   </listitem>
4171  </varlistentry>
4172
4173  <varlistentry>
4174   <term>Notes:</term>
4175   <listitem>
4176    <para>
4177     Removing the <quote>If-None-Match:</quote> HTTP client header
4178     is useful for filter testing, where you want to force a real
4179     reload instead of getting status code <quote>304</quote> which
4180     would cause the browser to use a cached copy of the page.
4181    </para>
4182    <para>
4183     It is also useful to make sure the header isn't used as a cookie
4184     replacement (unlikely but possible).
4185    </para>
4186    <para>
4187     Blocking the <quote>If-None-Match:</quote> header shouldn't cause any
4188     caching problems, as long as the <quote>If-Modified-Since:</quote> header
4189     isn't blocked or missing as well.
4190    </para>
4191    <para>
4192     It is recommended to use this action together with
4193     <literal><link linkend="hide-if-modified-since">hide-if-modified-since</link></literal>
4194     and
4195     <literal><link linkend="overwrite-last-modified">overwrite-last-modified</link></literal>.
4196    </para>
4197   </listitem>
4198  </varlistentry>
4199
4200  <varlistentry>
4201   <term>Example usage (section):</term>
4202   <listitem>
4203     <para>
4204      <screen># Let the browser revalidate cached documents but don't
4205 # allow the server to use the revalidation headers for user tracking.
4206 {+hide-if-modified-since{-60} \
4207  +overwrite-last-modified{randomize} \
4208  +crunch-if-none-match}
4209 /   </screen>
4210    </para>
4211   </listitem>
4212  </varlistentry>
4213 </variablelist>
4214 </sect3>
4215
4216
4217 <!--   ~~~~~       New section      ~~~~~     -->
4218 <sect3 renderas="sect4" id="crunch-incoming-cookies">
4219 <title>crunch-incoming-cookies</title>
4220
4221 <variablelist>
4222  <varlistentry>
4223   <term>Typical use:</term>
4224   <listitem>
4225    <para>
4226     Prevent the web server from setting HTTP cookies on your system
4227    </para>
4228   </listitem>
4229  </varlistentry>
4230
4231  <varlistentry>
4232   <term>Effect:</term>
4233   <listitem>
4234    <para>
4235     Deletes any <quote>Set-Cookie:</quote> HTTP headers from server replies.
4236    </para>
4237   </listitem>
4238  </varlistentry>
4239
4240  <varlistentry>
4241   <term>Type:</term>
4242   <!-- Boolean, Parameterized, Multi-value -->
4243   <listitem>
4244    <para>Boolean.</para>
4245   </listitem>
4246  </varlistentry>
4247
4248  <varlistentry>
4249   <term>Parameter:</term>
4250   <listitem>
4251    <para>
4252     N/A
4253    </para>
4254   </listitem>
4255  </varlistentry>
4256
4257  <varlistentry>
4258   <term>Notes:</term>
4259   <listitem>
4260    <para>
4261     This action is only concerned with <emphasis>incoming</emphasis> HTTP cookies. For
4262     <emphasis>outgoing</emphasis> HTTP cookies, use
4263     <literal><link linkend="crunch-outgoing-cookies">crunch-outgoing-cookies</link></literal>.
4264     Use <emphasis>both</emphasis> to disable HTTP cookies completely.
4265    </para>
4266    <para>
4267     It makes <emphasis>no sense at all</emphasis> to use this action in conjunction
4268     with the <literal><link linkend="session-cookies-only">session-cookies-only</link></literal> action,
4269     since it would prevent the session cookies from being set. See also
4270     <literal><link linkend="filter-content-cookies">filter-content-cookies</link></literal>.
4271    </para>
4272   </listitem>
4273  </varlistentry>
4274
4275  <varlistentry>
4276   <term>Example usage:</term>
4277   <listitem>
4278    <para>
4279     <screen>+crunch-incoming-cookies</screen>
4280    </para>
4281   </listitem>
4282  </varlistentry>
4283 </variablelist>
4284 </sect3>
4285
4286
4287 <!--   ~~~~~       New section      ~~~~~     -->
4288 <sect3 renderas="sect4" id="crunch-server-header">
4289 <title>crunch-server-header</title>
4290 <!--
4291 new action
4292 -->
4293 <variablelist>
4294  <varlistentry>
4295   <term>Typical use:</term>
4296   <listitem>
4297    <para>Remove a server header <application>Privoxy</application> has no dedicated action for.</para>
4298   </listitem>
4299  </varlistentry>
4300
4301  <varlistentry>
4302   <term>Effect:</term>
4303   <listitem>
4304    <para>
4305     Deletes every header sent by the server that contains the string the user supplied as parameter.
4306    </para>
4307   </listitem>
4308  </varlistentry>
4309
4310  <varlistentry>
4311   <term>Type:</term>
4312   <!-- Boolean, Parameterized, Multi-value -->
4313   <listitem>
4314    <para>Parameterized.</para>
4315   </listitem>
4316  </varlistentry>
4317
4318  <varlistentry>
4319   <term>Parameter:</term>
4320   <listitem>
4321    <para>
4322     Any string.
4323    </para>
4324   </listitem>
4325  </varlistentry>
4326
4327  <varlistentry>
4328   <term>Notes:</term>
4329   <listitem>
4330    <para>
4331     This action allows you to block server headers for which no dedicated
4332     <application>Privoxy</application> action exists. <application>Privoxy</application>
4333     will remove every server header that contains the string you supplied as parameter.
4334    </para>
4335    <para>
4336     Regular expressions are <emphasis>not supported</emphasis> and you can't
4337     use this action to block different headers in the same request, unless
4338     they contain the same string.
4339    </para>
4340    <para>
4341     <literal>crunch-server-header</literal> is only meant for quick tests.
4342     If you have to block several different headers, or only want to modify
4343     parts of them, you should use a custom
4344     <literal><link linkend="server-header-filter">server-header filter</link></literal>.
4345    </para>
4346     <warning>
4347      <para>
4348      Don't block any header without understanding the consequences.
4349      </para>
4350     </warning>
4351   </listitem>
4352  </varlistentry>
4353
4354  <varlistentry>
4355   <term>Example usage (section):</term>
4356   <listitem>
4357     <para>
4358      <screen># Crunch server headers that try to prevent caching
4359 { +crunch-server-header{no-cache} }
4360 /   </screen>
4361    </para>
4362   </listitem>
4363  </varlistentry>
4364 </variablelist>
4365 </sect3>
4366
4367
4368 <!--   ~~~~~       New section      ~~~~~     -->
4369 <sect3 renderas="sect4" id="crunch-outgoing-cookies">
4370 <title>crunch-outgoing-cookies</title>
4371
4372 <variablelist>
4373  <varlistentry>
4374   <term>Typical use:</term>
4375   <listitem>
4376    <para>
4377     Prevent the web server from reading any HTTP cookies from your system
4378    </para>
4379   </listitem>
4380  </varlistentry>
4381
4382  <varlistentry>
4383   <term>Effect:</term>
4384   <listitem>
4385    <para>
4386     Deletes any <quote>Cookie:</quote> HTTP headers from client requests.
4387    </para>
4388   </listitem>
4389  </varlistentry>
4390
4391  <varlistentry>
4392   <term>Type:</term>
4393   <!-- Boolean, Parameterized, Multi-value -->
4394   <listitem>
4395    <para>Boolean.</para>
4396   </listitem>
4397  </varlistentry>
4398
4399  <varlistentry>
4400   <term>Parameter:</term>
4401   <listitem>
4402    <para>
4403     N/A
4404    </para>
4405   </listitem>
4406  </varlistentry>
4407
4408  <varlistentry>
4409   <term>Notes:</term>
4410   <listitem>
4411    <para>
4412     This action is only concerned with <emphasis>outgoing</emphasis> HTTP cookies. For
4413     <emphasis>incoming</emphasis> HTTP cookies, use
4414     <literal><link linkend="crunch-incoming-cookies">crunch-incoming-cookies</link></literal>.
4415     Use <emphasis>both</emphasis> to disable HTTP cookies completely.
4416    </para>
4417    <para>
4418     It makes <emphasis>no sense at all</emphasis> to use this action in conjunction
4419     with the <literal><link linkend="session-cookies-only">session-cookies-only</link></literal> action,
4420     since it would prevent the session cookies from being read.
4421    </para>
4422   </listitem>
4423  </varlistentry>
4424
4425  <varlistentry>
4426   <term>Example usage:</term>
4427   <listitem>
4428    <para>
4429     <screen>+crunch-outgoing-cookies</screen>
4430    </para>
4431   </listitem>
4432  </varlistentry>
4433
4434 </variablelist>
4435 </sect3>
4436
4437
4438 <!--   ~~~~~       New section      ~~~~~     -->
4439 <sect3 renderas="sect4" id="deanimate-gifs">
4440 <title>deanimate-gifs</title>
4441
4442 <variablelist>
4443  <varlistentry>
4444   <term>Typical use:</term>
4445   <listitem>
4446    <para>Stop those annoying, distracting animated GIF images.</para>
4447   </listitem>
4448  </varlistentry>
4449
4450  <varlistentry>
4451   <term>Effect:</term>
4452   <listitem>
4453    <para>
4454     De-animate GIF animations, i.e. reduce them to their first or last image.
4455    </para>
4456   </listitem>
4457  </varlistentry>
4458
4459  <varlistentry>
4460   <term>Type:</term>
4461   <!-- boolean, parameterized, Multi-value -->
4462   <listitem>
4463    <para>Parameterized.</para>
4464   </listitem>
4465  </varlistentry>
4466
4467  <varlistentry>
4468   <term>Parameter:</term>
4469   <listitem>
4470    <para>
4471     <quote>last</quote> or <quote>first</quote>
4472    </para>
4473   </listitem>
4474  </varlistentry>
4475
4476  <varlistentry>
4477   <term>Notes:</term>
4478   <listitem>
4479    <para>
4480     This will also shrink the images considerably (in bytes, not pixels!). If
4481     the option <quote>first</quote> is given, the first frame of the animation
4482     is used as the replacement. If <quote>last</quote> is given, the last
4483     frame of the animation is used instead, which probably makes more sense for
4484     most banner animations, but also has the risk of not showing the entire
4485     last frame (if it is only a delta to an earlier frame).
4486    </para>
4487    <para>
4488     You can safely use this action with patterns that will also match non-GIF
4489     objects, because no attempt will be made at anything that doesn't look like
4490     a GIF.
4491    </para>
4492   </listitem>
4493  </varlistentry>
4494
4495  <varlistentry>
4496   <term>Example usage:</term>
4497   <listitem>
4498     <para>
4499       <screen>+deanimate-gifs{last}</screen>
4500     </para>
4501   </listitem>
4502  </varlistentry>
4503 </variablelist>
4504 </sect3>
4505
4506 <!--   ~~~~~       New section      ~~~~~     -->
4507 <sect3 renderas="sect4" id="downgrade-http-version">
4508 <title>downgrade-http-version</title>
4509
4510 <variablelist>
4511  <varlistentry>
4512   <term>Typical use:</term>
4513   <listitem>
4514    <para>Work around (very rare) problems with HTTP/1.1</para>
4515   </listitem>
4516  </varlistentry>
4517
4518  <varlistentry>
4519   <term>Effect:</term>
4520   <listitem>
4521    <para>
4522     Downgrades HTTP/1.1 client requests and server replies to HTTP/1.0.
4523    </para>
4524   </listitem>
4525  </varlistentry>
4526
4527  <varlistentry>
4528   <term>Type:</term>
4529   <!-- boolean, parameterized, Multi-value -->
4530   <listitem>
4531    <para>Boolean.</para>
4532   </listitem>
4533  </varlistentry>
4534
4535  <varlistentry>
4536   <term>Parameter:</term>
4537   <listitem>
4538    <para>
4539     N/A
4540    </para>
4541   </listitem>
4542  </varlistentry>
4543
4544 <varlistentry>
4545   <term>Notes:</term>
4546   <listitem>
4547    <para>
4548     This is a left-over from the time when <application>Privoxy</application>
4549     didn't support important HTTP/1.1 features well. It is left here for the
4550     unlikely case that you experience HTTP/1.1-related problems with some server
4551     out there.
4552    </para>
4553    <para>
4554     Note that enabling this action is only a workaround. It should not
4555     be enabled for sites that work without it. While it shouldn't break
4556     any pages, it has an (usually negative) performance impact.
4557   </para>
4558   <para>
4559     If you come across a site where enabling this action helps, please report it,
4560     so the cause of the problem can be analyzed. If the problem turns out to be
4561     caused by a bug in  <application>Privoxy</application> it should be
4562     fixed so the following release works without the work around.
4563    </para>
4564   </listitem>
4565  </varlistentry>
4566
4567  <varlistentry>
4568   <term>Example usage (section):</term>
4569   <listitem>
4570     <para>
4571      <screen>{+downgrade-http-version}
4572 problem-host.example.com</screen>
4573     </para>
4574   </listitem>
4575  </varlistentry>
4576
4577 </variablelist>
4578 </sect3>
4579
4580 <!--   ~~~~~       New section      ~~~~~     -->
4581 <sect3 renderas="sect4" id="fast-redirects">
4582 <title>fast-redirects</title>
4583
4584 <variablelist>
4585  <varlistentry>
4586   <term>Typical use:</term>
4587   <listitem>
4588    <para>Fool some click-tracking scripts and speed up indirect links.</para>
4589   </listitem>
4590  </varlistentry>
4591
4592  <varlistentry>
4593   <term>Effect:</term>
4594   <listitem>
4595    <para>
4596     Detects redirection URLs and redirects the browser without contacting
4597     the redirection server first.
4598    </para>
4599   </listitem>
4600  </varlistentry>
4601
4602  <varlistentry>
4603   <term>Type:</term>
4604   <!-- boolean, parameterized, Multi-value -->
4605   <listitem>
4606    <para>Parameterized.</para>
4607   </listitem>
4608  </varlistentry>
4609
4610  <varlistentry>
4611   <term>Parameter:</term>
4612   <listitem>
4613    <itemizedlist>
4614     <listitem>
4615      <para>
4616       <quote>simple-check</quote> to just search for the string <quote>http://</quote>
4617       to detect redirection URLs.
4618      </para>
4619     </listitem>
4620     <listitem>
4621      <para>
4622       <quote>check-decoded-url</quote> to decode URLs (if necessary) before searching
4623       for redirection URLs.
4624      </para>
4625     </listitem>
4626    </itemizedlist>
4627   </listitem>
4628  </varlistentry>
4629
4630  <varlistentry>
4631   <term>Notes:</term>
4632   <listitem>
4633    <para>
4634     Many sites, like yahoo.com, don't just link to other sites. Instead, they
4635     will link to some script on their own servers, giving the destination as a
4636     parameter, which will then redirect you to the final target. URLs
4637     resulting from this scheme typically look like:
4638     <quote>http://www.example.org/click-tracker.cgi?target=http%3a//www.example.net/</quote>.
4639   </para>
4640    <para>
4641     Sometimes, there are even multiple consecutive redirects encoded in the
4642     URL. These redirections via scripts make your web browsing more traceable,
4643     since the server from which you follow such a link can see where you go
4644     to. Apart from that, valuable bandwidth and time is wasted, while your
4645     browser asks the server for one redirect after the other. Plus, it feeds
4646     the advertisers.
4647    </para>
4648    <para>
4649     This feature is currently not very smart and is scheduled for improvement.
4650     If it is enabled by default, you will have to create some exceptions to
4651     this action. It can lead to failures in several ways:
4652    </para>
4653    <para>
4654     Not every URLs with other URLs as parameters is evil.
4655     Some sites offer a real service that requires this information to work.
4656     For example a validation service needs to know, which document to validate.
4657     <literal>fast-redirects</literal> assumes that every URL parameter that
4658     looks like another URL is a redirection target, and will always redirect to
4659     the last one. Most of the time the assumption is correct, but if it isn't,
4660     the user gets redirected anyway.
4661    </para>
4662    <para>
4663     Another failure occurs if the URL contains other parameters after the URL parameter.
4664     The URL:
4665     <quote>http://www.example.org/?redirect=http%3a//www.example.net/&amp;foo=bar</quote>.
4666     contains the redirection URL <quote>http://www.example.net/</quote>,
4667     followed by another parameter. <literal>fast-redirects</literal> doesn't know that
4668     and will cause a redirect to <quote>http://www.example.net/&amp;foo=bar</quote>.
4669     Depending on the target server configuration, the parameter will be silently ignored
4670     or lead to a <quote>page not found</quote> error. You can prevent this problem by
4671     first using the <literal><link linkend="redirect">redirect</link></literal> action
4672     to remove the last part of the URL, but it requires a little effort.
4673    </para>
4674    <para>
4675     To detect a redirection URL, <literal>fast-redirects</literal> only
4676     looks for the string <quote>http://</quote>, either in plain text
4677     (invalid but often used) or encoded as <quote>http%3a//</quote>.
4678     Some sites use their own URL encoding scheme, encrypt the address
4679     of the target server or replace it with a database id. In theses cases
4680     <literal>fast-redirects</literal> is fooled and the request reaches the
4681     redirection server where it probably gets logged.
4682    </para>
4683   </listitem>
4684  </varlistentry>
4685
4686  <varlistentry>
4687   <term>Example usage:</term>
4688   <listitem>
4689     <para>
4690      <screen>
4691  { +fast-redirects{simple-check} }
4692    one.example.com
4693
4694  { +fast-redirects{check-decoded-url} }
4695    another.example.com/testing</screen>
4696     </para>
4697   </listitem>
4698  </varlistentry>
4699
4700 </variablelist>
4701 </sect3>
4702
4703
4704 <!--   ~~~~~       New section      ~~~~~     -->
4705 <sect3 renderas="sect4" id="filter">
4706 <title>filter</title>
4707
4708 <variablelist>
4709  <varlistentry>
4710   <term>Typical use:</term>
4711   <listitem>
4712    <para>Get rid of HTML and JavaScript annoyances, banner advertisements (by size),
4713          do fun text replacements, add personalized effects, etc.</para>
4714   </listitem>
4715  </varlistentry>
4716
4717  <varlistentry>
4718   <term>Effect:</term>
4719   <listitem>
4720    <para>
4721     All instances of text-based type, most notably HTML and JavaScript, to which
4722     this action applies, can be filtered on-the-fly through the specified regular
4723     expression based substitutions. (Note: as of version 3.0.3 plain text documents
4724     are exempted from filtering, because web servers often use the
4725    <literal>text/plain</literal> MIME type for all files whose type they don't know.)
4726    </para>
4727   </listitem>
4728  </varlistentry>
4729
4730  <varlistentry>
4731   <term>Type:</term>
4732   <!-- boolean, parameterized, Multi-value -->
4733   <listitem>
4734    <para>Parameterized.</para>
4735   </listitem>
4736  </varlistentry>
4737
4738  <varlistentry>
4739   <term>Parameter:</term>
4740   <listitem>
4741    <para>
4742     The name of a content filter, as defined in the <link linkend="filter-file">filter file</link>.
4743     Filters can be defined in one or more  files as defined by the
4744     <literal><link linkend="filterfile">filterfile</link></literal>
4745     option in the <link linkend="config">config file</link>.
4746     <filename>default.filter</filename> is the collection of filters
4747     supplied by the developers. Locally defined filters should go
4748     in their own file, such as <filename>user.filter</filename>.
4749    </para>
4750    <para>
4751      When used in its negative form,
4752      and without parameters, <emphasis>all</emphasis> filtering is completely disabled.
4753   </para>
4754   </listitem>
4755  </varlistentry>
4756
4757  <varlistentry>
4758   <term>Notes:</term>
4759   <listitem>
4760    <para>
4761     For your convenience, there are a number of pre-defined filters available
4762     in the distribution filter file that you can use. See the examples below for
4763     a list.
4764    </para>
4765    <para>
4766     Filtering requires buffering the page content, which may appear to
4767     slow down page rendering since nothing is displayed until all content has
4768     passed the filters. (The total time until the page is completely rendered
4769     doesn't change much, but it may be perceived as slower since the page is
4770     not incrementally displayed.)
4771     This effect will be more noticeable on slower connections.
4772    </para>
4773    <para>
4774    <quote>Rolling your own</quote>
4775     filters requires a knowledge of
4776      <ulink url="http://en.wikipedia.org/wiki/Regular_expressions"><quote>Regular
4777      Expressions</quote></ulink> and
4778       <ulink url="http://en.wikipedia.org/wiki/Html"><quote>HTML</quote></ulink>.
4779     This is very powerful feature, and potentially very intrusive.
4780     Filters should be used with caution, and where an equivalent
4781     <quote>action</quote> is not available.
4782    </para>
4783    <para>
4784     The amount of data that can be filtered is limited to the
4785     <literal><link linkend="buffer-limit">buffer-limit</link></literal>
4786     option in the main <link linkend="config">config file</link>. The
4787     default is 4096 KB (4 Megs). Once this limit is exceeded, the buffered
4788     data, and all pending data, is passed through unfiltered.
4789    </para>
4790    <para>
4791     Inappropriate MIME types, such as zipped files, are not filtered at all.
4792     (Again, only text-based types except plain text). Encrypted SSL data
4793     (from HTTPS servers) cannot be filtered either, since this would violate
4794     the integrity of the secure transaction. In some situations it might
4795     be necessary to protect certain text, like source code, from filtering
4796     by defining appropriate <literal>-filter</literal> exceptions.
4797    </para>
4798    <para>
4799     Compressed content can't be filtered either, but if &my-app;
4800     is compiled with zlib support and a supported compression algorithm
4801     is used (gzip or deflate), &my-app; can first decompress the content
4802     and then filter it.
4803    </para>
4804    <para>
4805     If you use a &my-app; version without zlib support, but want filtering to work on
4806     as much documents as possible, even those that would normally be sent compressed,
4807     you must use the <literal><link linkend="prevent-compression">prevent-compression</link></literal>
4808     action in conjunction with <literal>filter</literal>.
4809    </para>
4810    <para>
4811     Content filtering can achieve some of the same effects as the
4812     <literal><link linkend="block">block</link></literal>
4813     action, i.e. it can be used to block ads and banners. But the mechanism
4814     works quite differently. One effective use, is to block ad banners
4815     based on their size (see below), since many of these seem to be somewhat
4816     standardized.
4817    </para>
4818    <para>
4819     <link linkend="contact">Feedback</link> with suggestions for new or
4820     improved filters is particularly welcome!
4821    </para>
4822    <para>
4823     The below list has only the names and a one-line description of each
4824     predefined filter. There are <link linkend="predefined-filters">more
4825     verbose explanations</link> of what these filters do in the <link
4826     linkend="filter-file">filter file chapter</link>.
4827    </para>
4828   </listitem>
4829  </varlistentry>
4830
4831  <varlistentry>
4832   <term>Example usage (with filters from the distribution <filename>default.filter</filename> file).
4833   See <link linkend="PREDEFINED-FILTERS">the Predefined Filters section</link> for
4834   more explanation on each:</term>
4835   <listitem>
4836    <para>
4837     <anchor id="filter-js-annoyances">
4838     <screen>+filter{js-annoyances}       # Get rid of particularly annoying JavaScript abuse.</screen>
4839    </para>
4840    <para>
4841     <anchor id="filter-js-events">
4842     <screen>+filter{js-events}           # Kill all JS event bindings and timers (Radically destructive! Only for extra nasty sites).</screen>
4843    </para>
4844    <para>
4845     <anchor id="filter-html-annoyances">
4846     <screen>+filter{html-annoyances}     # Get rid of particularly annoying HTML abuse.</screen>
4847    </para>
4848    <para>
4849     <anchor id="filter-content-cookies">
4850     <screen>+filter{content-cookies}     # Kill cookies that come in the HTML or JS content.</screen>
4851    </para>
4852    <para>
4853     <anchor id="filter-refresh-tags">
4854     <screen>+filter{refresh-tags}        # Kill automatic refresh tags (for dial-on-demand setups).</screen>
4855    </para>
4856    <para>
4857     <anchor id="filter-unsolicited-popups">
4858     <screen>+filter{unsolicited-popups}  # Disable only unsolicited pop-up windows. Useful if your browser lacks this ability.</screen>
4859    </para>
4860    <para>
4861     <anchor id="filter-all-popups">
4862     <screen>+filter{all-popups}          # Kill all popups in JavaScript and HTML. Useful if your browser lacks this ability.</screen>
4863    </para>
4864    <para>
4865     <anchor id="filter-img-reorder">
4866     <screen>+filter{img-reorder}         # Reorder attributes in &lt;img&gt; tags to make the banners-by-* filters more effective.</screen>
4867    </para>
4868    <para>
4869     <anchor id="filter-banners-by-size">
4870     <screen>+filter{banners-by-size}     # Kill banners by size.</screen>
4871    </para>
4872    <para>
4873     <anchor id="filter-banners-by-link">
4874     <screen>+filter{banners-by-link}     # Kill banners by their links to known clicktrackers.</screen>
4875    </para>
4876    <para>
4877     <anchor id="filter-webbugs">
4878     <screen>+filter{webbugs}             # Squish WebBugs (1x1 invisible GIFs used for user tracking).</screen>
4879    </para>
4880    <para>
4881     <anchor id="filter-tiny-textforms">
4882     <screen>+filter{tiny-textforms}      # Extend those tiny textareas up to 40x80 and kill the hard wrap.</screen>
4883    </para>
4884    <para>
4885     <anchor id="filter-jumping-windows">
4886     <screen>+filter{jumping-windows}     # Prevent windows from resizing and moving themselves.</screen>
4887    </para>
4888    <para>
4889     <anchor id="filter-frameset-borders">
4890     <screen>+filter{frameset-borders}    # Give frames a border and make them resizable.</screen>
4891    </para>
4892    <para>
4893     <anchor id="filter-demoronizer">
4894     <screen>+filter{demoronizer}         # Fix MS's non-standard use of standard charsets.</screen>
4895    </para>
4896    <para>
4897     <anchor id="filter-shockwave-flash">
4898     <screen>+filter{shockwave-flash}     # Kill embedded Shockwave Flash objects.</screen>
4899    </para>
4900    <para>
4901     <anchor id="filter-quicktime-kioskmode">
4902     <screen>+filter{quicktime-kioskmode} # Make Quicktime movies saveable.</screen>
4903    </para>
4904    <para>
4905     <anchor id="filter-fun">
4906     <screen>+filter{fun}                 # Text replacements for subversive browsing fun!</screen>
4907    </para>
4908    <para>
4909     <anchor id="filter-crude-parental">
4910     <screen>+filter{crude-parental}      # Crude parental filtering. Note that this filter doesn't work reliably.</screen>
4911    </para>
4912    <para>
4913     <anchor id="filter-ie-exploits">
4914     <screen>+filter{ie-exploits}         # Disable some known Internet Explorer bug exploits.</screen>
4915    </para>
4916    <para>
4917     <anchor id="filter-site-specifics">
4918     <screen>+filter{site-specifics}      # Cure for site-specific problems. Don't apply generally!</screen>
4919    </para>
4920    <para>
4921     <anchor id="filter-no-ping">
4922     <screen>+filter{no-ping}             # Removes non-standard ping attributes in &lt;a&gt; and &lt;area&gt; tags.</screen>
4923    </para>
4924    <para>
4925     <anchor id="filter-google">
4926     <screen>+filter{google}              # CSS-based block for Google text ads. Also removes a width limitation and the toolbar advertisement.</screen>
4927    </para>
4928    <para>
4929     <anchor id="filter-yahoo">
4930     <screen>+filter{yahoo}               # CSS-based block for Yahoo text ads. Also removes a width limitation.</screen>
4931    </para>
4932    <para>
4933     <anchor id="filter-msn">
4934     <screen>+filter{msn}                 # CSS-based block for MSN text ads. Also removes tracking URLs and a width limitation.</screen>
4935    </para>
4936    <para>
4937     <anchor id="filter-blogspot">
4938     <screen>+filter{blogspot}            # Cleans up some Blogspot blogs. Read the fine print before using this.</screen>
4939    </para>
4940   </listitem>
4941  </varlistentry>
4942 </variablelist>
4943 </sect3>
4944
4945
4946 <!--   ~~~~~       New section      ~~~~~     -->
4947 <sect3 renderas="sect4" id="force-text-mode">
4948 <title>force-text-mode</title>
4949 <!--
4950 new action
4951 -->
4952 <variablelist>
4953  <varlistentry>
4954   <term>Typical use:</term>
4955   <listitem>
4956    <para>Force <application>Privoxy</application> to treat a document as if it was in some kind of <emphasis>text</emphasis> format.   </para>
4957   </listitem>
4958  </varlistentry>
4959
4960  <varlistentry>
4961   <term>Effect:</term>
4962   <listitem>
4963    <para>
4964     Declares a document as text, even if the <quote>Content-Type:</quote> isn't detected as such.
4965    </para>
4966   </listitem>
4967  </varlistentry>
4968
4969  <varlistentry>
4970   <term>Type:</term>
4971   <!-- Boolean, Parameterized, Multi-value -->
4972   <listitem>
4973    <para>Boolean.</para>
4974   </listitem>
4975  </varlistentry>
4976
4977  <varlistentry>
4978   <term>Parameter:</term>
4979   <listitem>
4980    <para>
4981     N/A
4982    </para>
4983   </listitem>
4984  </varlistentry>
4985
4986  <varlistentry>
4987   <term>Notes:</term>
4988   <listitem>
4989    <para>
4990     As explained <literal><link linkend="filter">above</link></literal>,
4991     <application>Privoxy</application> tries to only filter files that are
4992     in some kind of text format. The same restrictions apply to
4993     <literal><link linkend="content-type-overwrite">content-type-overwrite</link></literal>.
4994     <literal>force-text-mode</literal> declares a document as text,
4995     without looking at the <quote>Content-Type:</quote> first.
4996    </para>
4997    <warning>
4998     <para>
4999      Think twice before activating this action. Filtering binary data
5000      with regular expressions can cause file damage.
5001     </para>
5002    </warning>
5003   </listitem>
5004  </varlistentry>
5005
5006  <varlistentry>
5007   <term>Example usage:</term>
5008   <listitem>
5009    <para>
5010      <screen>
5011 +force-text-mode
5012      </screen>
5013    </para>
5014   </listitem>
5015  </varlistentry>
5016 </variablelist>
5017 </sect3>
5018
5019
5020 <!--   ~~~~~       New section      ~~~~~     -->
5021 <sect3 renderas="sect4" id="forward-override">
5022 <title>forward-override</title>
5023 <!--
5024 new action
5025 -->
5026 <variablelist>
5027  <varlistentry>
5028   <term>Typical use:</term>
5029   <listitem>
5030    <para>Change the forwarding settings based on User-Agent or request origin</para>
5031   </listitem>
5032  </varlistentry>
5033
5034  <varlistentry>
5035   <term>Effect:</term>
5036   <listitem>
5037    <para>
5038     Overrules the forward directives in the configuration file.
5039    </para>
5040   </listitem>
5041  </varlistentry>
5042
5043  <varlistentry>
5044   <term>Type:</term>
5045   <!-- Boolean, Parameterized, Multi-value -->
5046   <listitem>
5047    <para>Multi-value.</para>
5048   </listitem>
5049  </varlistentry>
5050
5051  <varlistentry>
5052   <term>Parameter:</term>
5053   <listitem>
5054    <itemizedlist>
5055     <listitem>
5056      <para><quote>forward .</quote> to use a direct connection without any additional proxies.</para>
5057     </listitem>
5058     <listitem>
5059      <para>
5060       <quote>forward 127.0.0.1:8123</quote> to use the HTTP proxy listening at 127.0.0.1 port 8123.
5061      </para>
5062     </listitem>
5063     <listitem>
5064      <para>
5065       <quote>forward-socks4a 127.0.0.1:9050 .</quote> to use the socks4a proxy listening at
5066       127.0.0.1 port 9050. Replace <quote>forward-socks4a</quote> with <quote>forward-socks4</quote>
5067       to use a socks4 connection  (with local DNS resolution) instead, use <quote>forward-socks5</quote>
5068       for socks5 connections (with remote DNS resolution).
5069      </para>
5070     </listitem>
5071     <listitem>
5072      <para>
5073       <quote>forward-socks4a 127.0.0.1:9050 proxy.example.org:8000</quote> to use the socks4a proxy
5074       listening at 127.0.0.1 port 9050 to reach the HTTP proxy listening at proxy.example.org port 8000.
5075       Replace <quote>forward-socks4a</quote> with <quote>forward-socks4</quote> to use a socks4 connection
5076       (with local DNS resolution) instead, use <quote>forward-socks5</quote>
5077       for socks5 connections (with remote DNS resolution).
5078      </para>
5079     </listitem>
5080    </itemizedlist>
5081   </listitem>
5082  </varlistentry>
5083
5084  <varlistentry>
5085   <term>Notes:</term>
5086   <listitem>
5087    <para>
5088     This action takes parameters similar to the
5089     <link linkend="forwarding">forward</link> directives in the configuration
5090     file, but without the URL pattern. It can be used as replacement, but normally it's only
5091     used in cases where matching based on the request URL isn't sufficient.
5092    </para>
5093    <warning>
5094     <para>
5095      Please read the description for the <link linkend="forwarding">forward</link> directives before
5096      using this action. Forwarding to the wrong people will reduce your privacy and increase the
5097      chances of man-in-the-middle attacks.
5098     </para>
5099     <para>
5100      If the ports are missing or invalid, default values will be used. This might change
5101      in the future and you shouldn't rely on it. Otherwise incorrect syntax causes Privoxy
5102      to exit.
5103     </para>
5104     <para>
5105      Use the <ulink url="http://config.privoxy.org/show-url-info">show-url-info CGI page</ulink>
5106      to verify that your forward settings do what you thought the do.
5107     </para>
5108    </warning>
5109   </listitem>
5110  </varlistentry>
5111
5112  <varlistentry>
5113   <term>Example usage:</term>
5114   <listitem>
5115    <para>
5116      <screen>
5117 # Always use direct connections for requests previously tagged as
5118 # <quote>User-Agent: fetch libfetch/2.0</quote> and make sure
5119 # resuming downloads continues to work.
5120 # This way you can continue to use Tor for your normal browsing,
5121 # without overloading the Tor network with your FreeBSD ports updates
5122 # or downloads of bigger files like ISOs.
5123 # Note that HTTP headers are easy to fake and therefore their
5124 # values are as (un)trustworthy as your clients and users.
5125 {+forward-override{forward .} \
5126  -hide-if-modified-since      \
5127  -overwrite-last-modified     \
5128 }
5129 TAG:^User-Agent: fetch libfetch/2\.0$
5130      </screen>
5131    </para>
5132   </listitem>
5133  </varlistentry>
5134 </variablelist>
5135 </sect3>
5136
5137
5138 <!--   ~~~~~       New section      ~~~~~     -->
5139 <sect3 renderas="sect4" id="handle-as-empty-document">
5140 <title>handle-as-empty-document</title>
5141 <!--
5142 new action
5143 -->
5144 <variablelist>
5145  <varlistentry>
5146   <term>Typical use:</term>
5147   <listitem>
5148    <para>Mark URLs that should be replaced by empty documents <emphasis>if they get blocked</emphasis></para>
5149   </listitem>
5150  </varlistentry>
5151
5152  <varlistentry>
5153   <term>Effect:</term>
5154   <listitem>
5155    <para>
5156     This action alone doesn't do anything noticeable. It just marks URLs.
5157     If the <literal><link linkend="block">block</link></literal> action <emphasis>also applies</emphasis>,
5158     the presence or absence of this mark decides whether an HTML <quote>BLOCKED</quote>
5159     page, or an empty document will be sent to the client as a substitute for the blocked content.
5160     The <emphasis>empty</emphasis> document isn't literally empty, but actually contains a single space.
5161    </para>
5162   </listitem>
5163  </varlistentry>
5164
5165  <varlistentry>
5166   <term>Type:</term>
5167   <!-- Boolean, Parameterized, Multi-value -->
5168   <listitem>
5169    <para>Boolean.</para>
5170   </listitem>
5171  </varlistentry>
5172
5173  <varlistentry>
5174   <term>Parameter:</term>
5175   <listitem>
5176    <para>
5177     N/A
5178    </para>
5179   </listitem>
5180  </varlistentry>
5181
5182  <varlistentry>
5183   <term>Notes:</term>
5184   <listitem>
5185    <para>
5186     Some browsers complain about syntax errors if JavaScript documents
5187     are blocked with <application>Privoxy's</application>
5188     default HTML page; this option can be used to silence them.
5189     And of course this action can also be used to eliminate the &my-app;
5190     BLOCKED message in frames.
5191    </para>
5192    <para>
5193     The content type for the empty document can be specified with
5194     <literal><link linkend="content-type-overwrite">content-type-overwrite{}</link></literal>,
5195     but usually this isn't necessary.
5196    </para>
5197   </listitem>
5198  </varlistentry>
5199
5200  <varlistentry>
5201   <term>Example usage:</term>
5202   <listitem>
5203    <para>
5204      <screen># Block all documents on example.org that end with ".js",
5205 # but send an empty document instead of the usual HTML message.
5206 {+block{Blocked JavaScript} +handle-as-empty-document}
5207 example.org/.*\.js$
5208      </screen>
5209    </para>
5210   </listitem>
5211  </varlistentry>
5212 </variablelist>
5213 </sect3>
5214
5215
5216 <!--   ~~~~~       New section      ~~~~~     -->
5217 <sect3 renderas="sect4" id="handle-as-image">
5218 <title>handle-as-image</title>
5219
5220 <variablelist>
5221  <varlistentry>
5222   <term>Typical use:</term>
5223   <listitem>
5224    <para>Mark URLs as belonging to images (so they'll be replaced by images <emphasis>if they do get blocked</emphasis>, rather than HTML pages)</para>
5225   </listitem>
5226  </varlistentry>
5227
5228  <varlistentry>
5229   <term>Effect:</term>
5230   <listitem>
5231    <para>
5232     This action alone doesn't do anything noticeable. It just marks URLs as images.
5233     If the <literal><link linkend="block">block</link></literal> action <emphasis>also applies</emphasis>,
5234     the presence or absence of this mark decides whether an HTML <quote>blocked</quote>
5235     page, or a replacement image (as determined by the <literal><link
5236     linkend="set-image-blocker">set-image-blocker</link></literal> action) will be sent to the
5237     client as a substitute for the blocked content.
5238    </para>
5239   </listitem>
5240  </varlistentry>
5241
5242  <varlistentry>
5243   <term>Type:</term>
5244   <!-- Boolean, Parameterized, Multi-value -->
5245   <listitem>
5246    <para>Boolean.</para>
5247   </listitem>
5248  </varlistentry>
5249
5250  <varlistentry>
5251   <term>Parameter:</term>
5252   <listitem>
5253    <para>
5254     N/A
5255    </para>
5256   </listitem>
5257  </varlistentry>
5258
5259  <varlistentry>
5260   <term>Notes:</term>
5261   <listitem>
5262    <para>
5263     The below generic example section is actually part of <filename>default.action</filename>.
5264     It marks all URLs with well-known image file name extensions as images and should
5265     be left intact.
5266    </para>
5267    <para>
5268     Users will probably only want to use the handle-as-image action in conjunction with
5269     <literal><link linkend="block">block</link></literal>, to block sources of banners, whose URLs don't
5270     reflect the file type, like in the second example section.
5271    </para>
5272    <para>
5273     Note that you cannot treat HTML pages as images in most cases. For instance, (in-line) ad
5274     frames require an HTML page to be sent, or they won't display properly.
5275     Forcing <literal>handle-as-image</literal> in this situation will not replace the
5276     ad frame with an image, but lead to error messages.
5277    </para>
5278   </listitem>
5279  </varlistentry>
5280
5281  <varlistentry>
5282   <term>Example usage (sections):</term>
5283   <listitem>
5284    <para>
5285      <screen># Generic image extensions:
5286 #
5287 {+handle-as-image}
5288 /.*\.(gif|jpg|jpeg|png|bmp|ico)$
5289
5290 # These don't look like images, but they're banners and should be
5291 # blocked as images:
5292 #
5293 {+block{Nasty banners.} +handle-as-image}
5294 nasty-banner-server.example.com/junk.cgi\?output=trash
5295 </screen>
5296    </para>
5297   </listitem>
5298  </varlistentry>
5299 </variablelist>
5300 </sect3>
5301
5302
5303 <!--   ~~~~~       New section      ~~~~~     -->
5304 <sect3 renderas="sect4" id="hide-accept-language">
5305 <title>hide-accept-language</title>
5306 <!--
5307 new action
5308 -->
5309 <variablelist>
5310  <varlistentry>
5311   <term>Typical use:</term>
5312   <listitem>
5313    <para>Pretend to use different language settings.</para>
5314   </listitem>
5315  </varlistentry>
5316
5317  <varlistentry>
5318   <term>Effect:</term>
5319   <listitem>
5320    <para>
5321     Deletes or replaces the <quote>Accept-Language:</quote> HTTP header in client requests.
5322    </para>
5323   </listitem>
5324  </varlistentry>
5325
5326  <varlistentry>
5327   <term>Type:</term>
5328   <!-- Boolean, Parameterized, Multi-value -->
5329   <listitem>
5330    <para>Parameterized.</para>
5331   </listitem>
5332  </varlistentry>
5333
5334  <varlistentry>
5335   <term>Parameter:</term>
5336   <listitem>
5337    <para>
5338     Keyword: <quote>block</quote>, or any user defined value.
5339    </para>
5340   </listitem>
5341  </varlistentry>
5342
5343  <varlistentry>
5344   <term>Notes:</term>
5345   <listitem>
5346    <para>
5347     Faking the browser's language settings can be useful to make a
5348     foreign User-Agent set with
5349     <literal><link linkend="hide-user-agent">hide-user-agent</link></literal>
5350     more believable.
5351    </para>
5352    <para>
5353     However some sites with content in different languages check the
5354     <quote>Accept-Language:</quote> to decide which one to take by default.
5355     Sometimes it isn't possible to later switch to another language without
5356     changing the <quote>Accept-Language:</quote> header first.
5357    </para>
5358    <para>
5359     Therefore it's a good idea to either only change the
5360     <quote>Accept-Language:</quote> header to languages you understand,
5361     or to languages that aren't wide spread.
5362    </para>
5363    <para>
5364     Before setting the <quote>Accept-Language:</quote> header
5365     to a rare language, you should consider that it helps to
5366     make your requests unique and thus easier to trace.
5367     If you don't plan to change this header frequently,
5368     you should stick to a common language.
5369    </para>
5370   </listitem>
5371  </varlistentry>
5372
5373  <varlistentry>
5374   <term>Example usage (section):</term>
5375   <listitem>
5376     <para>
5377      <screen># Pretend to use Canadian language settings.
5378 {+hide-accept-language{en-ca} \
5379 +hide-user-agent{Mozilla/5.0 (X11; U; OpenBSD i386; en-CA; rv:1.8.0.4) Gecko/20060628 Firefox/1.5.0.4} \
5380 }
5381 /   </screen>
5382    </para>
5383   </listitem>
5384  </varlistentry>
5385 </variablelist>
5386 </sect3>
5387
5388
5389 <!--   ~~~~~       New section      ~~~~~     -->
5390 <sect3 renderas="sect4" id="hide-content-disposition">
5391 <title>hide-content-disposition</title>
5392 <!--
5393 new action
5394 -->
5395 <variablelist>
5396  <varlistentry>
5397   <term>Typical use:</term>
5398   <listitem>
5399    <para>Prevent download menus for content you prefer to view inside the browser.</para>
5400   </listitem>
5401  </varlistentry>
5402
5403  <varlistentry>
5404   <term>Effect:</term>
5405   <listitem>
5406    <para>
5407     Deletes or replaces the <quote>Content-Disposition:</quote> HTTP header set by some servers.
5408    </para>
5409   </listitem>
5410  </varlistentry>
5411
5412  <varlistentry>
5413   <term>Type:</term>
5414   <!-- Boolean, Parameterized, Multi-value -->
5415   <listitem>
5416    <para>Parameterized.</para>
5417   </listitem>
5418  </varlistentry>
5419
5420  <varlistentry>
5421   <term>Parameter:</term>
5422   <listitem>
5423    <para>
5424     Keyword: <quote>block</quote>, or any user defined value.
5425    </para>
5426   </listitem>
5427  </varlistentry>
5428
5429  <varlistentry>
5430   <term>Notes:</term>
5431   <listitem>
5432    <para>
5433     Some servers set the <quote>Content-Disposition:</quote> HTTP header for
5434     documents they assume you want to save locally before viewing them.
5435     The <quote>Content-Disposition:</quote> header contains the file name
5436     the browser is supposed to use by default.
5437    </para>
5438    <para>
5439     In most browsers that understand this header, it makes it impossible to
5440     <emphasis>just view</emphasis> the document, without downloading it first,
5441     even if it's just a simple text file or an image.
5442    </para>
5443    <para>
5444     Removing the <quote>Content-Disposition:</quote> header helps
5445     to prevent this annoyance, but some browsers additionally check the
5446     <quote>Content-Type:</quote> header, before they decide if they can
5447     display a document without saving it first. In these cases, you have
5448     to change this header as well, before the browser stops displaying
5449     download menus.
5450    </para>
5451    <para>
5452     It is also possible to change the server's file name suggestion
5453     to another one, but in most cases it isn't worth the time to set
5454     it up.
5455    </para>
5456    <para>
5457     This action will probably be removed in the future,
5458     use server-header filters instead.
5459    </para>
5460   </listitem>
5461  </varlistentry>
5462
5463  <varlistentry>
5464   <term>Example usage:</term>
5465   <listitem>
5466     <para>
5467      <screen># Disarm the download link in Sourceforge's patch tracker
5468 { -filter \
5469  +content-type-overwrite{text/plain}\
5470  +hide-content-disposition{block} }
5471  .sourceforge.net/tracker/download\.php</screen>
5472    </para>
5473   </listitem>
5474  </varlistentry>
5475 </variablelist>
5476 </sect3>
5477
5478
5479 <!--   ~~~~~       New section      ~~~~~     -->
5480 <sect3 renderas="sect4" id="hide-if-modified-since">
5481 <title>hide-if-modified-since</title>
5482 <!--
5483 new action
5484 -->
5485 <variablelist>
5486  <varlistentry>
5487   <term>Typical use:</term>
5488   <listitem>
5489    <para>Prevent yet another way to track the user's steps between sessions.</para>
5490   </listitem>
5491  </varlistentry>
5492
5493  <varlistentry>
5494   <term>Effect:</term>
5495   <listitem>
5496    <para>
5497     Deletes the <quote>If-Modified-Since:</quote> HTTP client header or modifies its value.
5498    </para>
5499   </listitem>
5500  </varlistentry>
5501
5502  <varlistentry>
5503   <term>Type:</term>
5504   <!-- Boolean, Parameterized, Multi-value -->
5505   <listitem>
5506    <para>Parameterized.</para>
5507   </listitem>
5508  </varlistentry>
5509
5510  <varlistentry>
5511   <term>Parameter:</term>
5512   <listitem>
5513    <para>
5514     Keyword: <quote>block</quote>, or a user defined value that specifies a range of hours.
5515    </para>
5516   </listitem>
5517  </varlistentry>
5518
5519  <varlistentry>
5520   <term>Notes:</term>
5521   <listitem>
5522    <para>
5523     Removing this header is useful for filter testing, where you want to force a real
5524     reload instead of getting status code <quote>304</quote>, which would cause the
5525     browser to use a cached copy of the page.
5526    </para>
5527    <para>
5528     Instead of removing the header, <literal>hide-if-modified-since</literal> can
5529     also add or subtract a random amount of time to/from the header's value.
5530     You specify a range of minutes where the random factor should be chosen from and
5531     <application>Privoxy</application> does the rest. A negative value means
5532     subtracting, a positive value adding.
5533    </para>
5534    <para>
5535     Randomizing the value of the <quote>If-Modified-Since:</quote> makes
5536     it less likely that the server can use the time as a cookie replacement,
5537     but you will run into caching problems if the random range is too high.
5538    </para>
5539    <para>
5540     It is a good idea to only use a small negative value and let
5541     <literal><link linkend="overwrite-last-modified">overwrite-last-modified</link></literal>
5542     handle the greater changes.
5543    </para>
5544    <para>
5545     It is also recommended to use this action together with
5546     <literal><link linkend="crunch-if-none-match">crunch-if-none-match</link></literal>,
5547     otherwise it's more or less pointless.
5548    </para>
5549   </listitem>
5550  </varlistentry>
5551
5552  <varlistentry>
5553   <term>Example usage (section):</term>
5554   <listitem>
5555     <para>
5556      <screen># Let the browser revalidate but make tracking based on the time less likely.
5557 {+hide-if-modified-since{-60} \
5558  +overwrite-last-modified{randomize} \
5559  +crunch-if-none-match}
5560 /</screen>
5561    </para>
5562   </listitem>
5563  </varlistentry>
5564 </variablelist>
5565 </sect3>
5566
5567
5568 <!--   ~~~~~       New section      ~~~~~     -->
5569 <sect3 renderas="sect4" id="hide-from-header">
5570 <title>hide-from-header</title>
5571
5572 <variablelist>
5573  <varlistentry>
5574   <term>Typical use:</term>
5575   <listitem>
5576    <para>Keep your (old and ill) browser from telling web servers your email address</para>
5577   </listitem>
5578  </varlistentry>
5579
5580  <varlistentry>
5581   <term>Effect:</term>
5582   <listitem>
5583    <para>
5584     Deletes any existing <quote>From:</quote> HTTP header, or replaces it with the
5585     specified string.
5586    </para>
5587   </listitem>
5588  </varlistentry>
5589
5590  <varlistentry>
5591   <term>Type:</term>
5592   <!-- Boolean, Parameterized, Multi-value -->
5593   <listitem>
5594    <para>Parameterized.</para>
5595   </listitem>
5596  </varlistentry>
5597
5598  <varlistentry>
5599   <term>Parameter:</term>
5600   <listitem>
5601    <para>
5602     Keyword: <quote>block</quote>, or any user defined value.
5603    </para>
5604   </listitem>
5605  </varlistentry>
5606
5607  <varlistentry>
5608   <term>Notes:</term>
5609   <listitem>
5610    <para>
5611     The keyword <quote>block</quote> will completely remove the header
5612     (not to be confused with the <literal><link linkend="block">block</link></literal>
5613     action).
5614    </para>
5615    <para>
5616     Alternately, you can specify any value you prefer to be sent to the web
5617     server. If you do, it is a matter of fairness not to use any address that
5618     is actually used by a real person.
5619    </para>
5620    <para>
5621     This action is rarely needed, as modern web browsers don't send
5622     <quote>From:</quote> headers anymore.
5623    </para>
5624   </listitem>
5625  </varlistentry>
5626
5627  <varlistentry>
5628   <term>Example usage:</term>
5629   <listitem>
5630    <para>
5631     <screen>+hide-from-header{block}</screen> or
5632     <screen>+hide-from-header{spam-me-senseless@sittingduck.example.com}</screen>
5633    </para>
5634   </listitem>
5635  </varlistentry>
5636 </variablelist>
5637 </sect3>
5638
5639
5640 <!--   ~~~~~       New section      ~~~~~     -->
5641 <sect3 renderas="sect4" id="hide-referrer">
5642 <title>hide-referrer</title>
5643 <anchor id="hide-referer">
5644 <variablelist>
5645  <varlistentry>
5646   <term>Typical use:</term>
5647   <listitem>
5648    <para>Conceal which link you followed to get to a particular site</para>
5649   </listitem>
5650  </varlistentry>
5651
5652  <varlistentry>
5653   <term>Effect:</term>
5654   <listitem>
5655    <para>
5656     Deletes the <quote>Referer:</quote> (sic) HTTP header from the client request,
5657     or replaces it with a forged one.
5658    </para>
5659   </listitem>
5660  </varlistentry>
5661
5662  <varlistentry>
5663   <term>Type:</term>
5664   <!-- Boolean, Parameterized, Multi-value -->
5665   <listitem>
5666    <para>Parameterized.</para>
5667   </listitem>
5668  </varlistentry>
5669
5670  <varlistentry>
5671   <term>Parameter:</term>
5672   <listitem>
5673    <itemizedlist>
5674     <listitem>
5675      <para><quote>conditional-block</quote> to delete the header completely if the host has changed.</para>
5676     </listitem>
5677     <listitem>
5678      <para><quote>conditional-forge</quote> to forge the header if the host has changed.</para>
5679     </listitem>
5680     <listitem>
5681      <para><quote>block</quote> to delete the header unconditionally.</para>
5682     </listitem>
5683     <listitem>
5684      <para><quote>forge</quote> to pretend to be coming from the homepage of the server we are talking to.</para>
5685     </listitem>
5686     <listitem>
5687      <para>Any other string to set a user defined referrer.</para>
5688     </listitem>
5689    </itemizedlist>
5690   </listitem>
5691  </varlistentry>
5692
5693  <varlistentry>
5694   <term>Notes:</term>
5695   <listitem>
5696    <para>
5697     <literal>conditional-block</literal> is the only parameter,
5698     that isn't easily detected in the server's log file. If it blocks the
5699     referrer, the request will look like the visitor used a bookmark or
5700     typed in the address directly.
5701    </para>
5702    <para>
5703     Leaving the referrer unmodified for requests on the same host
5704     allows the server owner to see the visitor's <quote>click path</quote>,
5705     but in most cases she could also get that information by comparing
5706     other parts of the log file: for example the User-Agent if it isn't
5707     a very common one, or the user's IP address if it doesn't change between
5708     different requests.
5709    </para>
5710    <para>
5711     Always blocking the referrer, or using a custom one, can lead to
5712     failures on servers that check the referrer before they answer any
5713     requests, in an attempt to prevent their content from being
5714     embedded or linked to elsewhere.
5715    </para>
5716    <para>
5717     Both <literal>conditional-block</literal> and <literal>forge</literal>
5718     will work with referrer checks, as long as content and valid referring page
5719     are on the same host. Most of the time that's the case.
5720    </para>
5721    <para>
5722     <literal>hide-referer</literal> is an alternate spelling of
5723     <literal>hide-referrer</literal> and the two can be can be freely
5724     substituted with each other. (<quote>referrer</quote> is the
5725     correct English spelling, however the HTTP specification has a bug - it
5726     requires it to be spelled as <quote>referer</quote>.)
5727    </para>
5728   </listitem>
5729  </varlistentry>
5730
5731  <varlistentry>
5732   <term>Example usage:</term>
5733   <listitem>
5734    <para>
5735      <screen>+hide-referrer{forge}</screen> or
5736      <screen>+hide-referrer{http://www.yahoo.com/}</screen>
5737    </para>
5738   </listitem>
5739  </varlistentry>
5740 </variablelist>
5741 </sect3>
5742
5743
5744 <!--   ~~~~~       New section      ~~~~~     -->
5745 <sect3 renderas="sect4" id="hide-user-agent">
5746 <title>hide-user-agent</title>
5747
5748 <variablelist>
5749  <varlistentry>
5750   <term>Typical use:</term>
5751   <listitem>
5752    <para>Try to conceal your type of browser and client operating system</para>
5753   </listitem>
5754  </varlistentry>
5755
5756  <varlistentry>
5757   <term>Effect:</term>
5758   <listitem>
5759    <para>
5760     Replaces the value of the <quote>User-Agent:</quote> HTTP header
5761     in client requests with the specified value.
5762    </para>
5763   </listitem>
5764  </varlistentry>
5765
5766  <varlistentry>
5767   <term>Type:</term>
5768   <!-- Boolean, Parameterized, Multi-value -->
5769   <listitem>
5770    <para>Parameterized.</para>
5771   </listitem>
5772  </varlistentry>
5773
5774  <varlistentry>
5775   <term>Parameter:</term>
5776   <listitem>
5777    <para>
5778     Any user-defined string.
5779    </para>
5780   </listitem>
5781  </varlistentry>
5782
5783  <varlistentry>
5784   <term>Notes:</term>
5785   <listitem>
5786    <warning>
5787     <para>
5788      This can lead to problems on web sites that depend on looking at this header in
5789      order to customize their content for different browsers (which, by the
5790      way, is <emphasis>NOT</emphasis> the right thing to do: good web sites
5791      work browser-independently).
5792     </para>
5793    </warning>
5794    <para>
5795     Using this action in multi-user setups or wherever different types of
5796     browsers will access the same <application>Privoxy</application> is
5797     <emphasis>not recommended</emphasis>. In single-user, single-browser
5798     setups, you might use it to delete your OS version information from
5799     the headers, because it is an invitation to exploit known bugs for your
5800     OS. It is also occasionally useful to forge this in order to access
5801     sites that won't let you in otherwise (though there may be a good
5802     reason in some cases).
5803    </para>
5804    <para>
5805      More information on known user-agent strings can be found at
5806      <ulink url="http://www.user-agents.org/">http://www.user-agents.org/</ulink>
5807      and
5808      <ulink url="http://en.wikipedia.org/wiki/User_agent">http://en.wikipedia.org/wiki/User_agent</ulink>.
5809    </para>
5810    </listitem>
5811  </varlistentry>
5812
5813  <varlistentry>
5814   <term>Example usage:</term>
5815   <listitem>
5816    <para>
5817      <screen>+hide-user-agent{Netscape 6.1 (X11; I; Linux 2.4.18 i686)}</screen>
5818    </para>
5819   </listitem>
5820  </varlistentry>
5821 </variablelist>
5822 </sect3>
5823
5824
5825 <!--   ~~~~~       New section      ~~~~~     -->
5826 <sect3 renderas="sect4" id="limit-connect">
5827 <title>limit-connect</title>
5828
5829 <variablelist>
5830  <varlistentry>
5831   <term>Typical use:</term>
5832   <listitem>
5833    <para>Prevent abuse of <application>Privoxy</application> as a TCP proxy relay or disable SSL for untrusted sites</para>
5834   </listitem>
5835  </varlistentry>
5836
5837  <varlistentry>
5838   <term>Effect:</term>
5839   <listitem>
5840    <para>
5841     Specifies to which ports HTTP CONNECT requests are allowable.
5842    </para>
5843   </listitem>
5844  </varlistentry>
5845
5846  <varlistentry>
5847   <term>Type:</term>
5848   <!-- Boolean, Parameterized, Multi-value -->
5849   <listitem>
5850    <para>Parameterized.</para>
5851   </listitem>
5852  </varlistentry>
5853
5854  <varlistentry>
5855   <term>Parameter:</term>
5856   <listitem>
5857    <para>
5858     A comma-separated list of ports or port ranges (the latter using dashes, with the minimum
5859     defaulting to 0 and the maximum to 65K).
5860    </para>
5861   </listitem>
5862  </varlistentry>
5863
5864  <varlistentry>
5865   <term>Notes:</term>
5866   <listitem>
5867    <para>
5868     By default, i.e. if no <literal>limit-connect</literal> action applies,
5869     <application>Privoxy</application> allows HTTP CONNECT requests to all
5870     ports. Use <literal>limit-connect</literal> if fine-grained control
5871     is desired for some or all destinations.
5872    </para>
5873    <para>
5874     The CONNECT methods exists in HTTP to allow access to secure websites
5875     (<quote>https://</quote> URLs) through proxies. It works very simply:
5876     the proxy connects to the server on the specified port, and then
5877     short-circuits its connections to the client and to the remote server.
5878     This means CONNECT-enabled proxies can be used as TCP relays very easily.
5879   </para>
5880   <para>
5881    <application>Privoxy</application> relays HTTPS traffic without seeing
5882    the decoded content. Websites can leverage this limitation to circumvent &my-app;'s
5883    filters. By specifying an invalid port range you can disable HTTPS entirely.
5884   </para>
5885   </listitem>
5886  </varlistentry>
5887
5888  <varlistentry>
5889   <term>Example usages:</term>
5890   <listitem>
5891    <!-- I had trouble getting the spacing to look right in my browser -->
5892    <!-- I probably have the wrong font setup, bollocks. -->
5893    <!-- Apparently the emphasis tag uses a proportional font no matter what -->
5894     <para>
5895      <screen>+limit-connect{443}                   # Port 443 is OK.
5896 +limit-connect{80,443}                # Ports 80 and 443 are OK.
5897 +limit-connect{-3, 7, 20-100, 500-}   # Ports less than 3, 7, 20 to 100 and above 500 are OK.
5898 +limit-connect{-}                     # All ports are OK
5899 +limit-connect{,}                     # No HTTPS/SSL traffic is allowed</screen>
5900    </para>
5901   </listitem>
5902  </varlistentry>
5903 </variablelist>
5904 </sect3>
5905
5906
5907 <!--   ~~~~~       New section      ~~~~~     -->
5908 <sect3 renderas="sect4" id="limit-cookie-lifetime">
5909 <title>limit-cookie-lifetime</title>
5910
5911 <variablelist>
5912  <varlistentry>
5913   <term>Typical use:</term>
5914   <listitem>
5915    <para>Limit the lifetime of HTTP cookies to a couple of minutes or hours.</para>
5916   </listitem>
5917  </varlistentry>
5918
5919  <varlistentry>
5920   <term>Effect:</term>
5921   <listitem>
5922    <para>
5923     Overwrites the expires field in Set-Cookie server headers if it's above the specified limit.
5924    </para>
5925   </listitem>
5926  </varlistentry>
5927
5928  <varlistentry>
5929   <term>Type:</term>
5930   <!-- Boolean, Parameterized, Multi-value -->
5931   <listitem>
5932    <para>Parameterized.</para>
5933   </listitem>
5934  </varlistentry>
5935
5936  <varlistentry>
5937   <term>Parameter:</term>
5938   <listitem>
5939    <para>
5940     The lifetime limit in minutes, or 0.
5941    </para>
5942   </listitem>
5943  </varlistentry>
5944
5945  <varlistentry>
5946   <term>Notes:</term>
5947   <listitem>
5948    <para>
5949     This action reduces the lifetime of HTTP cookies coming from the
5950     server to the specified number of minutes, starting from the time
5951     the cookie passes Privoxy.
5952    </para>
5953    <para>
5954     Cookies with a lifetime below the limit are not modified.
5955     The lifetime of session cookies is set to the specified limit.
5956    </para>
5957    <para>
5958     The effect of this action depends on the server.
5959    </para>
5960    <para>
5961     In case of servers which refresh their cookies with each response
5962     (or at least frequently), the lifetime limit set by this action
5963     is updated as well.
5964     Thus, a session associated with the cookie continues to work with
5965     this action enabled, as long as a new request is made before the
5966     last limit set is reached.
5967    </para>
5968    <para>
5969     However, some servers send their cookies once, with a lifetime of several
5970     years (the year 2037 is a popular choice), and do not refresh them
5971     until a certain event in the future, for example the user logging out.
5972     In this case this action may limit the absolute lifetime of the session,
5973     even if requests are made frequently.
5974    </para>
5975    <para>
5976     If the parameter is <quote>0</quote>, this action behaves like
5977     <literal><link linkend="session-cookies-only">session-cookies-only</link></literal>.
5978    </para>
5979   </listitem>
5980  </varlistentry>
5981
5982  <varlistentry>
5983   <term>Example usages:</term>
5984   <listitem>
5985     <para>
5986      <screen>+limit-cookie-lifetime{60}
5987        </screen>
5988    </para>
5989   </listitem>
5990  </varlistentry>
5991 </variablelist>
5992 </sect3>
5993
5994 <!--   ~~~~~       New section      ~~~~~     -->
5995 <sect3 renderas="sect4" id="prevent-compression">
5996 <title>prevent-compression</title>
5997
5998 <variablelist>
5999  <varlistentry>
6000   <term>Typical use:</term>
6001   <listitem>
6002    <para>
6003     Ensure that servers send the content uncompressed, so it can be
6004     passed through <literal><link linkend="filter">filter</link></literal>s.
6005    </para>
6006   </listitem>
6007  </varlistentry>
6008
6009  <varlistentry>
6010   <term>Effect:</term>
6011   <listitem>
6012    <para>
6013     Removes the Accept-Encoding header which can be used to ask for compressed transfer.
6014    </para>
6015   </listitem>
6016  </varlistentry>
6017
6018  <varlistentry>
6019   <term>Type:</term>
6020   <!-- Boolean, Parameterized, Multi-value -->
6021   <listitem>
6022    <para>Boolean.</para>
6023   </listitem>
6024  </varlistentry>
6025
6026  <varlistentry>
6027   <term>Parameter:</term>
6028   <listitem>
6029    <para>
6030     N/A
6031    </para>
6032   </listitem>
6033  </varlistentry>
6034
6035  <varlistentry>
6036   <term>Notes:</term>
6037   <listitem>
6038    <para>
6039     More and more websites send their content compressed by default, which
6040     is generally a good idea and saves bandwidth. But the <literal><link
6041     linkend="filter">filter</link></literal> and
6042     <literal><link linkend="deanimate-gifs">deanimate-gifs</link></literal>
6043     actions need access to the uncompressed data.
6044    </para>
6045    <para>
6046     When compiled with zlib support (available since &my-app; 3.0.7), content that should be
6047     filtered is decompressed on-the-fly and you don't have to worry about this action.
6048     If you are using an older &my-app; version, or one that hasn't been compiled with zlib
6049     support, this action can be used to convince the server to send the content uncompressed.
6050    </para>
6051    <para>
6052     Most text-based instances compress very well, the size is seldom decreased by less than 50%,
6053     for markup-heavy instances like news feeds saving more than 90% of the original size isn't
6054     unusual.
6055    </para>
6056    <para>
6057     Not using compression will therefore slow down the transfer, and you should only
6058     enable this action if you really need it. As of &my-app; 3.0.7 it's disabled in all
6059     predefined action settings.
6060    </para>
6061    <para>
6062     Note that some (rare) ill-configured sites don't handle requests for uncompressed
6063     documents correctly. Broken PHP applications tend to send an empty document body,
6064     some IIS versions only send the beginning of the content. If you enable
6065     <literal>prevent-compression</literal> per default, you might want to add
6066     exceptions for those sites. See the example for how to do that.
6067    </para>
6068   </listitem>
6069  </varlistentry>
6070
6071  <varlistentry>
6072   <term>Example usage (sections):</term>
6073   <listitem>
6074    <para>
6075     <screen>
6076 # Selectively turn off compression, and enable a filter
6077 #
6078 { +filter{tiny-textforms} +prevent-compression }
6079 # Match only these sites
6080  .google.
6081  sourceforge.net
6082  sf.net
6083
6084 # Or instead, we could set a universal default:
6085 #
6086 { +prevent-compression }
6087  / # Match all sites
6088
6089 # Then maybe make exceptions for broken sites:
6090 #
6091 { -prevent-compression }
6092 .compusa.com/</screen>
6093    </para>
6094   </listitem>
6095  </varlistentry>
6096
6097 </variablelist>
6098 </sect3>
6099
6100
6101 <!--   ~~~~~       New section      ~~~~~     -->
6102 <sect3 renderas="sect4" id="overwrite-last-modified">
6103 <title>overwrite-last-modified</title>
6104 <!--
6105 new action
6106 -->
6107 <variablelist>
6108  <varlistentry>
6109   <term>Typical use:</term>
6110   <listitem>
6111    <para>Prevent yet another way to track the user's steps between sessions.</para>
6112   </listitem>
6113  </varlistentry>
6114
6115  <varlistentry>
6116   <term>Effect:</term>
6117   <listitem>
6118    <para>
6119     Deletes the <quote>Last-Modified:</quote> HTTP server header or modifies its value.
6120    </para>
6121   </listitem>
6122  </varlistentry>
6123
6124  <varlistentry>
6125   <term>Type:</term>
6126   <!-- Boolean, Parameterized, Multi-value -->
6127   <listitem>
6128    <para>Parameterized.</para>
6129   </listitem>
6130  </varlistentry>
6131
6132  <varlistentry>
6133   <term>Parameter:</term>
6134   <listitem>
6135    <para>
6136     One of the keywords: <quote>block</quote>, <quote>reset-to-request-time</quote>
6137     and <quote>randomize</quote>
6138    </para>
6139   </listitem>
6140  </varlistentry>
6141
6142  <varlistentry>
6143   <term>Notes:</term>
6144   <listitem>
6145    <para>
6146     Removing the <quote>Last-Modified:</quote> header is useful for filter
6147     testing, where you want to force a real reload instead of getting status
6148     code <quote>304</quote>, which would cause the browser to reuse the old
6149     version of the page.
6150    </para>
6151    <para>
6152     The <quote>randomize</quote> option overwrites the value of the
6153     <quote>Last-Modified:</quote> header with a randomly chosen time
6154     between the original value and the current time. In theory the server
6155     could send each document with a different <quote>Last-Modified:</quote>
6156     header to track visits without using cookies. <quote>Randomize</quote>
6157     makes it impossible and the browser can still revalidate cached documents.
6158    </para>
6159    <para>
6160     <quote>reset-to-request-time</quote> overwrites the value of the
6161     <quote>Last-Modified:</quote> header with the current time. You could use
6162     this option together with
6163     <literal><link linkend="hide-if-modified-since">hide-if-modified-since</link></literal>
6164     to further customize your random range.
6165    </para>
6166    <para>
6167     The preferred parameter here is <quote>randomize</quote>. It is safe
6168     to use, as long as the time settings are more or less correct.
6169     If the server sets the <quote>Last-Modified:</quote> header to the time
6170     of the request, the random range becomes zero and the value stays the same.
6171     Therefore you should later randomize it a second time with
6172     <literal><link linkend="hide-if-modified-since">hided-if-modified-since</link></literal>,
6173     just to be sure.
6174    </para>
6175    <para>
6176     It is also recommended to use this action together with
6177     <literal><link linkend="crunch-if-none-match">crunch-if-none-match</link></literal>.
6178    </para>
6179   </listitem>
6180  </varlistentry>
6181
6182  <varlistentry>
6183   <term>Example usage:</term>
6184   <listitem>
6185     <para>
6186      <screen># Let the browser revalidate without being tracked across sessions
6187 { +hide-if-modified-since{-60} \
6188  +overwrite-last-modified{randomize} \
6189  +crunch-if-none-match}
6190 /</screen>
6191    </para>
6192   </listitem>
6193  </varlistentry>
6194 </variablelist>
6195 </sect3>
6196
6197
6198 <!--   ~~~~~       New section      ~~~~~     -->
6199 <sect3 renderas="sect4" id="redirect">
6200 <title>redirect</title>
6201 <!--
6202 new action
6203 -->
6204 <variablelist>
6205  <varlistentry>
6206   <term>Typical use:</term>
6207   <listitem>
6208    <para>
6209     Redirect requests to other sites.
6210    </para>
6211   </listitem>
6212  </varlistentry>
6213
6214  <varlistentry>
6215   <term>Effect:</term>
6216   <listitem>
6217    <para>
6218     Convinces the browser that the requested document has been moved
6219     to another location and the browser should get it from there.
6220    </para>
6221   </listitem>
6222  </varlistentry>
6223
6224  <varlistentry>
6225   <term>Type:</term>
6226   <!-- Boolean, Parameterized, Multi-value -->
6227   <listitem>
6228    <para>Parameterized</para>
6229   </listitem>
6230  </varlistentry>
6231
6232  <varlistentry>
6233   <term>Parameter:</term>
6234   <listitem>
6235    <para>
6236     An absolute URL or a single pcrs command.
6237    </para>
6238   </listitem>
6239  </varlistentry>
6240
6241  <varlistentry>
6242   <term>Notes:</term>
6243   <listitem>
6244    <para>
6245     Requests to which this action applies are answered with a
6246     HTTP redirect to URLs of your choosing. The new URL is
6247     either provided as parameter, or derived by applying a
6248     single pcrs command to the original URL.
6249    </para>
6250    <para>
6251     The syntax for pcrs commands is documented in the
6252     <link linkend="filter-file">filter file</link> section.
6253    </para>
6254    <para>
6255     This action will be ignored if you use it together with
6256     <literal><link linkend="block">block</link></literal>.
6257     It can be combined with
6258     <literal><link linkend="fast-redirects">fast-redirects{check-decoded-url}</link></literal>
6259     to redirect to a decoded version of a rewritten URL.
6260    </para>
6261    <para>
6262     Use this action carefully, make sure not to create redirection loops
6263     and be aware that using your own redirects might make it
6264     possible to fingerprint your requests.
6265    </para>
6266    <para>
6267     In case of problems with your redirects, or simply to watch
6268     them working, enable <link linkend="DEBUG">debug 128</link>.
6269    </para>
6270   </listitem>
6271  </varlistentry>
6272
6273  <varlistentry>
6274   <term>Example usages:</term>
6275   <listitem>
6276    <para>
6277     <screen># Replace example.com's style sheet with another one
6278 { +redirect{http://localhost/css-replacements/example.com.css} }
6279  example.com/stylesheet\.css
6280
6281 # Create a short, easy to remember nickname for a favorite site
6282 # (relies on the browser accept and forward invalid URLs to &my-app;)
6283 { +redirect{http://www.privoxy.org/user-manual/actions-file.html} }
6284  a
6285
6286 # Always use the expanded view for Undeadly.org articles
6287 # (Note the $ at the end of the URL pattern to make sure
6288 # the request for the rewritten URL isn't redirected as well)
6289 {+redirect{s@$@&amp;mode=expanded@}}
6290 undeadly.org/cgi\?action=article&amp;sid=\d*$
6291
6292 # Redirect Google search requests to MSN
6293 {+redirect{s@^http://[^/]*/search\?q=([^&amp;]*).*@http://search.msn.com/results.aspx?q=$1@}}
6294 .google.com/search
6295
6296 # Redirect MSN search requests to Yahoo
6297 {+redirect{s@^http://[^/]*/results\.aspx\?q=([^&amp;]*).*@http://search.yahoo.com/search?p=$1@}}
6298 search.msn.com//results\.aspx\?q=
6299
6300 # Redirect remote requests for this manual
6301 # to the local version delivered by Privoxy
6302 {+redirect{s@^http://www@http://config@}}
6303 www.privoxy.org/user-manual/</screen>
6304    </para>
6305   </listitem>
6306  </varlistentry>
6307
6308 </variablelist>
6309 </sect3>
6310
6311
6312 <!--   ~~~~~       New section      ~~~~~     -->
6313 <sect3 renderas="sect4" id="server-header-filter">
6314 <title>server-header-filter</title>
6315
6316 <variablelist>
6317  <varlistentry>
6318   <term>Typical use:</term>
6319   <listitem>
6320    <para>
6321    Rewrite or remove single server headers.
6322    </para>
6323   </listitem>
6324  </varlistentry>
6325
6326  <varlistentry>
6327   <term>Effect:</term>
6328   <listitem>
6329    <para>
6330     All server headers to which this action applies are filtered on-the-fly
6331     through the specified regular expression based substitutions.
6332    </para>
6333   </listitem>
6334  </varlistentry>
6335
6336  <varlistentry>
6337   <term>Type:</term>
6338   <!-- boolean, parameterized, Multi-value -->
6339   <listitem>
6340    <para>Parameterized.</para>
6341   </listitem>
6342  </varlistentry>
6343
6344  <varlistentry>
6345   <term>Parameter:</term>
6346   <listitem>
6347    <para>
6348     The name of a server-header filter, as defined in one of the
6349     <link linkend="filter-file">filter files</link>.
6350    </para>
6351   </listitem>
6352  </varlistentry>
6353
6354  <varlistentry>
6355   <term>Notes:</term>
6356   <listitem>
6357    <para>
6358     Server-header filters are applied to each header on its own, not to
6359     all at once. This makes it easier to diagnose problems, but on the downside
6360     you can't write filters that only change header x if header y's value is z.
6361     You can do that by using tags though.
6362    </para>
6363    <para>
6364     Server-header filters are executed after the other header actions have finished
6365     and use their output as input.
6366    </para>
6367    <para>
6368     Please refer to the <link linkend="filter-file">filter file chapter</link>
6369     to learn which server-header filters are available by default, and how to
6370     create your own.
6371    </para>
6372  </listitem>
6373  </varlistentry>
6374
6375  <varlistentry>
6376   <term>Example usage (section):</term>
6377   <listitem>
6378     <para>
6379      <screen>
6380 {+server-header-filter{html-to-xml}}
6381 example.org/xml-instance-that-is-delivered-as-html
6382
6383 {+server-header-filter{xml-to-html}}
6384 example.org/instance-that-is-delivered-as-xml-but-is-not
6385     </screen>
6386     </para>
6387   </listitem>
6388  </varlistentry>
6389
6390 </variablelist>
6391 </sect3>
6392
6393
6394 <!--   ~~~~~       New section      ~~~~~     -->
6395 <sect3 renderas="sect4" id="server-header-tagger">
6396 <title>server-header-tagger</title>
6397
6398 <variablelist>
6399  <varlistentry>
6400   <term>Typical use:</term>
6401   <listitem>
6402    <para>
6403    Enable or disable filters based on the Content-Type header.
6404    </para>
6405   </listitem>
6406  </varlistentry>
6407
6408  <varlistentry>
6409   <term>Effect:</term>
6410   <listitem>
6411    <para>
6412     Server headers to which this action applies are filtered on-the-fly through
6413     the specified regular expression based substitutions, the result is used as
6414     tag.
6415    </para>
6416   </listitem>
6417  </varlistentry>
6418
6419  <varlistentry>
6420   <term>Type:</term>
6421   <!-- boolean, parameterized, Multi-value -->
6422   <listitem>
6423    <para>Parameterized.</para>
6424   </listitem>
6425  </varlistentry>
6426
6427  <varlistentry>
6428   <term>Parameter:</term>
6429   <listitem>
6430    <para>
6431     The name of a server-header tagger, as defined in one of the
6432     <link linkend="filter-file">filter files</link>.
6433    </para>
6434   </listitem>
6435  </varlistentry>
6436
6437  <varlistentry>
6438   <term>Notes:</term>
6439   <listitem>
6440    <para>
6441     Server-header taggers are applied to each header on its own,
6442     and as the header isn't modified, each tagger <quote>sees</quote>
6443     the original.
6444    </para>
6445    <para>
6446     Server-header taggers are executed before all other header actions
6447     that modify server headers. Their tags can be used to control
6448     all of the other server-header actions, the content filters
6449     and the crunch actions (<link linkend="redirect">redirect</link>
6450     and <link linkend="block">block</link>).
6451    </para>
6452    <para>
6453     Obviously crunching based on tags created by server-header taggers
6454     doesn't prevent the request from showing up in the server's log file.
6455    </para>
6456
6457  </listitem>
6458  </varlistentry>
6459
6460  <varlistentry>
6461   <term>Example usage (section):</term>
6462   <listitem>
6463     <para>
6464      <screen>
6465 # Tag every request with the content type declared by the server
6466 {+server-header-tagger{content-type}}
6467 /
6468     </screen>
6469     </para>
6470   </listitem>
6471  </varlistentry>
6472
6473 </variablelist>
6474 </sect3>
6475
6476
6477 <!--   ~~~~~       New section      ~~~~~     -->
6478 <sect3 renderas="sect4" id="session-cookies-only">
6479 <title>session-cookies-only</title>
6480
6481 <variablelist>
6482  <varlistentry>
6483   <term>Typical use:</term>
6484   <listitem>
6485    <para>
6486     Allow only temporary <quote>session</quote> cookies (for the current
6487     browser session <emphasis>only</emphasis>).
6488    </para>
6489   </listitem>
6490  </varlistentry>
6491
6492  <varlistentry>
6493   <term>Effect:</term>
6494   <listitem>
6495    <para>
6496     Deletes the <quote>expires</quote> field from <quote>Set-Cookie:</quote>
6497     server headers. Most browsers will not store such cookies permanently and
6498     forget them in between sessions.
6499    </para>
6500   </listitem>
6501  </varlistentry>
6502
6503 <varlistentry>
6504   <term>Type:</term>
6505   <!-- Boolean, Parameterized, Multi-value -->
6506   <listitem>
6507    <para>Boolean.</para>
6508   </listitem>
6509  </varlistentry>
6510
6511  <varlistentry>
6512   <term>Parameter:</term>
6513   <listitem>
6514    <para>
6515     N/A
6516    </para>
6517   </listitem>
6518  </varlistentry>
6519
6520  <varlistentry>
6521   <term>Notes:</term>
6522   <listitem>
6523    <para>
6524     This is less strict than <literal><link linkend="crunch-incoming-cookies">crunch-incoming-cookies</link></literal> /
6525     <literal><link linkend="crunch-outgoing-cookies">crunch-outgoing-cookies</link></literal> and allows you to browse
6526     websites that insist or rely on setting cookies, without compromising your privacy too badly.
6527    </para>
6528    <para>
6529     Most browsers will not permanently store cookies that have been processed by
6530     <literal>session-cookies-only</literal> and will forget about them between sessions.
6531     This makes profiling cookies useless, but won't break sites which require cookies so
6532     that you can log in for transactions. This is generally turned on for all
6533     sites, and is the recommended setting.
6534    </para>
6535    <para>
6536     It makes <emphasis>no sense at all</emphasis> to use <literal>session-cookies-only</literal>
6537     together with <literal><link linkend="crunch-incoming-cookies">crunch-incoming-cookies</link></literal> or
6538     <literal><link linkend="crunch-outgoing-cookies">crunch-outgoing-cookies</link></literal>. If you do, cookies
6539     will be plainly killed.
6540    </para>
6541    <para>
6542     Note that it is up to the browser how it handles such cookies without an <quote>expires</quote>
6543     field. If you use an exotic browser, you might want to try it out to be sure.
6544    </para>
6545    <para>
6546     This setting also has no effect on cookies that may have been stored
6547     previously by the browser before starting <application>Privoxy</application>.
6548     These would have to be removed manually.
6549    </para>
6550    <para>
6551      <application>Privoxy</application> also uses
6552      the <link linkend="filter-content-cookies">content-cookies filter</link>
6553      to block some types of cookies. Content cookies are not effected by
6554      <literal>session-cookies-only</literal>.
6555    </para>
6556   </listitem>
6557  </varlistentry>
6558
6559  <varlistentry>
6560   <term>Example usage:</term>
6561   <listitem>
6562    <para>
6563      <screen>+session-cookies-only</screen>
6564    </para>
6565   </listitem>
6566  </varlistentry>
6567 </variablelist>
6568 </sect3>
6569
6570
6571 <!--   ~~~~~       New section      ~~~~~     -->
6572 <sect3 renderas="sect4" id="set-image-blocker">
6573 <title>set-image-blocker</title>
6574
6575 <variablelist>
6576  <varlistentry>
6577   <term>Typical use:</term>
6578   <listitem>
6579    <para>Choose the replacement for blocked images</para>
6580   </listitem>
6581  </varlistentry>
6582
6583  <varlistentry>
6584   <term>Effect:</term>
6585   <listitem>
6586    <para>
6587      This action alone doesn't do anything noticeable. If <emphasis>both</emphasis>
6588      <literal><link linkend="block">block</link></literal> <emphasis>and</emphasis> <literal><link
6589      linkend="handle-as-image">handle-as-image</link></literal> <emphasis>also</emphasis>
6590      apply, i.e. if the request is to be blocked as an image,
6591      <emphasis>then</emphasis> the parameter of this action decides what will be
6592      sent as a replacement.
6593    </para>
6594   </listitem>
6595  </varlistentry>
6596
6597  <varlistentry>
6598   <term>Type:</term>
6599   <!-- Boolean, Parameterized, Multi-value -->
6600   <listitem>
6601    <para>Parameterized.</para>
6602   </listitem>
6603  </varlistentry>
6604
6605  <varlistentry>
6606   <term>Parameter:</term>
6607   <listitem>
6608    <itemizedlist>
6609     <listitem>
6610      <para>
6611       <quote>pattern</quote> to send a built-in checkerboard pattern image. The image is visually
6612       decent, scales very well, and makes it obvious where banners were busted.
6613      </para>
6614     </listitem>
6615     <listitem>
6616      <para>
6617       <quote>blank</quote> to send a built-in transparent image. This makes banners disappear
6618       completely, but makes it hard to detect where <application>Privoxy</application> has blocked
6619       images on a given page and complicates troubleshooting if <application>Privoxy</application>
6620       has blocked innocent images, like navigation icons.
6621      </para>
6622     </listitem>
6623     <listitem>
6624      <para>
6625       <quote><replaceable class="parameter">target-url</replaceable></quote> to
6626       send a redirect to <replaceable class="parameter">target-url</replaceable>. You can redirect
6627       to any image anywhere, even in your local filesystem via <quote>file:///</quote> URL.
6628       (But note that not all browsers support redirecting to a local file system).
6629      </para>
6630      <para>
6631       A good application of redirects is to use special <application>Privoxy</application>-built-in
6632       URLs, which send the built-in images, as <replaceable class="parameter">target-url</replaceable>.
6633       This has the same visual effect as specifying <quote>blank</quote> or <quote>pattern</quote> in
6634       the first place, but enables your browser to cache the replacement image, instead of requesting
6635       it over and over again.
6636      </para>
6637     </listitem>
6638    </itemizedlist>
6639   </listitem>
6640  </varlistentry>
6641
6642  <varlistentry>
6643   <term>Notes:</term>
6644   <listitem>
6645    <para>
6646     The URLs for the built-in images are <quote>http://config.privoxy.org/send-banner?type=<replaceable
6647     class="parameter">type</replaceable></quote>, where <replaceable class="parameter">type</replaceable> is
6648     either <quote>blank</quote> or <quote>pattern</quote>.
6649    </para>
6650    <para>
6651     There is a third (advanced) type, called <quote>auto</quote>. It is <emphasis>NOT</emphasis> to be
6652     used in <literal>set-image-blocker</literal>, but meant for use from <link linkend="filter-file">filters</link>.
6653     Auto will select the type of image that would have applied to the referring page, had it been an image.
6654    </para>
6655   </listitem>
6656  </varlistentry>
6657
6658  <varlistentry>
6659   <term>Example usage:</term>
6660   <listitem>
6661    <para>
6662     Built-in pattern:
6663    </para>
6664    <para>
6665     <screen>+set-image-blocker{pattern}</screen>
6666    </para>
6667    <para>
6668     Redirect to the BSD daemon:
6669    </para>
6670    <para>
6671     <screen>+set-image-blocker{http://www.freebsd.org/gifs/dae_up3.gif}</screen>
6672    </para>
6673    <para>
6674     Redirect to the built-in pattern for better caching:
6675    </para>
6676    <para>
6677     <screen>+set-image-blocker{http://config.privoxy.org/send-banner?type=pattern}</screen>
6678    </para>
6679   </listitem>
6680  </varlistentry>
6681 </variablelist>
6682 </sect3>
6683
6684
6685 <!--   ~~~~~       New section      ~~~~~     -->
6686 <sect3>
6687 <title>Summary</title>
6688 <para>
6689  Note that many of these actions have the potential to cause a page to
6690  misbehave, possibly even not to display at all. There are many ways
6691  a site designer may choose to design his site, and what HTTP header
6692  content, and other criteria, he may depend on. There is no way to have hard
6693  and fast rules for all sites. See the <link
6694  linkend="ACTIONSANAT">Appendix</link> for a brief example on troubleshooting
6695  actions.
6696 </para>
6697 </sect3>
6698 </sect2>
6699
6700 <!--   ~~~~~       New section      ~~~~~     -->
6701 <sect2 id="aliases">
6702 <title>Aliases</title>
6703 <para>
6704  Custom <quote>actions</quote>, known to <application>Privoxy</application>
6705  as <quote>aliases</quote>, can be defined by combining other actions.
6706  These can in turn be invoked just like the built-in actions.
6707  Currently, an alias name can contain any character except space, tab,
6708  <quote>=</quote>,
6709  <quote>{</quote> and <quote>}</quote>, but we <emphasis>strongly
6710  recommend</emphasis> that you only use <quote>a</quote> to <quote>z</quote>,
6711  <quote>0</quote> to <quote>9</quote>, <quote>+</quote>, and <quote>-</quote>.
6712  Alias names are not case sensitive, and are not required to start with a
6713  <quote>+</quote> or <quote>-</quote> sign, since they are merely textually
6714  expanded.
6715 </para>
6716 <para>
6717  Aliases can be used throughout the actions file, but they <emphasis>must be
6718  defined in a special section at the top of the file!</emphasis>
6719  And there can only be one such section per actions file. Each actions file may
6720  have its own alias section, and the aliases defined in it are only visible
6721  within that file.
6722 </para>
6723 <para>
6724  There are two main reasons to use aliases: One is to save typing for frequently
6725  used combinations of actions, the other one is a gain in flexibility: If you
6726  decide once how you want to handle shops by defining an alias called
6727  <quote>shop</quote>, you can later change your policy on shops in
6728  <emphasis>one</emphasis> place, and your changes will take effect everywhere
6729  in the actions file where the <quote>shop</quote> alias is used. Calling aliases
6730  by their purpose also makes your actions files more readable.
6731 </para>
6732 <para>
6733  Currently, there is one big drawback to using aliases, though:
6734  <application>Privoxy</application>'s built-in web-based action file
6735  editor honors aliases when reading the actions files, but it expands
6736  them before writing. So the effects of your aliases are of course preserved,
6737  but the aliases themselves are lost when you edit sections that use aliases
6738  with it.
6739 </para>
6740
6741 <para>
6742  Now let's define some aliases...
6743 </para>
6744
6745 <para>
6746  <screen>
6747  # Useful custom aliases we can use later.
6748  #
6749  # Note the (required!) section header line and that this section
6750  # must be at the top of the actions file!
6751  #
6752  {{alias}}
6753
6754  # These aliases just save typing later:
6755  # (Note that some already use other aliases!)
6756  #
6757  +crunch-all-cookies = +<link linkend="CRUNCH-INCOMING-COOKIES">crunch-incoming-cookies</link> +<link linkend="CRUNCH-OUTGOING-COOKIES">crunch-outgoing-cookies</link>
6758  -crunch-all-cookies = -<link linkend="CRUNCH-INCOMING-COOKIES">crunch-incoming-cookies</link> -<link linkend="CRUNCH-OUTGOING-COOKIES">crunch-outgoing-cookies</link>
6759  +block-as-image      = +block{Blocked image.} +handle-as-image
6760  allow-all-cookies   = -crunch-all-cookies -<link linkend="SESSION-COOKIES-ONLY">session-cookies-only</link> -<link linkend="FILTER-CONTENT-COOKIES">filter{content-cookies}</link>
6761
6762  # These aliases define combinations of actions
6763  # that are useful for certain types of sites:
6764  #
6765  fragile     = -<link linkend="BLOCK">block</link> -<link linkend="FILTER">filter</link> -crunch-all-cookies -<link linkend="FAST-REDIRECTS">fast-redirects</link> -<link linkend="HIDE-REFERER">hide-referrer</link> -<link linkend="PREVENT-COMPRESSION">prevent-compression</link>
6766
6767  shop        = -crunch-all-cookies -<link linkend="FILTER-ALL-POPUPS">filter{all-popups}</link>
6768
6769  # Short names for other aliases, for really lazy people ;-)
6770  #
6771  c0 = +crunch-all-cookies
6772  c1 = -crunch-all-cookies</screen>
6773 </para>
6774
6775 <para>
6776  ...and put them to use. These sections would appear in the lower part of an
6777  actions file and define exceptions to the default actions (as specified further
6778  up for the <quote>/</quote> pattern):
6779 </para>
6780
6781 <para>
6782  <screen>
6783  # These sites are either very complex or very keen on
6784  # user data and require minimal interference to work:
6785  #
6786  {fragile}
6787  .office.microsoft.com
6788  .windowsupdate.microsoft.com
6789  # Gmail is really mail.google.com, not gmail.com
6790  mail.google.com
6791
6792  # Shopping sites:
6793  # Allow cookies (for setting and retrieving your customer data)
6794  #
6795  {shop}
6796  .quietpc.com
6797  .worldpay.com   # for quietpc.com
6798  mybank.example.com
6799
6800  # These shops require pop-ups:
6801  #
6802  {-filter{all-popups} -filter{unsolicited-popups}}
6803   .dabs.com
6804   .overclockers.co.uk</screen>
6805 </para>
6806
6807 <para>
6808  Aliases like <quote>shop</quote> and <quote>fragile</quote> are typically used for
6809  <quote>problem</quote> sites that require more than one action to be disabled
6810  in order to function properly.
6811 </para>
6812 </sect2>
6813 <!--
6814 hal stop here
6815 -->
6816 <!--   ~~~~~       New section      ~~~~~     -->
6817 <sect2 id="act-examples">
6818 <title>Actions Files Tutorial</title>
6819 <para>
6820  The above chapters have shown <link linkend="actions-file">which actions files
6821  there are and how they are organized</link>, how actions are <link
6822  linkend="actions">specified</link> and <link linkend="actions-apply">applied
6823  to URLs</link>, how <link linkend="af-patterns">patterns</link> work, and how to
6824  define and use <link linkend="aliases">aliases</link>. Now, let's look at an
6825  example <filename>match-all.action</filename>, <filename>default.action</filename>
6826  and <filename>user.action</filename> file and see how all these pieces come together:
6827 </para>
6828
6829 <sect3>
6830 <title>match-all.action</title>
6831 <para>
6832  Remember <emphasis>all actions are disabled when matching starts</emphasis>,
6833  so we have to explicitly enable the ones we want.
6834 </para>
6835
6836 <para>
6837  While the <filename>match-all.action</filename> file only contains a
6838  single section, it is probably the most important one. It has only one
6839  pattern, <quote><literal>/</literal></quote>, but this pattern
6840  <link linkend="af-patterns">matches all URLs</link>. Therefore, the set of
6841  actions used in this <quote>default</quote> section <emphasis>will
6842  be applied to all requests as a start</emphasis>. It can  be partly or
6843  wholly overridden by other actions files like <filename>default.action</filename>
6844  and <filename>user.action</filename>, but it will still be largely responsible
6845  for your overall browsing experience.
6846 </para>
6847
6848 <para>
6849  Again, at the start of matching, all actions are disabled, so there is
6850  no need to disable any actions here. (Remember: a <quote>+</quote>
6851  preceding the action name enables the action, a <quote>-</quote> disables!).
6852  Also note how this long line has been made more readable by splitting it into
6853  multiple lines with line continuation.
6854 </para>
6855
6856 <para>
6857  <screen>
6858 { \
6859  +<link linkend="CHANGE-X-FORWARDED-FOR">change-x-forwarded-for{block}</link> \
6860  +<link linkend="HIDE-FROM-HEADER">hide-from-header{block}</link> \
6861  +<link linkend="SET-IMAGE-BLOCKER">set-image-blocker{pattern}</link> \
6862 }
6863 / # Match all URLs
6864  </screen>
6865 </para>
6866
6867 <para>
6868  The default behavior is now set.
6869 </para>
6870 </sect3>
6871
6872 <sect3>
6873 <title>default.action</title>
6874
6875 <para>
6876  If you aren't a developer, there's no need for you to edit the
6877  <filename>default.action</filename> file. It is maintained by
6878  the &my-app; developers and if you disagree with some of the
6879  sections, you should overrule them in your <filename>user.action</filename>.
6880 </para>
6881
6882 <para>
6883  Understanding the <filename>default.action</filename> file can
6884  help you with your <filename>user.action</filename>, though.
6885 </para>
6886
6887 <para>
6888  The first section in this file is a special section for internal use
6889  that prevents older &my-app; versions from reading the file:
6890 </para>
6891
6892 <para>
6893  <screen>
6894 ##########################################################################
6895 # Settings -- Don't change! For internal Privoxy use ONLY.
6896 ##########################################################################
6897 {{settings}}
6898 for-privoxy-version=3.0.11</screen>
6899 </para>
6900
6901 <para>
6902  After that comes the (optional) alias section. We'll use the example
6903  section from the above <link linkend="aliases">chapter on aliases</link>,
6904  that also explains why and how aliases are used:
6905 </para>
6906
6907 <para>
6908  <screen>
6909 ##########################################################################
6910 # Aliases
6911 ##########################################################################
6912 {{alias}}
6913
6914  # These aliases just save typing later:
6915  # (Note that some already use other aliases!)
6916  #
6917  +crunch-all-cookies = +<link linkend="CRUNCH-INCOMING-COOKIES">crunch-incoming-cookies</link> +<link linkend="CRUNCH-OUTGOING-COOKIES">crunch-outgoing-cookies</link>
6918  -crunch-all-cookies = -<link linkend="CRUNCH-INCOMING-COOKIES">crunch-incoming-cookies</link> -<link linkend="CRUNCH-OUTGOING-COOKIES">crunch-outgoing-cookies</link>
6919  +block-as-image      = +block{Blocked image.} +handle-as-image
6920  mercy-for-cookies   = -crunch-all-cookies -<link linkend="SESSION-COOKIES-ONLY">session-cookies-only</link> -<link linkend="FILTER-CONTENT-COOKIES">filter{content-cookies}</link>
6921
6922  # These aliases define combinations of actions
6923  # that are useful for certain types of sites:
6924  #
6925  fragile     = -<link linkend="BLOCK">block</link> -<link linkend="FILTER">filter</link> -crunch-all-cookies -<link linkend="FAST-REDIRECTS">fast-redirects</link> -<link linkend="HIDE-REFERER">hide-referrer</link>
6926  shop        = -crunch-all-cookies -<link linkend="FILTER-ALL-POPUPS">filter{all-popups}</link></screen>
6927 </para>
6928
6929 <para>
6930  The first of our specialized sections is concerned with <quote>fragile</quote>
6931  sites, i.e. sites that require minimum interference, because they are either
6932  very complex or very keen on tracking you (and have mechanisms in place that
6933  make them unusable for people who avoid being tracked). We will simply use
6934  our pre-defined <literal>fragile</literal> alias instead of stating the list
6935  of actions explicitly:
6936 </para>
6937
6938 <para>
6939  <screen>
6940 ##########################################################################
6941 # Exceptions for sites that'll break under the default action set:
6942 ##########################################################################
6943
6944 # "Fragile" Use a minimum set of actions for these sites (see alias above):
6945 #
6946 { fragile }
6947 .office.microsoft.com           # surprise, surprise!
6948 .windowsupdate.microsoft.com
6949 mail.google.com</screen>
6950 </para>
6951
6952 <para>
6953  Shopping sites are not as fragile, but they typically
6954  require cookies to log in, and pop-up windows for shopping
6955  carts or item details. Again, we'll use a pre-defined alias:
6956 </para>
6957
6958 <para>
6959  <screen>
6960 # Shopping sites:
6961 #
6962 { shop }
6963 .quietpc.com
6964 .worldpay.com   # for quietpc.com
6965 .jungle.com
6966 .scan.co.uk</screen>
6967 </para>
6968
6969 <para>
6970  The <literal><link linkend="FAST-REDIRECTS">fast-redirects</link></literal>
6971  action, which may have been enabled in <filename>match-all.action</filename>,
6972  breaks some sites. So disable it for popular sites where we know it misbehaves:
6973 </para>
6974
6975 <para>
6976  <screen>
6977 { -<link linkend="FAST-REDIRECTS">fast-redirects</link> }
6978 login.yahoo.com
6979 edit.*.yahoo.com
6980 .google.com
6981 .altavista.com/.*(like|url|link):http
6982 .altavista.com/trans.*urltext=http
6983 .nytimes.com</screen>
6984 </para>
6985
6986 <para>
6987  It is important that <application>Privoxy</application> knows which
6988  URLs belong to images, so that <emphasis>if</emphasis> they are to
6989  be blocked, a substitute image can be sent, rather than an HTML page.
6990  Contacting the remote site to find out is not an option, since it
6991  would destroy the loading time advantage of banner blocking, and it
6992  would feed the advertisers information about you. We can mark any
6993  URL as an image with the <literal><link
6994  linkend="handle-as-image">handle-as-image</link></literal> action,
6995  and marking all URLs that end in a known image file extension is a
6996  good start:
6997 </para>
6998
6999 <para>
7000  <screen>
7001 ##########################################################################
7002 # Images:
7003 ##########################################################################
7004
7005 # Define which file types will be treated as images, in case they get
7006 # blocked further down this file:
7007 #
7008 { +<link linkend="HANDLE-AS-IMAGE">handle-as-image</link> }
7009 /.*\.(gif|jpe?g|png|bmp|ico)$</screen>
7010 </para>
7011
7012 <para>
7013  And then there are known banner sources. They often use scripts to
7014  generate the banners, so it won't be visible from the URL that the
7015  request is for an image. Hence we block them <emphasis>and</emphasis>
7016  mark them as images in one go, with the help of our
7017  <literal>+block-as-image</literal> alias defined above. (We could of
7018  course just as well use <literal>+<link linkend="block">block</link>
7019  +<link linkend="handle-as-image">handle-as-image</link></literal> here.)
7020  Remember that the type of the replacement image is chosen by the
7021  <literal><link linkend="set-image-blocker">set-image-blocker</link></literal>
7022  action. Since all URLs have matched the default section with its
7023  <literal>+<link linkend="set-image-blocker">set-image-blocker</link>{pattern}</literal>
7024  action before, it still applies and needn't be repeated:
7025 </para>
7026
7027 <para>
7028  <screen>
7029 # Known ad generators:
7030 #
7031 { +block-as-image }
7032 ar.atwola.com
7033 .ad.doubleclick.net
7034 .ad.*.doubleclick.net
7035 .a.yimg.com/(?:(?!/i/).)*$
7036 .a[0-9].yimg.com/(?:(?!/i/).)*$
7037 bs*.gsanet.com
7038 .qkimg.net</screen>
7039 </para>
7040
7041 <para>
7042  One of the most important jobs of <application>Privoxy</application>
7043  is to block banners. Many of these can be <quote>blocked</quote>
7044  by the <literal><link linkend="filter">filter</link>{banners-by-size}</literal>
7045  action, which we enabled above, and which deletes the references to banner
7046  images from the pages while they are loaded, so the browser doesn't request
7047  them anymore, and hence they don't need to be blocked here. But this naturally
7048  doesn't catch all banners, and some people choose not to use filters, so we
7049  need a comprehensive list of patterns for banner URLs here, and apply the
7050  <literal><link linkend="block">block</link></literal> action to them.
7051 </para>
7052 <para>
7053  First comes many generic patterns, which do most of the work, by
7054  matching typical domain and path name components of banners. Then comes
7055  a list of individual patterns for specific sites, which is omitted here
7056  to keep the example short:
7057 </para>
7058
7059 <para>
7060  <screen>
7061 ##########################################################################
7062 # Block these fine banners:
7063 ##########################################################################
7064 { <link linkend="BLOCK">+block{Banner ads.}</link> }
7065
7066 # Generic patterns:
7067 #
7068 ad*.
7069 .*ads.
7070 banner?.
7071 count*.
7072 /.*count(er)?\.(pl|cgi|exe|dll|asp|php[34]?)
7073 /(?:.*/)?(publicite|werbung|rekla(ma|me|am)|annonse|maino(kset|nta|s)?)/
7074
7075 # Site-specific patterns (abbreviated):
7076 #
7077 .hitbox.com</screen>
7078 </para>
7079
7080 <para>
7081  It's quite remarkable how many advertisers actually call their banner
7082  servers ads.<replaceable>company</replaceable>.com, or call the directory
7083  in which the banners are stored simply <quote>banners</quote>. So the above
7084  generic patterns are surprisingly effective.
7085 </para>
7086 <para>
7087  But being very generic, they necessarily also catch URLs that we don't want
7088  to block. The pattern <literal>.*ads.</literal> e.g. catches
7089  <quote>nasty-<emphasis>ads</emphasis>.nasty-corp.com</quote> as intended,
7090  but also <quote>downlo<emphasis>ads</emphasis>.sourcefroge.net</quote> or
7091  <quote><emphasis>ads</emphasis>l.some-provider.net.</quote> So here come some
7092  well-known exceptions to the <literal>+<link linkend="BLOCK">block</link></literal>
7093  section above.
7094 </para>
7095 <para>
7096  Note that these are exceptions to exceptions from the default! Consider the URL
7097  <quote>downloads.sourcefroge.net</quote>: Initially, all actions are deactivated,
7098  so it wouldn't get blocked. Then comes the defaults section, which matches the
7099  URL, but just deactivates the <literal><link linkend="BLOCK">block</link></literal>
7100  action once again. Then it matches <literal>.*ads.</literal>, an exception to the
7101  general non-blocking policy, and suddenly
7102  <literal><link linkend="BLOCK">+block</link></literal> applies. And now, it'll match
7103  <literal>.*loads.</literal>, where <literal><link linkend="BLOCK">-block</link></literal>
7104  applies, so (unless it matches <emphasis>again</emphasis> further down) it ends up
7105  with no <literal><link linkend="BLOCK">block</link></literal> action applying.
7106 </para>
7107
7108 <para>
7109  <screen>
7110 ##########################################################################
7111 # Save some innocent victims of the above generic block patterns:
7112 ##########################################################################
7113
7114 # By domain:
7115 #
7116 { -<link linkend="BLOCK">block</link> }
7117 adv[io]*.  # (for advogato.org and advice.*)
7118 adsl.      # (has nothing to do with ads)
7119 adobe.     # (has nothing to do with ads either)
7120 ad[ud]*.   # (adult.* and add.*)
7121 .edu       # (universities don't host banners (yet!))
7122 .*loads.   # (downloads, uploads etc)
7123
7124 # By path:
7125 #
7126 /.*loads/
7127
7128 # Site-specific:
7129 #
7130 www.globalintersec.com/adv # (adv = advanced)
7131 www.ugu.com/sui/ugu/adv</screen>
7132 </para>
7133
7134 <para>
7135  Filtering source code can have nasty side effects,
7136  so make an exception for our friends at sourceforge.net,
7137  and all paths with <quote>cvs</quote> in them. Note that
7138  <literal>-<link linkend="FILTER">filter</link></literal>
7139  disables <emphasis>all</emphasis> filters in one fell swoop!
7140 </para>
7141
7142 <para>
7143  <screen>
7144 # Don't filter code!
7145 #
7146 { -<link linkend="FILTER">filter</link> }
7147 /(.*/)?cvs
7148 bugzilla.
7149 developer.
7150 wiki.
7151 .sourceforge.net</screen>
7152 </para>
7153
7154 <para>
7155  The actual <filename>default.action</filename> is of course much more
7156  comprehensive, but we hope this example made clear how it works.
7157 </para>
7158
7159 </sect3>
7160
7161 <sect3><title>user.action</title>
7162
7163 <para>
7164  So far we are painting with a broad brush by setting general policies,
7165  which would be a reasonable starting point for many people. Now,
7166  you might want to be more specific and have customized rules that
7167  are more suitable to your personal habits and preferences. These would
7168  be for narrowly defined situations like your ISP or your bank, and should
7169  be placed in <filename>user.action</filename>, which is parsed after all other
7170  actions files and hence has the last word, over-riding any previously
7171  defined actions. <filename>user.action</filename> is also a
7172  <emphasis>safe</emphasis> place for your personal settings, since
7173  <filename>default.action</filename> is actively maintained by the
7174  <application>Privoxy</application> developers and you'll probably want
7175  to install updated versions from time to time.
7176 </para>
7177
7178 <para>
7179  So let's look at a few examples of things that one might typically do in
7180  <filename>user.action</filename>:
7181 </para>
7182
7183
7184 <!-- brief sample user.action here -->
7185
7186 <para>
7187  <screen>
7188 # My user.action file. &lt;fred@example.com&gt;</screen>
7189 </para>
7190
7191 <para>
7192  As <link linkend="aliases">aliases</link> are local to the actions
7193  file that they are defined in, you can't use the ones from
7194  <filename>default.action</filename>, unless you repeat them here:
7195 </para>
7196
7197 <para>
7198  <screen>
7199 # Aliases are local to the file they are defined in.
7200 # (Re-)define aliases for this file:
7201 #
7202 {{alias}}
7203 #
7204 # These aliases just save typing later, and the alias names should
7205 # be self explanatory.
7206 #
7207 +crunch-all-cookies = +crunch-incoming-cookies +crunch-outgoing-cookies
7208 -crunch-all-cookies = -crunch-incoming-cookies -crunch-outgoing-cookies
7209  allow-all-cookies  = -crunch-all-cookies -session-cookies-only
7210  allow-popups       = -filter{all-popups}
7211 +block-as-image     = +block{Blocked as image.} +handle-as-image
7212 -block-as-image     = -block
7213
7214 # These aliases define combinations of actions that are useful for
7215 # certain types of sites:
7216 #
7217 fragile     = -block -crunch-all-cookies -filter -fast-redirects -hide-referrer
7218 shop        = -crunch-all-cookies allow-popups
7219
7220 # Allow ads for selected useful free sites:
7221 #
7222 allow-ads   = -block -filter{banners-by-size} -filter{banners-by-link}
7223
7224 # Alias for specific file types that are text, but might have conflicting
7225 # MIME types. We want the browser to force these to be text documents.
7226 handle-as-text = -<link linkend="FILTER">filter</link> +-<link linkend="content-type-overwrite">content-type-overwrite{text/plain}</link> +-<link linkend="FORCE-TEXT-MODE">force-text-mode</link> -<link linkend="HIDE-CONTENT-DISPOSITION">hide-content-disposition</link></screen>
7227
7228 </para>
7229
7230 <para>
7231  Say you have accounts on some sites that you visit regularly, and
7232  you don't want to have to log in manually each time. So you'd like
7233  to allow persistent cookies for these sites. The
7234  <literal>allow-all-cookies</literal> alias defined above does exactly
7235  that, i.e. it disables crunching of cookies in any direction, and the
7236  processing of cookies to make them only temporary.
7237 </para>
7238
7239 <para>
7240  <screen>
7241 { allow-all-cookies }
7242  sourceforge.net
7243  .yahoo.com
7244  .msdn.microsoft.com
7245  .redhat.com</screen>
7246 </para>
7247
7248 <para>
7249  Your bank is allergic to some filter, but you don't know which, so you disable them all:
7250 </para>
7251
7252 <para>
7253  <screen>
7254 { -<link linkend="FILTER">filter</link> }
7255  .your-home-banking-site.com</screen>
7256 </para>
7257
7258 <para>
7259  Some file types you may not want to filter for various reasons:
7260 </para>
7261
7262 <para>
7263  <screen>
7264 # Technical documentation is likely to contain strings that might
7265 # erroneously get altered by the JavaScript-oriented filters:
7266 #
7267 .tldp.org
7268 /(.*/)?selfhtml/
7269
7270 # And this stupid host sends streaming video with a wrong MIME type,
7271 # so that Privoxy thinks it is getting HTML and starts filtering:
7272 #
7273 stupid-server.example.com/</screen>
7274 </para>
7275
7276 <para>
7277  Example of a simple <link linkend="BLOCK">block</link> action. Say you've
7278  seen an ad on your favourite page on example.com that you want to get rid of.
7279  You have right-clicked the image, selected <quote>copy image location</quote>
7280  and pasted the URL below while removing the leading http://, into a
7281  <literal>{ +block{} }</literal> section. Note that <literal>{ +handle-as-image
7282  }</literal> need not be specified, since all URLs ending in
7283  <literal>.gif</literal> will be tagged as images by the general rules as set
7284  in default.action anyway:
7285 </para>
7286
7287 <para>
7288  <screen>
7289 { +<link linkend="BLOCK">block</link>{Nasty ads.} }
7290  www.example.com/nasty-ads/sponsor\.gif
7291  another.example.net/more/junk/here/</screen>
7292 </para>
7293
7294 <para>
7295  The URLs of dynamically generated banners, especially from large banner
7296  farms, often don't use the well-known image file name extensions, which
7297  makes it impossible for <application>Privoxy</application> to guess
7298  the file type just by looking at the URL.
7299  You can use the <literal>+block-as-image</literal> alias defined above for
7300  these cases.
7301  Note that objects which match this rule but then turn out NOT to be an
7302  image are typically rendered as a <quote>broken image</quote> icon by the
7303  browser. Use cautiously.
7304 </para>
7305
7306 <para>
7307  <screen>
7308 { +block-as-image }
7309  .doubleclick.net
7310  .fastclick.net
7311  /Realmedia/ads/
7312  ar.atwola.com/</screen>
7313 </para>
7314
7315 <para>
7316  Now you noticed that the default configuration breaks Forbes Magazine,
7317  but you were too lazy to find out which action is the culprit, and you
7318  were again too lazy to give <link linkend="contact">feedback</link>, so
7319  you just used the <literal>fragile</literal> alias on the site, and
7320  -- <emphasis>whoa!</emphasis> -- it worked. The <literal>fragile</literal>
7321  aliases disables those actions that are most likely to break a site. Also,
7322  good for testing purposes to see if it is <application>Privoxy</application>
7323  that is causing the problem or not. We later find other regular sites
7324  that misbehave, and add those to our personalized list of troublemakers:
7325 </para>
7326
7327 <para>
7328 <screen>
7329 { fragile }
7330  .forbes.com
7331  webmail.example.com
7332  .mybank.com</screen>
7333 </para>
7334
7335 <para>
7336  You like the <quote>fun</quote> text replacements in <filename>default.filter</filename>,
7337  but it is disabled in the distributed actions file.
7338  So you'd like to turn it on in your private,
7339  update-safe config, once and for all:
7340 </para>
7341
7342 <para>
7343 <screen>
7344 { +<link linkend="filter-fun">filter{fun}</link> }
7345  / # For ALL sites!</screen>
7346 </para>
7347
7348 <para>
7349  Note that the above is not really a good idea: There are exceptions
7350  to the filters in <filename>default.action</filename> for things that
7351  really shouldn't be filtered, like code on CVS->Web interfaces. Since
7352  <filename>user.action</filename> has the last word, these exceptions
7353  won't be valid for the <quote>fun</quote> filtering specified here.
7354 </para>
7355
7356 <para>
7357  You might also worry about how your favourite free websites are
7358  funded, and find that they rely on displaying banner advertisements
7359  to survive. So you might want to specifically allow banners for those
7360  sites that you feel provide value to you:
7361 </para>
7362
7363 <para>
7364 <screen>
7365 { allow-ads }
7366  .sourceforge.net
7367  .slashdot.org
7368  .osdn.net</screen>
7369 </para>
7370
7371 <para>
7372  Note that <literal>allow-ads</literal> has been aliased to
7373  <literal>-<link linkend="block">block</link></literal>,
7374  <literal>-<link linkend="filter-banners-by-size">filter{banners-by-size}</link></literal>, and
7375  <literal>-<link linkend="filter-banners-by-link">filter{banners-by-link}</link></literal> above.
7376 </para>
7377
7378 <para>
7379  Invoke another alias here to force an over-ride of the MIME type <literal>
7380  application/x-sh</literal> which typically would open a download type
7381  dialog. In my case, I want to look at the shell script, and then I can save
7382  it should I choose to.
7383 </para>
7384
7385 <para>
7386 <screen>
7387 { handle-as-text }
7388  /.*\.sh$</screen>
7389 </para>
7390
7391 <para>
7392  <filename>user.action</filename> is generally the best place to define
7393  exceptions and additions to the default policies of
7394  <filename>default.action</filename>. Some actions are safe to have their
7395  default policies set here though. So let's set a default policy to have a
7396  <quote>blank</quote> image as opposed to the checkerboard pattern for
7397  <emphasis>ALL</emphasis> sites. <quote>/</quote> of course matches all URL
7398  paths and patterns:
7399 </para>
7400
7401 <para>
7402 <screen>
7403 { +<link linkend="set-image-blocker">set-image-blocker{blank}</link> }
7404 / # ALL sites</screen>
7405 </para>
7406
7407 </sect3>
7408 </sect2>
7409
7410 <!--  ~  End section  ~  -->
7411
7412 </sect1>
7413
7414 <!--  ~  End section  ~  -->
7415
7416 <!--   ~~~~~~~~       New section Header    ~~~~~~~~~     -->
7417
7418 <sect1 id="filter-file">
7419 <title>Filter Files</title>
7420
7421 <para>
7422  On-the-fly text substitutions need
7423  to be defined in a <quote>filter file</quote>. Once defined, they
7424  can then be invoked as an <quote>action</quote>.
7425 </para>
7426
7427 <para>
7428  &my-app; supports three different filter actions:
7429  <literal><link linkend="filter">filter</link></literal> to
7430  rewrite the content that is send to the client,
7431  <literal><link linkend="client-header-filter">client-header-filter</link></literal>
7432  to rewrite headers that are send by the client, and
7433  <literal><link linkend="server-header-filter">server-header-filter</link></literal>
7434  to rewrite headers that are send by the server.
7435 </para>
7436
7437 <para>
7438  &my-app; also supports two tagger actions:
7439  <literal><link linkend="client-header-tagger">client-header-tagger</link></literal>
7440  and
7441  <literal><link linkend="server-header-tagger">server-header-tagger</link></literal>.
7442  Taggers and filters use the same syntax in the filter files, the difference
7443  is that taggers don't modify the text they are filtering, but use a rewritten
7444  version of the filtered text as tag. The tags can then be used to change the
7445  applying actions through sections with <link linkend="tag-pattern">tag-patterns</link>.
7446 </para>
7447
7448
7449 <para>
7450  Multiple filter files can be defined through the <literal> <link
7451  linkend="filterfile">filterfile</link></literal> config directive. The filters
7452  as supplied by the developers are located in
7453  <filename>default.filter</filename>. It is recommended that any locally
7454  defined or modified filters go in a separately defined file such as
7455  <filename>user.filter</filename>.
7456  </para>
7457
7458 <para>
7459  Common tasks for content filters are to eliminate common annoyances in
7460  HTML and JavaScript, such as pop-up windows,
7461  exit consoles, crippled windows without navigation tools, the
7462  infamous &lt;BLINK&gt; tag etc, to suppress images with certain
7463  width and height attributes (standard banner sizes or web-bugs),
7464  or just to have fun.
7465 </para>
7466
7467 <para>
7468  Enabled content filters are applied to any content whose
7469  <quote>Content Type</quote> header is recognised as a sign
7470  of text-based content, with the exception of <literal>text/plain</literal>.
7471  Use the <link linkend="FORCE-TEXT-MODE">force-text-mode</link> action
7472  to also filter other content.
7473 </para>
7474
7475 <para>
7476  Substitutions are made at the source level, so if you want to <quote>roll
7477  your own</quote> filters, you should first be familiar with HTML syntax,
7478  and, of course, regular expressions.
7479 </para>
7480
7481 <para>
7482  Just like the <link linkend="actions-file">actions files</link>, the
7483  filter file is organized in sections, which are called <emphasis>filters</emphasis>
7484  here. Each filter consists of a heading line, that starts with one of the
7485  <emphasis>keywords</emphasis> <literal>FILTER:</literal>,
7486  <literal>CLIENT-HEADER-FILTER:</literal> or <literal>SERVER-HEADER-FILTER:</literal>
7487  followed by the filter's <emphasis>name</emphasis>, and a short (one line)
7488  <emphasis>description</emphasis> of what it does. Below that line
7489  come the <emphasis>jobs</emphasis>, i.e. lines that define the actual
7490  text substitutions. By convention, the name of a filter
7491  should describe what the filter <emphasis>eliminates</emphasis>. The
7492  comment is used in the <ulink url="http://config.privoxy.org/">web-based
7493  user interface</ulink>.
7494 </para>
7495
7496 <para>
7497  Once a filter called <replaceable>name</replaceable> has been defined
7498  in the filter file, it can be invoked by using an action of the form
7499  +<literal><link linkend="filter">filter</link>{<replaceable>name</replaceable>}</literal>
7500  in any <link linkend="actions-file">actions file</link>.
7501 </para>
7502
7503 <para>
7504  Filter definitions start with a header line that contains the filter
7505  type, the filter name and the filter description.
7506  A content filter header line for a filter called <quote>foo</quote> could look
7507  like this:
7508 </para>
7509
7510 <para>
7511  <screen>FILTER: foo Replace all "foo" with "bar"</screen>
7512 </para>
7513
7514 <para>
7515  Below that line, and up to the next header line, come the jobs that
7516  define what text replacements the filter executes. They are specified
7517  in a syntax that imitates <ulink url="http://www.perl.org/">Perl</ulink>'s
7518  <literal>s///</literal> operator. If you are familiar with Perl, you
7519  will find this to be quite intuitive, and may want to look at the
7520  PCRS documentation for the subtle differences to Perl behaviour. Most
7521  notably, the non-standard option letter <literal>U</literal> is supported,
7522  which turns the default to ungreedy matching.
7523 </para>
7524
7525 <para>
7526  If you are new to
7527   <ulink url="http://en.wikipedia.org/wiki/Regular_expressions"><quote>Regular
7528   Expressions</quote></ulink>, you might want to take a look at
7529  the <link linkend="regex">Appendix on regular expressions</link>, and
7530  see the <ulink url="http://perldoc.perl.org/perlre.html">Perl
7531  manual</ulink> for
7532  <ulink url="http://perldoc.perl.org/perlop.html">the
7533  <literal>s///</literal> operator's syntax</ulink> and <ulink
7534  url="http://perldoc.perl.org/perlre.html">Perl-style regular
7535  expressions</ulink> in general.
7536  The below examples might also help to get you started.
7537 </para>
7538
7539
7540 <!--   ~~~~~~~~       New section Header    ~~~~~~~~~     -->
7541
7542 <sect2><title>Filter File Tutorial</title>
7543 <para>
7544  Now, let's complete our <quote>foo</quote> content filter. We have already defined
7545  the heading, but the jobs are still missing. Since all it does is to replace
7546  <quote>foo</quote> with <quote>bar</quote>, there is only one (trivial) job
7547  needed:
7548 </para>
7549
7550 <para>
7551  <screen>s/foo/bar/</screen>
7552 </para>
7553
7554 <para>
7555  But wait! Didn't the comment say that <emphasis>all</emphasis> occurrences
7556  of <quote>foo</quote> should be replaced? Our current job will only take
7557  care of the first <quote>foo</quote> on each page. For global substitution,
7558  we'll need to add the <literal>g</literal> option:
7559 </para>
7560
7561 <para>
7562  <screen>s/foo/bar/g</screen>
7563 </para>
7564
7565 <para>
7566  Our complete filter now looks like this:
7567 </para>
7568 <para>
7569  <screen>FILTER: foo Replace all "foo" with "bar"
7570 s/foo/bar/g</screen>
7571 </para>
7572
7573 <para>
7574  Let's look at some real filters for more interesting examples. Here you see
7575  a filter that protects against some common annoyances that arise from JavaScript
7576  abuse. Let's look at its jobs one after the other:
7577 </para>
7578
7579
7580 <para>
7581  <screen>
7582 FILTER: js-annoyances Get rid of particularly annoying JavaScript abuse
7583
7584 # Get rid of JavaScript referrer tracking. Test page: http://www.randomoddness.com/untitled.htm
7585 #
7586 s|(&lt;script.*)document\.referrer(.*&lt;/script&gt;)|$1"Not Your Business!"$2|Usg</screen>
7587 </para>
7588
7589 <para>
7590  Following the header line and a comment, you see the job. Note that it uses
7591  <literal>|</literal> as the delimiter instead of <literal>/</literal>, because
7592  the pattern contains a forward slash, which would otherwise have to be escaped
7593  by a backslash (<literal>\</literal>).
7594 </para>
7595
7596 <para>
7597  Now, let's examine the pattern: it starts with the text <literal>&lt;script.*</literal>
7598  enclosed in parentheses. Since the dot matches any character, and <literal>*</literal>
7599  means: <quote>Match an arbitrary number of the element left of myself</quote>, this
7600  matches <quote>&lt;script</quote>, followed by <emphasis>any</emphasis> text, i.e.
7601  it matches the whole page, from the start of the first &lt;script&gt; tag.
7602 </para>
7603
7604 <para>
7605  That's more than we want, but the pattern continues: <literal>document\.referrer</literal>
7606  matches only the exact string <quote>document.referrer</quote>. The dot needed to
7607  be <emphasis>escaped</emphasis>, i.e. preceded by a backslash, to take away its
7608  special meaning as a joker, and make it just a regular dot. So far, the meaning is:
7609  Match from the start of the first &lt;script&gt; tag in a the page, up to, and including,
7610  the text <quote>document.referrer</quote>, if <emphasis>both</emphasis> are present
7611  in the page (and appear in that order).
7612 </para>
7613
7614 <para>
7615  But there's still more pattern to go. The next element, again enclosed in parentheses,
7616  is <literal>.*&lt;/script&gt;</literal>. You already know what <literal>.*</literal>
7617  means, so the whole pattern translates to: Match from the start of the first  &lt;script&gt;
7618  tag in a page to the end of the last &lt;script&gt; tag, provided that the text
7619  <quote>document.referrer</quote> appears somewhere in between.
7620 </para>
7621
7622 <para>
7623  This is still not the whole story, since we have ignored the options and the parentheses:
7624  The portions of the page matched by sub-patterns that are enclosed in parentheses, will be
7625  remembered and be available through the variables <literal>$1, $2, ...</literal> in
7626  the substitute. The <literal>U</literal> option switches to ungreedy matching, which means
7627  that the first <literal>.*</literal> in the pattern will only <quote>eat up</quote> all
7628  text in between <quote>&lt;script</quote> and the <emphasis>first</emphasis> occurrence
7629  of <quote>document.referrer</quote>, and that the second <literal>.*</literal> will
7630  only span the text up to the <emphasis>first</emphasis> <quote>&lt;/script&gt;</quote>
7631  tag. Furthermore, the <literal>s</literal> option says that the match may span
7632  multiple lines in the page, and the <literal>g</literal> option again means that the
7633  substitution is global.
7634 </para>
7635
7636 <para>
7637  So, to summarize, the pattern means: Match all scripts that contain the text
7638  <quote>document.referrer</quote>. Remember the parts of the script from
7639  (and including) the start tag up to (and excluding) the string
7640  <quote>document.referrer</quote> as <literal>$1</literal>, and the part following
7641  that string, up to and including the closing tag, as <literal>$2</literal>.
7642 </para>
7643
7644 <para>
7645  Now the pattern is deciphered, but wasn't this about substituting things? So
7646  lets look at the substitute: <literal>$1"Not Your Business!"$2</literal> is
7647  easy to read: The text remembered as <literal>$1</literal>, followed by
7648  <literal>"Not Your Business!"</literal> (<emphasis>including</emphasis>
7649  the quotation marks!), followed by the text remembered as <literal>$2</literal>.
7650  This produces an exact copy of the original string, with the middle part
7651  (the <quote>document.referrer</quote>) replaced by <literal>"Not Your
7652  Business!"</literal>.
7653 </para>
7654
7655 <para>
7656  The whole job now reads: Replace <quote>document.referrer</quote> by
7657  <literal>"Not Your Business!"</literal> wherever it appears inside a
7658  &lt;script&gt tag. Note that this job won't break JavaScript syntax,
7659  since both the original and the replacement are syntactically valid
7660  string objects. The script just won't have access to the referrer
7661  information anymore.
7662 </para>
7663
7664 <para>
7665  We'll show you two other jobs from the JavaScript taming department, but
7666  this time only point out the constructs of special interest:
7667 </para>
7668
7669 <para>
7670  <screen>
7671 # The status bar is for displaying link targets, not pointless blahblah
7672 #
7673 s/window\.status\s*=\s*(['"]).*?\1/dUmMy=1/ig</screen>
7674 </para>
7675
7676 <para>
7677  <literal>\s</literal> stands for whitespace characters (space, tab, newline,
7678  carriage return, form feed), so that <literal>\s*</literal> means: <quote>zero
7679  or more whitespace</quote>. The <literal>?</literal> in <literal>.*?</literal>
7680  makes this matching of arbitrary text ungreedy. (Note that the <literal>U</literal>
7681  option is not set). The <literal>['"]</literal> construct means: <quote>a single
7682  <emphasis>or</emphasis> a double quote</quote>. Finally, <literal>\1</literal> is
7683  a back-reference to the first parenthesis just like <literal>$1</literal> above,
7684  with the difference that in the <emphasis>pattern</emphasis>, a backslash indicates
7685  a back-reference, whereas in the <emphasis>substitute</emphasis>, it's the dollar.
7686 </para>
7687
7688 <para>
7689  So what does this job do? It replaces assignments of single- or double-quoted
7690  strings to the <quote>window.status</quote> object with a dummy assignment
7691  (using a variable name that is hopefully odd enough not to conflict with
7692  real variables in scripts). Thus, it catches many cases where e.g. pointless
7693  descriptions are displayed in the status bar instead of the link target when
7694  you move your mouse over links.
7695 </para>
7696
7697 <para>
7698  <screen>
7699 # Kill OnUnload popups. Yummy. Test: http://www.zdnet.com/zdsubs/yahoo/tree/yfs.html
7700 #
7701 s/(&lt;body [^&gt;]*)onunload(.*&gt;)/$1never$2/iU</screen>
7702 </para>
7703
7704 <para>
7705  Including the
7706  <ulink url="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-eventgroupings-htmlevents">OnUnload
7707  event binding</ulink> in the HTML DOM was a <emphasis>CRIME</emphasis>.
7708  When I close a browser window, I want it to close and die. Basta.
7709  This job replaces the <quote>onunload</quote> attribute in
7710  <quote>&lt;body&gt</quote> tags with the dummy word <literal>never</literal>.
7711  Note that the <literal>i</literal> option makes the pattern matching
7712  case-insensitive. Also note that ungreedy matching alone doesn't always guarantee
7713  a minimal match: In the first parenthesis, we had to use <literal>[^&gt;]*</literal>
7714  instead of <literal>.*</literal> to prevent the match from exceeding the
7715  &lt;body&gt tag if it doesn't contain <quote>OnUnload</quote>, but the page's
7716  content does.
7717 </para>
7718
7719 <para>
7720  The last example is from the fun department:
7721 </para>
7722
7723 <para>
7724  <screen>
7725 FILTER: fun Fun text replacements
7726
7727 # Spice the daily news:
7728 #
7729 s/microsoft(?!\.com)/MicroSuck/ig</screen>
7730 </para>
7731
7732 <para>
7733  Note the <literal>(?!\.com)</literal> part (a so-called negative lookahead)
7734  in the job's pattern, which means: Don't match, if the string
7735  <quote>.com</quote> appears directly following <quote>microsoft</quote>
7736  in the page. This prevents links to microsoft.com from being trashed, while
7737  still replacing the word everywhere else.
7738 </para>
7739
7740 <para>
7741  <screen>
7742 # Buzzword Bingo (example for extended regex syntax)
7743 #
7744 s* industry[ -]leading \
7745 |  cutting[ -]edge \
7746 |  customer[ -]focused \
7747 |  market[ -]driven \
7748 |  award[ -]winning # Comments are OK, too! \
7749 |  high[ -]performance \
7750 |  solutions[ -]based \
7751 |  unmatched \
7752 |  unparalleled \
7753 |  unrivalled \
7754 *&lt;font color="red"&gt;&lt;b&gt;BINGO!&lt;/b&gt;&lt;/font&gt; \
7755 *igx</screen>
7756 </para>
7757
7758 <para>
7759  The <literal>x</literal> option in this job turns on extended syntax, and allows for
7760  e.g. the liberal use of (non-interpreted!) whitespace for nicer formatting.
7761 </para>
7762
7763 <para>
7764  You get the idea?
7765 </para>
7766 </sect2>
7767
7768 <!--   ~~~~~~~~       New section Header    ~~~~~~~~~     -->
7769
7770 <sect2 id="predefined-filters"><title>The Pre-defined Filters</title>
7771
7772 <!--
7773
7774  Note each filter is also listed in the +filter action section above. Please
7775  keep these listings in sync.
7776
7777 -->
7778
7779 <para>
7780 The distribution <filename>default.filter</filename> file contains a selection of
7781 pre-defined filters for your convenience:
7782 </para>
7783
7784 <variablelist>
7785  <varlistentry>
7786   <term><emphasis>js-annoyances</emphasis></term>
7787   <listitem>
7788    <para>
7789     The purpose of this filter is to get rid of particularly annoying JavaScript abuse.
7790     To that end, it
7791    <itemizedlist>
7792     <listitem>
7793      <para>
7794       replaces JavaScript references to the browser's referrer information
7795       with the string "Not Your Business!". This compliments the <literal><link
7796       linkend="hide-referrer">hide-referrer</link></literal> action on the content level.
7797      </para>
7798     </listitem>
7799     <listitem>
7800      <para>
7801       removes the bindings to the DOM's
7802       <ulink url="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-eventgroupings-htmlevents">unload
7803       event</ulink> which we feel has no right to exist and is responsible for most <quote>exit consoles</quote>, i.e.
7804       nasty windows that pop up when you close another one.
7805      </para>
7806     </listitem>
7807     <listitem>
7808      <para>
7809       removes code that causes new windows to be opened with undesired properties, such as being
7810       full-screen, non-resizeable, without location, status or menu bar etc.
7811      </para>
7812     </listitem>
7813    </itemizedlist>
7814    </para>
7815    <para>
7816     Use with caution. This is an aggressive filter, and can break sites that
7817     rely heavily on JavaScript.
7818    </para>
7819   </listitem>
7820  </varlistentry>
7821
7822  <varlistentry>
7823   <term><emphasis>js-events</emphasis></term>
7824   <listitem>
7825    <para>
7826     This is a very radical measure. It removes virtually all JavaScript event bindings, which
7827     means that scripts can not react to user actions such as mouse movements or clicks, window
7828     resizing etc, anymore. Use with caution!
7829    </para>
7830    <para>
7831     We <emphasis>strongly discourage</emphasis> using this filter as a default since it breaks
7832     many legitimate scripts. It is meant for use only on extra-nasty sites (should you really
7833     need to go there).
7834    </para>
7835   </listitem>
7836  </varlistentry>
7837
7838 <varlistentry>
7839   <term><emphasis>html-annoyances</emphasis></term>
7840   <listitem>
7841    <para>
7842     This filter will undo many common instances of HTML based abuse.
7843    </para>
7844    <para>
7845     The <literal>BLINK</literal> and <literal>MARQUEE</literal> tags
7846     are neutralized (yeah baby!), and browser windows will be created as
7847     resizeable (as of course they should be!), and will have location,
7848     scroll and menu bars -- even if specified otherwise.
7849    </para>
7850   </listitem>
7851  </varlistentry>
7852
7853  <varlistentry>
7854   <term><emphasis>content-cookies</emphasis></term>
7855   <listitem>
7856    <para>
7857     Most cookies are set in the HTTP dialog, where they can be intercepted
7858     by the
7859     <literal><link linkend="crunch-incoming-cookies">crunch-incoming-cookies</link></literal>
7860     and <literal><link linkend="crunch-outgoing-cookies">crunch-outgoing-cookies</link></literal>
7861     actions. But web sites increasingly make use of HTML meta tags and JavaScript
7862     to sneak cookies to the browser on the content level.
7863    </para>
7864    <para>
7865     This filter disables most HTML and JavaScript code that reads or sets
7866     cookies. It cannot detect all clever uses of these types of code, so it
7867     should not be relied on as an absolute fix. Use it wherever you would also
7868     use the cookie crunch actions.
7869    </para>
7870   </listitem>
7871  </varlistentry>
7872
7873  <varlistentry>
7874   <term><emphasis>refresh-tags</emphasis></term>
7875   <listitem>
7876    <para>
7877     Disable any refresh tags if the interval is greater than nine seconds (so
7878     that redirections done via refresh tags are not destroyed). This is useful
7879     for dial-on-demand setups, or for those who find this HTML feature
7880     annoying.
7881    </para>
7882   </listitem>
7883  </varlistentry>
7884
7885  <varlistentry>
7886   <term><emphasis>unsolicited-popups</emphasis></term>
7887   <listitem>
7888    <para>
7889     This filter attempts to prevent only <quote>unsolicited</quote> pop-up
7890     windows from opening, yet still allow pop-up windows that the user
7891     has explicitly chosen to open. It was added in version 3.0.1,
7892     as an improvement over earlier such filters.
7893    </para>
7894    <para>
7895     Technical note: The filter works by redefining the window.open JavaScript
7896     function to a dummy function, <literal>PrivoxyWindowOpen()</literal>,
7897     during the loading and rendering phase of each HTML page access, and
7898     restoring the function afterward.
7899    </para>
7900    <para>
7901     This is recommended only for browsers that cannot perform this function
7902     reliably themselves. And be aware that some sites require such windows
7903     in order to function normally. Use with caution.
7904    </para>
7905   </listitem>
7906  </varlistentry>
7907
7908  <varlistentry>
7909   <term><emphasis>all-popups</emphasis></term>
7910   <listitem>
7911    <para>
7912     Attempt to prevent <emphasis>all</emphasis> pop-up windows from opening.
7913     Note this should be used with even more discretion than the above, since
7914     it is more likely to break some sites that require pop-ups for normal
7915     usage. Use with caution.
7916    </para>
7917   </listitem>
7918  </varlistentry>
7919
7920  <varlistentry>
7921   <term><emphasis>img-reorder</emphasis></term>
7922   <listitem>
7923    <para>
7924     This is a helper filter that has no value if used alone. It makes the
7925     <literal>banners-by-size</literal> and <literal>banners-by-link</literal>
7926     (see below) filters more effective and should be enabled together with them.
7927    </para>
7928   </listitem>
7929  </varlistentry>
7930
7931  <varlistentry>
7932   <term><emphasis>banners-by-size</emphasis></term>
7933   <listitem>
7934    <para>
7935     This filter removes image tags purely based on what size they are. Fortunately
7936     for us, many ads and banner images tend to conform to certain standardized
7937     sizes, which makes this filter quite effective for ad stripping purposes.
7938    </para>
7939    <para>
7940     Occasionally this filter will cause false positives on images that are not ads,
7941     but just happen to be of one of the standard banner sizes.
7942    </para>
7943    <para>
7944     Recommended only for those who require extreme ad blocking. The default
7945     block rules should catch 95+% of all ads <emphasis>without</emphasis> this filter enabled.
7946    </para>
7947   </listitem>
7948  </varlistentry>
7949
7950  <varlistentry>
7951   <term><emphasis>banners-by-link</emphasis></term>
7952   <listitem>
7953    <para>
7954     This is an experimental filter that attempts to kill any banners if
7955     their URLs seem to point to known or suspected click trackers. It is currently
7956     not of much value and is not recommended for use by default.
7957    </para>
7958   </listitem>
7959  </varlistentry>
7960
7961  <varlistentry>
7962   <term><emphasis>webbugs</emphasis></term>
7963   <listitem>
7964    <para>
7965     Webbugs are small, invisible images (technically 1X1 GIF images), that
7966     are used to track users across websites, and collect information on them.
7967     As an HTML page is loaded by the browser, an embedded image tag causes the
7968     browser to contact a third-party site, disclosing the tracking information
7969     through the requested URL and/or cookies for that third-party domain, without
7970     the user ever becoming aware of the interaction with the third-party site.
7971     HTML-ized spam also uses a similar technique to verify email addresses.
7972    </para>
7973    <para>
7974     This filter removes the HTML code that loads such <quote>webbugs</quote>.
7975    </para>
7976   </listitem>
7977  </varlistentry>
7978
7979  <varlistentry>
7980   <term><emphasis>tiny-textforms</emphasis></term>
7981   <listitem>
7982    <para>
7983     A rather special-purpose filter that can be used to enlarge textareas (those
7984     multi-line text boxes in web forms) and turn off hard word wrap in them.
7985     It was written for the sourceforge.net tracker system where such boxes are
7986     a nuisance, but it can be handy on other sites, too.
7987    </para>
7988    <para>
7989     It is not recommended to use this filter as a default.
7990    </para>
7991   </listitem>
7992  </varlistentry>
7993
7994  <varlistentry>
7995   <term><emphasis>jumping-windows</emphasis></term>
7996   <listitem>
7997    <para>
7998     Many consider windows that move, or resize themselves to be abusive. This filter
7999     neutralizes the related JavaScript code. Note that some sites might not display
8000     or behave as intended when using this filter. Use with caution.
8001    </para>
8002   </listitem>
8003  </varlistentry>
8004
8005  <varlistentry>
8006   <term><emphasis>frameset-borders</emphasis></term>
8007   <listitem>
8008    <para>
8009     Some web designers seem to assume that everyone in the world will view their
8010     web sites using the same browser brand and version, screen resolution etc,
8011     because only that assumption could explain why they'd use static frame sizes,
8012     yet prevent their frames from being resized by the user, should they be too
8013     small to show their whole content.
8014    </para>
8015    <para>
8016     This filter removes the related HTML code. It should only be applied to sites
8017     which need it.
8018    </para>
8019   </listitem>
8020  </varlistentry>
8021
8022  <varlistentry>
8023   <term><emphasis>demoronizer</emphasis></term>
8024   <listitem>
8025    <para>
8026     Many Microsoft products that generate HTML use non-standard extensions (read:
8027     violations) of the ISO 8859-1 aka Latin-1 character set. This can cause those
8028     HTML documents to display with errors on standard-compliant platforms.
8029    </para>
8030    <para>
8031     This filter translates the MS-only characters into Latin-1 equivalents.
8032     It is not necessary when using MS products, and will cause corruption of
8033     all documents that use 8-bit character sets other than Latin-1. It's mostly
8034     worthwhile for Europeans on non-MS platforms, if weird garbage characters
8035     sometimes appear on some pages, or user agents that don't correct for this on
8036     the fly.
8037 <!--
8038     My version of Mozilla (ancient) shows litte square boxes for quote
8039     characters, and apostrophes on moronized pages. So many pages have this, I
8040     can read them fine now. HB 08/27/06
8041 -->
8042    </para>
8043   </listitem>
8044  </varlistentry>
8045
8046  <varlistentry>
8047   <term><emphasis>shockwave-flash</emphasis></term>
8048   <listitem>
8049    <para>
8050     A filter for shockwave haters. As the name suggests, this filter strips code
8051     out of web pages that is used to embed shockwave flash objects.
8052    </para>
8053    <para>
8054    </para>
8055   </listitem>
8056  </varlistentry>
8057
8058  <varlistentry>
8059   <term><emphasis>quicktime-kioskmode</emphasis></term>
8060   <listitem>
8061    <para>
8062     Change HTML code that embeds Quicktime objects so that kioskmode, which
8063     prevents saving, is disabled.
8064    </para>
8065   </listitem>
8066  </varlistentry>
8067
8068  <varlistentry>
8069   <term><emphasis>fun</emphasis></term>
8070   <listitem>
8071    <para>
8072     Text replacements for subversive browsing fun. Make fun of your favorite
8073     Monopolist or play buzzword bingo.
8074    </para>
8075   </listitem>
8076  </varlistentry>
8077
8078  <varlistentry>
8079   <term><emphasis>crude-parental</emphasis></term>
8080   <listitem>
8081    <para>
8082     A demonstration-only filter that shows how <application>Privoxy</application>
8083     can be used to delete web content on a keyword basis.
8084    </para>
8085   </listitem>
8086  </varlistentry>
8087
8088  <varlistentry>
8089   <term><emphasis>ie-exploits</emphasis></term>
8090   <listitem>
8091    <para>
8092     An experimental collection of text replacements to disable malicious HTML and JavaScript
8093     code that exploits known security holes in Internet Explorer.
8094    </para>
8095    <para>
8096     Presently, it only protects against Nimda and a cross-site scripting bug, and
8097     would need active maintenance to provide more substantial protection.
8098    </para>
8099   </listitem>
8100  </varlistentry>
8101
8102  <varlistentry>
8103   <term><emphasis>site-specifics</emphasis></term>
8104   <listitem>
8105    <para>
8106     Some web sites have very specific problems, the cure for which doesn't apply
8107     anywhere else, or could even cause damage on other sites.
8108    </para>
8109    <para>
8110     This is a collection of such site-specific cures which should only be applied
8111     to the sites they were intended for, which is what the supplied
8112     <filename>default.action</filename> file does. Users shouldn't need to change
8113     anything regarding this filter.
8114    </para>
8115   </listitem>
8116  </varlistentry>
8117
8118  <varlistentry>
8119   <term><emphasis>google</emphasis></term>
8120   <listitem>
8121    <para>
8122     A CSS based block for Google text ads. Also removes a width limitation
8123     and the toolbar advertisement.
8124    </para>
8125   </listitem>
8126  </varlistentry>
8127
8128   <varlistentry>
8129   <term><emphasis>yahoo</emphasis></term>
8130   <listitem>
8131    <para>
8132     Another CSS based block, this time for Yahoo text ads. And removes
8133     a width limitation as well.
8134    </para>
8135   </listitem>
8136  </varlistentry>
8137
8138   <varlistentry>
8139   <term><emphasis>msn</emphasis></term>
8140   <listitem>
8141    <para>
8142     Another CSS based block, this time for MSN text ads. And removes
8143     tracking URLs, as well as a width limitation.
8144    </para>
8145   </listitem>
8146  </varlistentry>
8147
8148  <varlistentry>
8149   <term><emphasis>blogspot</emphasis></term>
8150   <listitem>
8151    <para>
8152     Cleans up some Blogspot blogs. Read the fine print before using this one!
8153    </para>
8154    <para>
8155     This filter also intentionally removes some navigation stuff and sets the
8156     page width to 100%. As a result, some rounded <quote>corners</quote> would
8157     appear to early or not at all and as fixing this would require a browser
8158     that understands background-size (CSS3), they are removed instead.
8159    </para>
8160   </listitem>
8161  </varlistentry>
8162
8163   <varlistentry>
8164   <term><emphasis>xml-to-html</emphasis></term>
8165   <listitem>
8166    <para>
8167     Server-header filter to change the Content-Type from xml to html.
8168    </para>
8169   </listitem>
8170  </varlistentry>
8171
8172   <varlistentry>
8173   <term><emphasis>html-to-xml</emphasis></term>
8174   <listitem>
8175    <para>
8176     Server-header filter to change the Content-Type from html to xml.
8177    </para>
8178   </listitem>
8179  </varlistentry>
8180
8181   <varlistentry>
8182   <term><emphasis>no-ping</emphasis></term>
8183   <listitem>
8184    <para>
8185     Removes the non-standard <literal>ping</literal> attribute from
8186     anchor and area HTML tags.
8187    </para>
8188   </listitem>
8189  </varlistentry>
8190
8191   <varlistentry>
8192   <term><emphasis>hide-tor-exit-notation</emphasis></term>
8193   <listitem>
8194    <para>
8195     Client-header filter to remove the <command>Tor</command> exit node notation
8196     found in Host and Referer headers.
8197    </para>
8198    <para>
8199     If &my-app; and <command>Tor</command> are chained and &my-app;
8200     is configured to use socks4a, one can use <quote>http://www.example.org.foobar.exit/</quote>
8201     to access the host <quote>www.example.org</quote> through the
8202     <command>Tor</command> exit node <quote>foobar</quote>.
8203    </para>
8204    <para>
8205     As the HTTP client isn't aware of this notation, it treats the
8206     whole string <quote>www.example.org.foobar.exit</quote> as host and uses it
8207     for the <quote>Host</quote> and <quote>Referer</quote> headers. From the
8208     server's point of view the resulting headers are invalid and can cause problems.
8209    </para>
8210    <para>
8211     An invalid <quote>Referer</quote> header can trigger <quote>hot-linking</quote>
8212     protections, an invalid <quote>Host</quote> header will make it impossible for
8213     the server to find the right vhost (several domains hosted on the same IP address).
8214    </para>
8215    <para>
8216     This client-header filter removes the <quote>foo.exit</quote> part in those headers
8217     to prevent the mentioned problems. Note that it only modifies
8218     the HTTP headers, it doesn't make it impossible for the server
8219     to detect your <command>Tor</command> exit node based on the IP address
8220     the request is coming from.
8221    </para>
8222   </listitem>
8223  </varlistentry>
8224
8225 <!--
8226  <varlistentry>
8227   <term><emphasis> </emphasis></term>
8228   <listitem>
8229    <para>
8230    </para>
8231    <para>
8232    </para>
8233   </listitem>
8234  </varlistentry>
8235 -->
8236 </variablelist>
8237
8238 </sect2>
8239 </sect1>
8240
8241 <!--  ~  End section  ~  -->
8242
8243
8244
8245 <!--   ~~~~~       New section      ~~~~~     -->
8246
8247 <sect1 id="templates">
8248 <title>Privoxy's Template Files</title>
8249 <para>
8250  All <application>Privoxy</application> built-in pages, i.e. error pages such as the
8251  <ulink url="http://show-the-404-error.page"><quote>404 - No Such Domain</quote>
8252  error page</ulink>, the <ulink
8253  url="http://ads.bannerserver.example.com/nasty-ads/sponsor.html"><quote>BLOCKED</quote>
8254  page</ulink>
8255  and all pages of its <ulink url="http://config.privoxy.org/">web-based
8256  user interface</ulink>, are generated from <emphasis>templates</emphasis>.
8257  (<application>Privoxy</application> must be running for the above links to work as
8258  intended.)
8259 </para>
8260
8261 <para>
8262  These templates are stored in a subdirectory of the <link linkend="confdir">configuration
8263  directory</link> called <filename>templates</filename>. On Unixish platforms,
8264  this is typically
8265  <ulink url="file:///etc/privoxy/templates/"><filename>/etc/privoxy/templates/</filename></ulink>.
8266 </para>
8267
8268 <para>
8269  The templates are basically normal HTML files, but with place-holders (called symbols
8270  or exports), which <application>Privoxy</application> fills at run time. It
8271  is possible to edit the templates with a normal text editor, should you want
8272  to customize them. (<emphasis>Not recommended for the casual
8273  user</emphasis>). Should you create your own custom templates, you should use
8274  the <filename>config</filename> setting <link linkend="templdir">templdir</link>
8275  to specify an alternate location, so your templates do not get overwritten
8276  during upgrades.
8277  </para>
8278  <para>
8279  Note that just like in configuration files, lines starting
8280  with <literal>#</literal> are ignored when the templates are filled in.
8281 </para>
8282
8283 <para>
8284  The place-holders are of the form <literal>@name@</literal>, and you will
8285  find a list of available symbols, which vary from template to template,
8286  in the comments at the start of each file. Note that these comments are not
8287  always accurate, and that it's probably best to look at the existing HTML
8288  code to find out which symbols are supported and what they are filled in with.
8289 </para>
8290
8291 <para>
8292  A special application of this substitution mechanism is to make whole
8293  blocks of HTML code disappear when a specific symbol is set. We use this
8294  for many purposes, one of them being to include the beta warning in all
8295  our user interface (CGI) pages when <application>Privoxy</application>
8296  is in an alpha or beta development stage:
8297 </para>
8298
8299 <para>
8300  <screen>
8301 &lt;!-- @if-unstable-start --&gt;
8302
8303   ... beta warning HTML code goes here ...
8304
8305 &lt;!-- if-unstable-end@ --&gt;</screen>
8306 </para>
8307
8308 <para>
8309  If the "unstable" symbol is set, everything in between and including
8310  <literal>@if-unstable-start</literal> and <literal>if-unstable-end@</literal>
8311  will disappear, leaving nothing but an empty comment:
8312 </para>
8313
8314 <para>
8315  <screen>&lt;!--  --&gt;</screen>
8316 </para>
8317
8318 <para>
8319  There's also an if-then-else construct and an <literal>#include</literal>
8320  mechanism, but you'll sure find out if you are inclined to edit the
8321  templates ;-)
8322 </para>
8323
8324 <para>
8325  All templates refer to a style located at
8326  <ulink url="http://config.privoxy.org/send-stylesheet"><literal>http://config.privoxy.org/send-stylesheet</literal></ulink>.
8327  This is, of course, locally served by <application>Privoxy</application>
8328  and the source for it can be found and edited in the
8329  <filename>cgi-style.css</filename> template.
8330 </para>
8331
8332 </sect1>
8333
8334 <!--  ~  End section  ~  -->
8335
8336
8337
8338 <!--   ~~~~~       New section      ~~~~~     -->
8339
8340 <sect1 id="contact"><title>Contacting the Developers, Bug Reporting and Feature
8341 Requests</title>
8342
8343 <!-- Include contacting.sgml boilerplate: -->
8344  &contacting;
8345 <!-- end boilerplate -->
8346
8347 </sect1>
8348
8349 <!--  ~  End section  ~  -->
8350
8351
8352 <!--   ~~~~~       New section      ~~~~~     -->
8353 <sect1 id="copyright"><title>Privoxy Copyright, License and History</title>
8354
8355 <!-- Include copyright.sgml: -->
8356  &copyright;
8357 <!-- end copyright -->
8358
8359 <!--   ~~~~~       New section      ~~~~~     -->
8360 <sect2><title>License</title>
8361 <!-- Include copyright.sgml: -->
8362  &license;
8363 <!-- end copyright -->
8364 </sect2>
8365 <!--  ~  End section  ~  -->
8366
8367
8368 <!--   ~~~~~       New section      ~~~~~     -->
8369
8370 <sect2 id="history"><title>History</title>
8371 <!-- Include history.sgml: -->
8372  &history;
8373 <!-- end history -->
8374 </sect2>
8375
8376 <sect2 id="authors"><title>Authors</title>
8377 <!-- Include p-authors.sgml: -->
8378  &p-authors;
8379 <!-- end authors -->
8380 </sect2>
8381
8382 </sect1>
8383
8384 <!--  ~  End section  ~  -->
8385
8386
8387 <!--   ~~~~~       New section      ~~~~~     -->
8388 <sect1 id="seealso"><title>See Also</title>
8389 <!-- Include seealso.sgml: -->
8390  &seealso;
8391 <!-- end seealso -->
8392 </sect1>
8393
8394
8395
8396 <!--   ~~~~~       New section      ~~~~~     -->
8397 <sect1 id="appendix"><title>Appendix</title>
8398
8399
8400 <!--   ~~~~~       New section      ~~~~~     -->
8401 <sect2 id="regex">
8402 <title>Regular Expressions</title>
8403 <para>
8404  <application>Privoxy</application> uses Perl-style <quote>regular
8405  expressions</quote> in its <link linkend="actions-file">actions
8406  files</link> and <link linkend="filter-file">filter file</link>,
8407  through the <ulink url="http://www.pcre.org/">PCRE</ulink> and
8408 <!--
8409  dead 08/27/06
8410  <ulink url="http://www.oesterhelt.org/pcrs/">PCRS</ulink> libraries.
8411 -->
8412  <application>PCRS</application> libraries.
8413 </para>
8414
8415 <para>
8416  If you are reading this, you probably don't understand what <quote>regular
8417  expressions</quote> are, or what they can do. So this will be a very brief
8418  introduction only. A full explanation would require a <ulink
8419  url="http://www.oreilly.com/catalog/regex/">book</ulink> ;-)
8420 </para>
8421
8422 <para>
8423  Regular expressions provide a language to describe patterns that can be
8424  run against strings of characters (letter, numbers, etc), to see if they
8425  match the string or not. The  patterns are themselves (sometimes complex)
8426  strings of literal characters, combined with  wild-cards, and other special
8427  characters, called meta-characters. The <quote>meta-characters</quote> have
8428  special meanings and are used to build complex patterns to be matched against.
8429  Perl Compatible Regular Expressions are an especially convenient
8430  <quote>dialect</quote> of the regular expression language.
8431 </para>
8432
8433 <para>
8434  To make a simple analogy, we do something similar when we use wild-card
8435  characters when listing files with the <command>dir</command> command in DOS.
8436  <literal>*.*</literal> matches all filenames. The <quote>special</quote>
8437  character here is the asterisk which matches any and all characters. We can be
8438  more specific and use <literal>?</literal> to match just individual
8439  characters. So <quote>dir file?.text</quote> would match
8440  <quote>file1.txt</quote>, <quote>file2.txt</quote>, etc. We are pattern
8441  matching, using a similar technique to <quote>regular expressions</quote>!
8442 </para>
8443
8444 <para>
8445  Regular expressions do essentially the same thing, but are much, much more
8446  powerful. There are many more <quote>special characters</quote> and ways of
8447  building complex patterns however. Let's look at a few of the common ones,
8448  and then some examples:
8449 </para>
8450
8451 <para><simplelist>
8452  <member>
8453   <emphasis>.</emphasis> - Matches any single character, e.g. <quote>a</quote>,
8454   <quote>A</quote>, <quote>4</quote>, <quote>:</quote>, or <quote>@</quote>.
8455  </member>
8456 </simplelist></para>
8457
8458 <para><simplelist>
8459  <member>
8460   <emphasis>?</emphasis> - The preceding character or expression is matched ZERO or ONE
8461   times. Either/or.
8462  </member>
8463 </simplelist></para>
8464
8465 <para><simplelist>
8466  <member>
8467   <emphasis>+</emphasis> - The preceding character or expression is matched ONE or MORE
8468   times.
8469  </member>
8470 </simplelist></para>
8471
8472 <para><simplelist>
8473  <member>
8474   <emphasis>*</emphasis> - The preceding character or expression is matched ZERO or MORE
8475   times.
8476  </member>
8477 </simplelist></para>
8478
8479 <para><simplelist>
8480  <member>
8481   <emphasis>\</emphasis> - The <quote>escape</quote> character denotes that
8482   the following character should be taken literally. This is used where one of the
8483   special characters (e.g. <quote>.</quote>) needs to be taken literally and
8484   not as a special meta-character. Example: <quote>example\.com</quote>, makes
8485   sure the period is recognized only as a period (and not expanded to its
8486   meta-character meaning of any single character).
8487  </member>
8488 </simplelist></para>
8489
8490 <para><simplelist>
8491  <member>
8492   <emphasis>[ ]</emphasis> - Characters enclosed in brackets will be matched if
8493   any of the enclosed characters are encountered. For instance, <quote>[0-9]</quote>
8494   matches any numeric digit (zero through nine). As an example, we can combine
8495   this with <quote>+</quote> to match any digit one of more times: <quote>[0-9]+</quote>.
8496  </member>
8497 </simplelist></para>
8498
8499 <para><simplelist>
8500  <member>
8501   <emphasis>( )</emphasis> - parentheses are used to group a sub-expression,
8502   or multiple sub-expressions.
8503  </member>
8504 </simplelist></para>
8505
8506 <para><simplelist>
8507  <member>
8508   <emphasis>|</emphasis> - The <quote>bar</quote> character works like an
8509   <quote>or</quote> conditional statement. A match is successful if the
8510   sub-expression on either side of <quote>|</quote> matches. As an example:
8511   <quote>/(this|that) example/</quote> uses grouping and the bar character
8512   and would match either <quote>this example</quote> or <quote>that
8513   example</quote>, and nothing else.
8514  </member>
8515 </simplelist></para>
8516
8517 <para>
8518  These are just some of the ones you are likely to use when matching URLs with
8519  <application>Privoxy</application>, and is a long way from a definitive
8520  list. This is enough to get us started with a few simple examples which may
8521  be more illuminating:
8522 </para>
8523
8524 <para>
8525  <emphasis><literal>/.*/banners/.*</literal></emphasis> - A  simple example
8526  that uses the common combination of <quote>.</quote> and <quote>*</quote> to
8527  denote any character, zero or more times. In other words, any string at all.
8528  So we start with a literal forward slash, then our regular expression pattern
8529  (<quote>.*</quote>) another literal forward slash, the string
8530  <quote>banners</quote>, another forward slash, and lastly another
8531  <quote>.*</quote>. We are building
8532  a directory path here. This will match any file with the path that has a
8533  directory named <quote>banners</quote> in it. The <quote>.*</quote> matches
8534  any characters, and this could conceivably be more forward slashes, so it
8535  might expand into a much longer looking path. For example, this could match:
8536  <quote>/eye/hate/spammers/banners/annoy_me_please.gif</quote>, or just
8537  <quote>/banners/annoying.html</quote>, or almost an infinite number of other
8538  possible combinations, just so it has <quote>banners</quote> in the path
8539  somewhere.
8540 </para>
8541
8542 <para>
8543  And now something a little more complex:
8544 </para>
8545
8546 <para>
8547  <emphasis><literal>/.*/adv((er)?ts?|ertis(ing|ements?))?/</literal></emphasis> -
8548  We have several literal forward slashes again (<quote>/</quote>), so we are
8549  building another expression that is a file path statement. We have another
8550  <quote>.*</quote>, so we are matching against any conceivable sub-path, just so
8551  it matches our expression. The only true literal that <emphasis>must
8552  match</emphasis> our pattern is <application>adv</application>, together with
8553  the forward slashes. What comes after the <quote>adv</quote> string is the
8554  interesting part.
8555 </para>
8556
8557 <para>
8558  Remember the <quote>?</quote> means the preceding expression (either a
8559  literal character or anything grouped with <quote>(...)</quote> in this case)
8560  can exist or not, since this means either zero or one match. So
8561  <quote>((er)?ts?|ertis(ing|ements?))</quote> is optional, as are the
8562  individual sub-expressions: <quote>(er)</quote>,
8563  <quote>(ing|ements?)</quote>, and the <quote>s</quote>. The <quote>|</quote>
8564  means <quote>or</quote>. We have two of those. For instance,
8565  <quote>(ing|ements?)</quote>, can expand to match either <quote>ing</quote>
8566  <emphasis>OR</emphasis> <quote>ements?</quote>. What is being done here, is an
8567  attempt at matching as many variations of <quote>advertisement</quote>, and
8568  similar, as possible. So this would expand to match just <quote>adv</quote>,
8569  or <quote>advert</quote>, or <quote>adverts</quote>, or
8570  <quote>advertising</quote>, or <quote>advertisement</quote>, or
8571  <quote>advertisements</quote>. You get the idea. But it would not match
8572  <quote>advertizements</quote> (with a <quote>z</quote>). We could fix that by
8573  changing our regular expression to:
8574  <quote>/.*/adv((er)?ts?|erti(s|z)(ing|ements?))?/</quote>, which would then match
8575  either spelling.
8576 </para>
8577
8578 <para>
8579  <emphasis><literal>/.*/advert[0-9]+\.(gif|jpe?g)</literal></emphasis> - Again
8580  another path statement with forward slashes. Anything in the square brackets
8581  <quote>[ ]</quote> can be matched. This is using <quote>0-9</quote> as a
8582  shorthand expression to mean any digit one through nine. It is the same as
8583  saying <quote>0123456789</quote>. So any digit matches. The <quote>+</quote>
8584  means one or more of the preceding expression must be included. The preceding
8585  expression here is what is in the square brackets -- in this case, any digit
8586  one through nine. Then, at the end, we have a grouping: <quote>(gif|jpe?g)</quote>.
8587  This includes a <quote>|</quote>, so this needs to match the expression on
8588  either side of that bar character also. A simple <quote>gif</quote> on one side, and the other
8589  side will in turn match either <quote>jpeg</quote> or <quote>jpg</quote>,
8590  since the <quote>?</quote> means the letter <quote>e</quote> is optional and
8591  can be matched once or not at all. So we are building an expression here to
8592  match image GIF or JPEG type image file. It must include the literal
8593  string <quote>advert</quote>, then one or more digits, and a <quote>.</quote>
8594  (which is now a literal, and not a special character, since it is escaped
8595  with <quote>\</quote>), and lastly either <quote>gif</quote>, or
8596  <quote>jpeg</quote>, or <quote>jpg</quote>. Some possible matches would
8597  include: <quote>//advert1.jpg</quote>,
8598  <quote>/nasty/ads/advert1234.gif</quote>,
8599  <quote>/banners/from/hell/advert99.jpg</quote>. It would not match
8600  <quote>advert1.gif</quote> (no leading slash), or
8601  <quote>/adverts232.jpg</quote> (the expression does not include an
8602  <quote>s</quote>), or <quote>/advert1.jsp</quote> (<quote>jsp</quote> is not
8603  in the expression anywhere).
8604 </para>
8605
8606 <para>
8607  We are barely scratching the surface of regular expressions here so that you
8608  can understand the default <application>Privoxy</application>
8609  configuration files, and maybe use this knowledge to customize your own
8610  installation. There is much, much more that can be done with regular
8611  expressions. Now that you know enough to get started, you can learn more on
8612  your own :/
8613 </para>
8614
8615 <para>
8616  More reading on Perl Compatible Regular expressions:
8617  <ulink url="http://perldoc.perl.org/perlre.html">http://perldoc.perl.org/perlre.html</ulink>
8618 </para>
8619
8620 <para>
8621  For information on regular expression based substitutions and their applications
8622  in filters, please see the <link linkend="filter-file">filter file tutorial</link>
8623  in this manual.
8624 </para>
8625 </sect2>
8626
8627 <!--  ~  End section  ~  -->
8628
8629
8630 <!--   ~~~~~       New section      ~~~~~     -->
8631 <sect2>
8632 <title>Privoxy's Internal Pages</title>
8633
8634 <para>
8635  Since <application>Privoxy</application> proxies each requested
8636  web page, it is easy for <application>Privoxy</application> to
8637  trap certain special URLs. In this way, we can talk directly to
8638  <application>Privoxy</application>, and see how it is
8639  configured, see how our rules are being applied, change these
8640  rules and other configuration options, and even turn
8641  <application>Privoxy's</application> filtering off, all with
8642  a web browser.
8643
8644 </para>
8645
8646 <para>
8647  The URLs listed below are the special ones that allow direct access
8648  to <application>Privoxy</application>. Of course,
8649  <application>Privoxy</application> must be running to access these. If
8650  not, you will get a friendly error message. Internet access is not
8651  necessary either.
8652 </para>
8653
8654 <para>
8655  <itemizedlist>
8656
8657  <listitem>
8658   <para>
8659    Privoxy main page:
8660   </para>
8661   <blockquote>
8662    <para>
8663      <ulink url="http://config.privoxy.org/">http://config.privoxy.org/</ulink>
8664    </para>
8665   </blockquote>
8666   <para>
8667    There is a shortcut: <ulink url="http://p.p/">http://p.p/</ulink> (But it
8668    doesn't provide a fall-back to a real page, in case the request is not
8669    sent through <application>Privoxy</application>)
8670   </para>
8671  </listitem>
8672
8673  <listitem>
8674   <para>
8675     Show information about the current configuration, including viewing and
8676     editing of actions files:
8677   </para>
8678    <blockquote>
8679    <para>
8680     <ulink url="http://config.privoxy.org/show-status">http://config.privoxy.org/show-status</ulink>
8681    </para>
8682   </blockquote>
8683  </listitem>
8684
8685  <listitem>
8686   <para>
8687     Show the source code version numbers:
8688   </para>
8689   <blockquote>
8690    <para>
8691     <ulink url="http://config.privoxy.org/show-version">http://config.privoxy.org/show-version</ulink>
8692    </para>
8693   </blockquote>
8694  </listitem>
8695
8696  <listitem>
8697   <para>
8698    Show the browser's request headers:
8699   </para>
8700   <blockquote>
8701    <para>
8702     <ulink url="http://config.privoxy.org/show-request">http://config.privoxy.org/show-request</ulink>
8703    </para>
8704   </blockquote>
8705  </listitem>
8706
8707  <listitem>
8708   <para>
8709    Show which actions apply to a URL and why:
8710   </para>
8711    <blockquote>
8712    <para>
8713     <ulink url="http://config.privoxy.org/show-url-info">http://config.privoxy.org/show-url-info</ulink>
8714    </para>
8715   </blockquote>
8716  </listitem>
8717
8718  <listitem>
8719   <para>
8720    Toggle Privoxy on or off. This feature can be turned off/on in the main
8721    <filename>config</filename> file. When toggled <quote>off</quote>, <quote>Privoxy</quote>
8722    continues to run, but only as a pass-through proxy, with no actions taking
8723    place:
8724   </para>
8725    <blockquote>
8726    <para>
8727     <ulink url="http://config.privoxy.org/toggle">http://config.privoxy.org/toggle</ulink>
8728    </para>
8729   </blockquote>
8730   <para>
8731    Short cuts. Turn off, then on:
8732   </para>
8733    <blockquote>
8734    <para>
8735      <ulink url="http://config.privoxy.org/toggle?set=disable">http://config.privoxy.org/toggle?set=disable</ulink>
8736    </para>
8737   </blockquote>
8738    <blockquote>
8739    <para>
8740      <ulink url="http://config.privoxy.org/toggle?set=enable">http://config.privoxy.org/toggle?set=enable</ulink>
8741    </para>
8742   </blockquote>
8743  </listitem>
8744
8745  </itemizedlist>
8746 </para>
8747
8748 <para>
8749  These may be bookmarked for quick reference. See next.
8750
8751 </para>
8752
8753 <sect3 id="bookmarklets">
8754 <title>Bookmarklets</title>
8755 <para>
8756  Below are some <quote>bookmarklets</quote> to allow you to easily access a
8757  <quote>mini</quote> version of some of <application>Privoxy's</application>
8758  special pages. They are designed for MS Internet Explorer, but should work
8759  equally well in Netscape, Mozilla, and other browsers which support
8760  JavaScript. They are designed to run directly from your bookmarks - not by
8761  clicking the links below (although that should work for testing).
8762 </para>
8763 <para>
8764  To save them, right-click the link and choose <quote>Add to Favorites</quote>
8765  (IE) or <quote>Add Bookmark</quote> (Netscape). You will get a warning that
8766  the bookmark <quote>may not be safe</quote> - just click OK. Then you can run the
8767  Bookmarklet directly from your favorites/bookmarks. For even faster access,
8768  you can put them on the <quote>Links</quote> bar (IE) or the <quote>Personal
8769  Toolbar</quote> (Netscape), and run them with a single click.
8770 </para>
8771
8772 <para>
8773  <itemizedlist>
8774
8775   <listitem>
8776    <para>
8777     <ulink
8778     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>
8779    </para>
8780   </listitem>
8781
8782   <listitem>
8783    <para>
8784     <ulink
8785     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>
8786    </para>
8787   </listitem>
8788
8789   <listitem>
8790    <para>
8791     <ulink
8792     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)
8793    </para>
8794   </listitem>
8795
8796   <listitem>
8797    <para>
8798     <ulink
8799     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>
8800    </para>
8801   </listitem>
8802 <!--
8803   <listitem>
8804    <para>
8805     <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>
8806    </para>
8807   </listitem>
8808  -->
8809   <listitem>
8810    <para>
8811     <ulink url="javascript:void(window.open('http://config.privoxy.org/show-url-info?url='+escape(location.href),'Why').focus());">Privoxy - Why?</ulink>
8812    </para>
8813   </listitem>
8814  </itemizedlist>
8815 </para>
8816
8817 <para>
8818  Credit: The site which gave us the general idea for these bookmarklets is
8819  <ulink url="http://www.bookmarklets.com/">www.bookmarklets.com</ulink>. They
8820  have more information about bookmarklets.
8821 </para>
8822
8823
8824 </sect3>
8825
8826 </sect2>
8827
8828
8829 <!--   ~~~~~       New section      ~~~~~     -->
8830 <sect2 id="chain">
8831 <title>Chain of Events</title>
8832 <para>
8833  Let's take a quick look at how some of <application>Privoxy's</application>
8834  core features are triggered, and the ensuing sequence of events when a web
8835  page is requested by your browser:
8836 </para>
8837
8838 <para>
8839  <itemizedlist>
8840  <listitem>
8841   <para>
8842    First, your web browser requests a web page. The browser knows to send
8843    the request to <application>Privoxy</application>, which will in turn,
8844    relay the request to the remote web server after passing the following
8845    tests:
8846   </para>
8847  </listitem>
8848  <listitem>
8849   <para>
8850    <application>Privoxy</application> traps any request for its own internal CGI
8851    pages (e.g <ulink url="http://p.p/">http://p.p/</ulink>) and sends the CGI page back to the browser.
8852   </para>
8853  </listitem>
8854  <listitem>
8855   <para>
8856    Next, <application>Privoxy</application> checks to see if the URL
8857    matches any <link
8858    linkend="BLOCK"><quote>+block</quote></link> patterns. If
8859    so, the URL is then blocked, and the remote web server will not be contacted.
8860    <link linkend="HANDLE-AS-IMAGE"><quote>+handle-as-image</quote></link>
8861    and
8862    <link linkend="HANDLE-AS-EMPTY-DOCUMENT"><quote>+handle-as-empty-document</quote></link>
8863    are then checked, and if there is no match, an
8864    HTML <quote>BLOCKED</quote> page is sent back to the browser. Otherwise, if
8865    it does match, an image is returned for the former, and an empty text
8866    document for the latter. The type of image would depend on the setting of
8867    <link linkend="SET-IMAGE-BLOCKER"><quote>+set-image-blocker</quote></link>
8868    (blank, checkerboard pattern, or an HTTP redirect to an image elsewhere).
8869   </para>
8870  </listitem>
8871  <listitem>
8872   <para>
8873    Untrusted URLs are blocked. If URLs are being added to the
8874    <filename>trust</filename> file, then that is done.
8875   </para>
8876  </listitem>
8877  <listitem>
8878   <para>
8879    If the URL pattern matches the <link
8880    linkend="FAST-REDIRECTS"><quote>+fast-redirects</quote></link> action,
8881    it is then processed. Unwanted parts of the requested URL are stripped.
8882   </para>
8883  </listitem>
8884  <listitem>
8885   <para>
8886    Now the rest of the client browser's request headers are processed. If any
8887    of these match any of the relevant actions (e.g. <link
8888    linkend="HIDE-USER-AGENT"><quote>+hide-user-agent</quote></link>,
8889    etc.), headers are suppressed or forged as determined by these actions and
8890    their parameters.
8891   </para>
8892  </listitem>
8893  <listitem>
8894   <para>
8895    Now the web server starts sending its response back (i.e. typically a web
8896    page).
8897   </para>
8898  </listitem>
8899  <listitem>
8900   <para>
8901    First, the server headers are read and processed to determine, among other
8902    things, the MIME type (document type) and encoding. The headers are then
8903    filtered as determined by the
8904    <link linkend="CRUNCH-INCOMING-COOKIES"><quote>+crunch-incoming-cookies</quote></link>,
8905    <link linkend="SESSION-COOKIES-ONLY"><quote>+session-cookies-only</quote></link>,
8906    and <link linkend="DOWNGRADE-HTTP-VERSION"><quote>+downgrade-http-version</quote></link>
8907    actions.
8908   </para>
8909  </listitem>
8910  <listitem>
8911   <para>
8912    If any <link linkend="FILTER"><quote>+filter</quote></link> action
8913    or <link
8914    linkend="DEANIMATE-GIFS"><quote>+deanimate-gifs</quote></link>
8915    action applies (and the document type fits the action), the rest of the page is
8916    read into memory (up to a configurable limit). Then the filter rules (from
8917    <filename>default.filter</filename> and any other filter files) are
8918    processed against the buffered content. Filters are applied in the order
8919    they are specified in one of the filter files. Animated GIFs, if present,
8920    are reduced to either the first or last frame, depending on the action
8921    setting.The entire page, which is now filtered, is then sent by
8922    <application>Privoxy</application> back to your browser.
8923   </para>
8924   <para>
8925    If neither a <link linkend="FILTER"><quote>+filter</quote></link> action
8926    or <link
8927    linkend="DEANIMATE-GIFS"><quote>+deanimate-gifs</quote></link>
8928    matches, then <application>Privoxy</application> passes the raw data through
8929    to the client browser as it becomes available.
8930   </para>
8931  </listitem>
8932  <listitem>
8933   <para>
8934    As the browser receives the now (possibly filtered) page content, it
8935    reads and then requests any URLs that may be embedded within the page
8936    source, e.g. ad images, stylesheets, JavaScript, other HTML documents (e.g.
8937    frames), sounds, etc. For each of these objects, the browser issues a
8938    separate request (this is easily viewable in <application>Privoxy's</application>
8939    logs). And each such request is in turn processed just as above. Note that a
8940    complex web page will have many, many such embedded URLs. If these
8941    secondary requests are to a different server, then quite possibly a very
8942    differing set of actions is triggered.
8943   </para>
8944  </listitem>
8945
8946  </itemizedlist>
8947 </para>
8948 <para>
8949  NOTE: This is somewhat of a simplistic overview of what happens with each URL
8950  request. For the sake of brevity and simplicity, we have focused on
8951  <application>Privoxy's</application> core features only.
8952 </para>
8953
8954 </sect2>
8955
8956
8957 <!--   ~~~~~       New section      ~~~~~     -->
8958 <sect2 id="actionsanat">
8959 <title>Troubleshooting: Anatomy of an Action</title>
8960
8961 <para>
8962  The way <application>Privoxy</application> applies
8963  <link linkend="ACTIONS">actions</link> and <link linkend="FILTER">filters</link>
8964  to any given URL can be complex, and not always so
8965  easy to understand what is happening. And sometimes we need to be able to
8966  <emphasis>see</emphasis> just what <application>Privoxy</application> is
8967  doing. Especially, if something <application>Privoxy</application> is doing
8968  is causing us a problem inadvertently. It can be a little daunting to look at
8969  the actions and filters files themselves, since they tend to be filled with
8970  <link linkend="regex">regular expressions</link> whose consequences are not
8971  always so obvious.
8972 </para>
8973
8974 <para>
8975  One quick test to see if <application>Privoxy</application> is causing a problem
8976  or not, is to disable it temporarily. This should be the first troubleshooting
8977  step. See <link linkend="bookmarklets">the Bookmarklets</link> section on a quick
8978  and easy way to do this (be sure to flush caches afterward!). Looking at the
8979  logs is a good idea too. (Note that both the toggle feature and logging are
8980  enabled via <filename>config</filename> file settings, and may need to be
8981  turned <quote>on</quote>.)
8982 </para>
8983 <para>
8984  Another easy troubleshooting step to try is if you have done any
8985  customization of your installation, revert back to the installed
8986  defaults and see if that helps. There are times the developers get complaints
8987  about one thing or another, and the problem is more related to a customized
8988  configuration issue.
8989 </para>
8990
8991 <para>
8992  <application>Privoxy</application> also provides the
8993  <ulink url="http://config.privoxy.org/show-url-info">http://config.privoxy.org/show-url-info</ulink>
8994  page that can show us very specifically how <application>actions</application>
8995  are being applied to any given URL. This is a big help for troubleshooting.
8996 </para>
8997
8998 <para>
8999  First, enter one URL (or partial URL) at the prompt, and then
9000  <application>Privoxy</application> will tell us
9001  how the current configuration will handle it. This will not
9002  help with filtering effects (i.e. the <link
9003  linkend="FILTER"><quote>+filter</quote></link> action) from
9004  one of the filter files since this is handled very
9005  differently and not so easy to trap! It also will not tell you about any other
9006  URLs that may be embedded within the URL you are testing. For instance, images
9007  such as ads are expressed as URLs within the raw page source of HTML pages. So
9008  you will only get info for the actual URL that is pasted into the prompt area
9009  -- not any sub-URLs. If you want to know about embedded URLs like ads, you
9010  will have to dig those out of the HTML source. Use your browser's <quote>View
9011  Page Source</quote> option for this. Or right click on the ad, and grab the
9012  URL.
9013 </para>
9014
9015 <para>
9016  Let's try an example, <ulink url="http://google.com">google.com</ulink>,
9017  and look at it one section at a time in a sample configuration (your real
9018  configuration may vary):
9019 </para>
9020
9021 <para>
9022  <screen>
9023  Matches for http://www.google.com:
9024
9025  In file: default.action <guibutton>[ View ]</guibutton> <guibutton>[ Edit ]</guibutton>
9026
9027  {+change-x-forwarded-for{block}
9028  +deanimate-gifs {last}
9029  +fast-redirects {check-decoded-url}
9030  +filter {refresh-tags}
9031  +filter {img-reorder}
9032  +filter {banners-by-size}
9033  +filter {webbugs}
9034  +filter {jumping-windows}
9035  +filter {ie-exploits}
9036  +hide-from-header {block}
9037  +hide-referrer {forge}
9038  +session-cookies-only
9039  +set-image-blocker {pattern}
9040 /
9041
9042  { -session-cookies-only }
9043  .google.com
9044
9045  { -fast-redirects }
9046  .google.com
9047
9048 In file: user.action <guibutton>[ View ]</guibutton> <guibutton>[ Edit ]</guibutton>
9049 (no matches in this file)
9050 </screen>
9051 </para>
9052
9053 <para>
9054  This is telling us how we have defined our
9055  <link linkend="ACTIONS"><quote>actions</quote></link>, and
9056  which ones match for our test case, <quote>google.com</quote>.
9057  Displayed is all the actions that are available to us. Remember,
9058  the <literal>+</literal> sign denotes <quote>on</quote>. <literal>-</literal>
9059  denotes <quote>off</quote>. So some are <quote>on</quote> here, but many
9060  are <quote>off</quote>. Each example we try may provide a slightly different
9061  end result, depending on our configuration directives.
9062 </para>
9063 <para>
9064  The first listing
9065   is for our <filename>default.action</filename> file. The large, multi-line
9066   listing, is how the actions are set to match for all URLs, i.e. our default
9067   settings. If you look at your <quote>actions</quote> file, this would be the
9068   section just below the <quote>aliases</quote> section near the top. This
9069   will apply to all URLs as signified by the single forward slash at the end
9070   of the listing -- <quote> / </quote>.
9071 </para>
9072
9073 <para>
9074  But we have defined additional actions that would be exceptions to these general
9075  rules, and then we list specific URLs (or patterns) that these exceptions
9076  would apply to. Last match wins. Just below this then are two explicit
9077  matches for <quote>.google.com</quote>. The first is negating our previous
9078  cookie setting, which was for <link
9079  linkend="SESSION-COOKIES-ONLY"><quote>+session-cookies-only</quote></link>
9080  (i.e. not persistent). So we will allow persistent cookies for google, at
9081  least that is how it is in this example. The second turns
9082  <emphasis>off</emphasis> any <link
9083  linkend="FAST-REDIRECTS"><quote>+fast-redirects</quote></link>
9084  action, allowing this to take place unmolested. Note that there is a leading
9085  dot here -- <quote>.google.com</quote>. This will match any hosts and
9086  sub-domains, in the google.com domain also, such as
9087  <quote>www.google.com</quote> or <quote>mail.google.com</quote>. But it would not
9088  match <quote>www.google.de</quote>! So, apparently, we have these two actions
9089  defined as exceptions to the general rules at the top somewhere in the lower
9090  part of our <filename>default.action</filename> file, and
9091  <quote>google.com</quote> is referenced somewhere in these latter sections.
9092 </para>
9093
9094 <para>
9095  Then, for our <filename>user.action</filename> file, we again have no hits.
9096  So there is nothing google-specific that we might have added to our own, local
9097  configuration. If there was, those actions would over-rule any actions from
9098  previously processed files, such as <filename>default.action</filename>.
9099  <filename>user.action</filename> typically has the last word. This is the
9100  best place to put hard and fast exceptions,
9101 </para>
9102
9103 <para>
9104  And finally we pull it all together in the bottom section and summarize how
9105  <application>Privoxy</application> is applying all its <quote>actions</quote>
9106  to <quote>google.com</quote>:
9107
9108 </para>
9109
9110 <para>
9111  <screen>
9112
9113  Final results:
9114
9115  -add-header
9116  -block
9117  +change-x-forwarded-for{block}
9118  -client-header-filter{hide-tor-exit-notation}
9119  -content-type-overwrite
9120  -crunch-client-header
9121  -crunch-if-none-match
9122  -crunch-incoming-cookies
9123  -crunch-outgoing-cookies
9124  -crunch-server-header
9125  +deanimate-gifs {last}
9126  -downgrade-http-version
9127  -fast-redirects
9128  -filter {js-events}
9129  -filter {content-cookies}
9130  -filter {all-popups}
9131  -filter {banners-by-link}
9132  -filter {tiny-textforms}
9133  -filter {frameset-borders}
9134  -filter {demoronizer}
9135  -filter {shockwave-flash}
9136  -filter {quicktime-kioskmode}
9137  -filter {fun}
9138  -filter {crude-parental}
9139  -filter {site-specifics}
9140  -filter {js-annoyances}
9141  -filter {html-annoyances}
9142  +filter {refresh-tags}
9143  -filter {unsolicited-popups}
9144  +filter {img-reorder}
9145  +filter {banners-by-size}
9146  +filter {webbugs}
9147  +filter {jumping-windows}
9148  +filter {ie-exploits}
9149  -filter {google}
9150  -filter {yahoo}
9151  -filter {msn}
9152  -filter {blogspot}
9153  -filter {no-ping}
9154  -force-text-mode
9155  -handle-as-empty-document
9156  -handle-as-image
9157  -hide-accept-language
9158  -hide-content-disposition
9159  +hide-from-header {block}
9160  -hide-if-modified-since
9161  +hide-referrer {forge}
9162  -hide-user-agent
9163  -limit-connect
9164  -overwrite-last-modified
9165  -prevent-compression
9166  -redirect
9167  -server-header-filter{xml-to-html}
9168  -server-header-filter{html-to-xml}
9169  -session-cookies-only
9170  +set-image-blocker {pattern} </screen>
9171 </para>
9172
9173 <para>
9174  Notice the only difference here to the previous listing, is to
9175  <quote>fast-redirects</quote> and <quote>session-cookies-only</quote>,
9176  which are activated specifically for this site in our configuration,
9177  and thus show in the <quote>Final Results</quote>.
9178 </para>
9179
9180 <para>
9181  Now another example, <quote>ad.doubleclick.net</quote>:
9182 </para>
9183
9184 <para>
9185  <screen>
9186
9187  { +block{Domains starts with "ad"} }
9188   ad*.
9189
9190  { +block{Domain contains "ad"} }
9191   .ad.
9192
9193  { +block{Doubleclick banner server} +handle-as-image }
9194   .[a-vx-z]*.doubleclick.net
9195 </screen>
9196 </para>
9197
9198 <para>
9199  We'll just show the interesting part here - the explicit matches. It is
9200  matched three different times. Two <quote>+block{}</quote> sections,
9201  and a <quote>+block{} +handle-as-image</quote>,
9202  which is the expanded form of one of our aliases that had been defined as:
9203  <quote>+block-as-image</quote>. (<link
9204  linkend="ALIASES"><quote>Aliases</quote></link> are defined in
9205  the first section of the actions file and typically used to combine more
9206  than one action.)
9207 </para>
9208
9209 <para>
9210  Any one of these would have done the trick and blocked this as an unwanted
9211  image. This is unnecessarily redundant since the last case effectively
9212  would also cover the first. No point in taking chances with these guys
9213  though ;-) Note that if you want an ad or obnoxious
9214  URL to be invisible, it should be defined as <quote>ad.doubleclick.net</quote>
9215  is done here -- as both a <link
9216  linkend="BLOCK"><quote>+block{}</quote></link>
9217  <emphasis>and</emphasis> an
9218  <link linkend="HANDLE-AS-IMAGE"><quote>+handle-as-image</quote></link>.
9219  The custom alias <quote><literal>+block-as-image</literal></quote> just
9220  simplifies the process and make it more readable.
9221 </para>
9222
9223 <para>
9224  One last example. Let's try <quote>http://www.example.net/adsl/HOWTO/</quote>.
9225  This one is giving us problems. We are getting a blank page. Hmmm ...
9226 </para>
9227
9228 <para>
9229  <screen>
9230
9231  Matches for http://www.example.net/adsl/HOWTO/:
9232
9233  In file: default.action <guibutton>[ View ]</guibutton> <guibutton>[ Edit ]</guibutton>
9234
9235  {-add-header
9236   -block
9237   +change-x-forwarded-for{block}
9238   -client-header-filter{hide-tor-exit-notation}
9239   -content-type-overwrite
9240   -crunch-client-header
9241   -crunch-if-none-match
9242   -crunch-incoming-cookies
9243   -crunch-outgoing-cookies
9244   -crunch-server-header
9245   +deanimate-gifs
9246   -downgrade-http-version
9247   +fast-redirects {check-decoded-url}
9248   -filter {js-events}
9249   -filter {content-cookies}
9250   -filter {all-popups}
9251   -filter {banners-by-link}
9252   -filter {tiny-textforms}
9253   -filter {frameset-borders}
9254   -filter {demoronizer}
9255   -filter {shockwave-flash}
9256   -filter {quicktime-kioskmode}
9257   -filter {fun}
9258   -filter {crude-parental}
9259   -filter {site-specifics}
9260   -filter {js-annoyances}
9261   -filter {html-annoyances}
9262   +filter {refresh-tags}
9263   -filter {unsolicited-popups}
9264   +filter {img-reorder}
9265   +filter {banners-by-size}
9266   +filter {webbugs}
9267   +filter {jumping-windows}
9268   +filter {ie-exploits}
9269   -filter {google}
9270   -filter {yahoo}
9271   -filter {msn}
9272   -filter {blogspot}
9273   -filter {no-ping}
9274   -force-text-mode
9275   -handle-as-empty-document
9276   -handle-as-image
9277   -hide-accept-language
9278   -hide-content-disposition
9279   +hide-from-header{block}
9280   +hide-referer{forge}
9281   -hide-user-agent
9282   -overwrite-last-modified
9283   +prevent-compression
9284   -redirect
9285   -server-header-filter{xml-to-html}
9286   -server-header-filter{html-to-xml}
9287   +session-cookies-only
9288   +set-image-blocker{blank} }
9289    /
9290
9291  { +block{Path contains "ads".} +handle-as-image }
9292   /ads
9293 </screen>
9294 </para>
9295
9296 <para>
9297  Ooops, the <quote>/adsl/</quote> is matching <quote>/ads</quote> in our
9298  configuration! But we did not want this at all! Now we see why we get the
9299  blank page. It is actually triggering two different actions here, and
9300  the effects are aggregated so that the URL is blocked, and &my-app; is told
9301  to treat the block as if it were an image. But this is, of course, all wrong.
9302   We could now add a new action below this (or better in our own
9303   <filename>user.action</filename> file) that explicitly
9304   <emphasis>un</emphasis> blocks (
9305   <link linkend="BLOCK"><quote>{-block}</quote></link>) paths with
9306   <quote>adsl</quote> in them (remember, last match in the configuration
9307   wins). There are various ways to handle such exceptions. Example:
9308 </para>
9309
9310 <para>
9311  <screen>
9312
9313  { -block }
9314   /adsl
9315 </screen>
9316 </para>
9317
9318 <para>
9319  Now the page displays ;-)
9320  Remember to flush your browser's caches when making these kinds of changes to
9321  your configuration to insure that you get a freshly delivered page! Or, try
9322  using <literal>Shift+Reload</literal>.
9323 </para>
9324
9325 <para>
9326  But now what about a situation where we get no explicit matches like
9327  we did with:
9328 </para>
9329
9330 <para>
9331  <screen>
9332
9333  { +block{Path starts with "ads".} +handle-as-image }
9334  /ads
9335 </screen>
9336 </para>
9337
9338 <para>
9339  That actually was very helpful and pointed us quickly to where the problem
9340  was. If you don't get this kind of match, then it means one of the default
9341  rules in the first section of <filename>default.action</filename> is causing
9342  the problem. This would require some guesswork, and maybe a little trial and
9343  error to isolate the offending rule. One likely cause would be one of the
9344  <link linkend="FILTER"><quote>+filter</quote></link> actions.
9345  These tend to be harder to troubleshoot.
9346  Try adding the URL for the site to one of aliases that turn off
9347  <link linkend="FILTER"><quote>+filter</quote></link>:
9348 </para>
9349
9350 <para>
9351  <screen>
9352
9353  { shop }
9354  .quietpc.com
9355  .worldpay.com   # for quietpc.com
9356  .jungle.com
9357  .scan.co.uk
9358  .forbes.com
9359 </screen>
9360 </para>
9361
9362 <para>
9363  <quote><literal>{ shop }</literal></quote> is an <quote>alias</quote> that expands to
9364  <quote><literal>{ -filter -session-cookies-only }</literal></quote>.
9365  Or you could do your own exception to negate filtering:
9366
9367 </para>
9368
9369 <para>
9370  <screen>
9371
9372  { -filter }
9373  # Disable ALL filter actions for sites in this section
9374  .forbes.com
9375  developer.ibm.com
9376  localhost
9377 </screen>
9378 </para>
9379
9380 <para>
9381  This would turn off all filtering for these sites. This is best
9382  put in <filename>user.action</filename>, for local site
9383  exceptions. Note that when a simple domain pattern is used by itself (without
9384  the subsequent path portion), all sub-pages within that domain are included
9385  automatically in the scope of the action.
9386 </para>
9387
9388 <para>
9389  Images that are inexplicably being blocked, may well be hitting the
9390 <link linkend="FILTER-BANNERS-BY-SIZE"><quote>+filter{banners-by-size}</quote></link>
9391  rule, which assumes
9392  that images of certain sizes are ad banners (works well
9393  <emphasis>most of the time</emphasis>  since these tend to be standardized).
9394 </para>
9395
9396 <para>
9397  <quote><literal>{ fragile }</literal></quote> is an alias that disables most
9398  actions that are the most likely to cause trouble. This can be used as a
9399  last resort for problem sites.
9400 </para>
9401 <para>
9402  <screen>
9403
9404  { fragile }
9405  # Handle with care: easy to break
9406  mail.google.
9407  mybank.example.com</screen>
9408 </para>
9409
9410
9411 <para>
9412  <emphasis>Remember to flush caches!</emphasis> Note that the
9413  <literal>mail.google</literal> reference lacks the TLD portion (e.g.
9414  <quote>.com</quote>). This will effectively match any TLD with
9415  <literal>google</literal> in it, such as <literal>mail.google.de.</literal>,
9416  just as an example.
9417 </para>
9418 <para>
9419  If this still does not work, you will have to go through the remaining
9420  actions one by one to find which one(s) is causing the problem.
9421 </para>
9422
9423 </sect2>
9424
9425 </sect1>
9426
9427  <!--
9428
9429  This program is free software; you can redistribute it
9430  and/or modify it under the terms of the GNU General
9431  Public License as published by the Free Software
9432  Foundation; either version 2 of the License, or (at
9433  your option) any later version.
9434
9435  This program is distributed in the hope that it will
9436  be useful, but WITHOUT ANY WARRANTY; without even the
9437  implied warranty of MERCHANTABILITY or FITNESS FOR A
9438  PARTICULAR PURPOSE.  See the GNU General Public
9439  License for more details.
9440
9441  The GNU General Public License should be included with
9442  this file.  If not, you can view it at
9443  http://www.gnu.org/copyleft/gpl.html
9444  or write to the Free Software Foundation, Inc.,
9445  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
9446  USA
9447
9448  -->
9449
9450 </article>