summaryrefslogtreecommitdiffhomepage
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/Makefile.am3
-rw-r--r--docs/filter-howto.txt52
-rw-r--r--docs/man5/Makefile.am22
-rw-r--r--docs/man5/tinyproxy.conf.txt.in586
-rw-r--r--docs/man8/Makefile.am26
-rw-r--r--docs/man8/tinyproxy.txt.in166
-rw-r--r--docs/web/Makefile15
-rw-r--r--docs/web/podhtml-filter.awk5
-rw-r--r--docs/web/stylesheets/stylesheet.css426
-rw-r--r--docs/web/tp.html.foot21
-rw-r--r--docs/web/tp.html.head82
11 files changed, 976 insertions, 428 deletions
diff --git a/docs/Makefile.am b/docs/Makefile.am
index 5065255..e2ba221 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -4,6 +4,5 @@ SUBDIRS = \
EXTRA_DIST = \
http-error-codes.txt \
- http-rfcs.txt \
- filter-howto.txt
+ http-rfcs.txt
diff --git a/docs/filter-howto.txt b/docs/filter-howto.txt
deleted file mode 100644
index 3acd813..0000000
--- a/docs/filter-howto.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-Using tinyproxy with Your Home/Small Business Network
-
-Written: Patrick L. McGillan
-Edited: Robert James Kaes (2002-06-04)
------------------------------------------------------
-
-Being as this will be the most common usage and there were no clear
-basic instructions for this scenario, I thought I would write up what
-I did for my home system.
-
-First the layout of the network. A cable modem is connected through a
-Linksys Router to a small hub. The computers hanging off the hub and
-have a clear shot to the Internet.
-
-So, the connection from the Internet to the hub looks like this:
-
- Internet->Cable TV Line->Cable Modem->Linksys Router->Hub/Switch
-
-Restricting Internet web access on some of those computers (connected
-to the hub) is what using tinyproxy is all about. Using the web
-interface to the Linksys router, turn off all Internet access to those
-computers that shouldn't have direct access to the Internet. This is
-done by clicking on the advanced tab and entering the IP number in the
-filter range. Now those computers have to go through a proxy, for
-their access, as they have no direct access.
-
-On one of the Linux computers which still has Internet access (I use
-an old 486) load up tinyproxy. Now have the users configure their
-Internet Explorer/Netscape Navigator programs to use the proxy on the
-tinyproxy computer box, along with the port number declared in the
-tinyproxy configuration file. By default, there is no blocking of web
-sites with this program, so I created a file, called "filter", to
-start blocking some sites.
-
-Example "filter" file entries:
-
-bannerads.zwire.com
-ad.doubleclick.net
-ads.fortunecity.com
-
-This filter file usually goes into the same folder, as your
-configuration file. Be sure and uncomment the 'Filter' line in your
-configuration file and make sure it points at your newly created
-filter file.
-
-------------------------------------------------------------------------
-
-Copyright (c) 2002 Patrick L. McGillan <pmcgillan@dwx.com>
-
-This document is released under the same copyright license as
-tinyproxy. You should have found a COPYING file in the top level
-directory of this distribution which contains the current license. \ No newline at end of file
diff --git a/docs/man5/Makefile.am b/docs/man5/Makefile.am
index 247b7ef..31b8ddf 100644
--- a/docs/man5/Makefile.am
+++ b/docs/man5/Makefile.am
@@ -1,25 +1,25 @@
+if HAVE_MANPAGE_INTEREST
MAN5_FILES = \
tinyproxy.conf.txt
-
-if HAVE_XMLLINT
-A2X_ARGS = -d manpage -f manpage
-else
-A2X_ARGS = -d manpage -f manpage -L
endif
+M_SECTION=5
+M_NAME=TINYPROXY.CONF
+
man_MANS = \
$(MAN5_FILES:.txt=.5)
.txt.5:
-if HAVE_A2X
- $(AM_V_GEN) $(A2X) $(A2X_ARGS) $<
+if HAVE_POD2MAN
+ $(AM_V_GEN) $(POD2MAN) --center="Tinyproxy manual" \
+ --section=$(M_SECTION) --name=$(M_NAME) --release="Version @VERSION@" \
+ $< > $@
else
- @echo "*** a2x (asciidoc) is required to regenerate $(@) ***"; exit 1;
+ @echo "*** pod2man is required to regenerate $(@) ***"; exit 1;
endif
-CLEANFILES = \
- $(MAN5_FILES:.txt=.5) \
- $(MAN5_FILES:.txt=.xml)
+MAINTAINERCLEANFILES = \
+ $(MAN5_FILES:.txt=.5)
EXTRA_DIST = \
$(MAN5_FILES:.txt=.5)
diff --git a/docs/man5/tinyproxy.conf.txt.in b/docs/man5/tinyproxy.conf.txt.in
index b3b94ec..0629a9a 100644
--- a/docs/man5/tinyproxy.conf.txt.in
+++ b/docs/man5/tinyproxy.conf.txt.in
@@ -1,24 +1,20 @@
-TINYPROXY.CONF(5)
-=================
-:man source: Version @VERSION@
-:man manual: Tinyproxy manual
+=pod
-NAME
-----
+=encoding utf8
+
+=head1 NAME
tinyproxy.conf - Tinyproxy HTTP proxy daemon configuration file
-SYNOPSIS
---------
+=head1 SYNOPSIS
-*tinyproxy.conf*
+B<tinyproxy.conf>
-DESCRIPTION
------------
+=head1 DESCRIPTION
-`tinyproxy(8)` reads its configuration file, typically stored in
+L<tinyproxy(8)> reads its configuration file, typically stored in
`/etc/tinyproxy/tinyproxy.conf` (or passed to Tinyproxy with -c on the
command line). This manpage describes the syntax and contents of the
configuration file.
@@ -31,341 +27,371 @@ contain spaces.
The possible keywords and their descriptions are as follows:
-*User*::
+=over 4
+
+=item B<User>
+
+The user which the Tinyproxy process should run as, after the
+initial port-binding has been done as the `root` user. Either the
+user name or the UID may be specified.
+
+=item B<Group>
+
+The group which the Tinyproxy process should run as, after the
+initial port-binding has been done as the `root` user. Either the
+group name or the GID may be specified.
+
+=item B<Port>
+
+The port which the Tinyproxy service will listen on. If the port is
+less than 1024, you will need to start the Tinyproxy process as the
+`root` user.
+
+=item B<Listen>
+
+By default, Tinyproxy listens for connections on all available
+interfaces (i.e. it listens on the wildcard address `0.0.0.0`).
+With this configuration parameter, Tinyproxy can be told to listen
+only on one specific address.
+
+=item B<Bind>
+
+This allows you to specify which address Tinyproxy will bind
+to for outgoing connections to web servers or upstream proxies.
+This parameter may be specified multiple times, then Tinyproxy
+will try all the specified addresses in order.
+
+=item B<BindSame>
+
+If this boolean parameter is set to `yes`, then Tinyproxy will
+bind the outgoing connection to the IP address of the incoming
+connection that triggered the outgoing request.
+
+=item B<Timeout>
+
+The maximum number of seconds of inactivity a connection is
+allowed to have before it is closed by Tinyproxy.
+
+=item B<ErrorFile>
+
+This parameter controls which HTML file Tinyproxy returns when a
+given HTTP error occurs. It takes two arguments, the error number
+and the location of the HTML error file.
+
+=item B<DefaultErrorFile>
+
+This parameter controls the HTML template file returned when an
+error occurs for which no specific error file has been set.
+
+=item B<StatHost>
+
+This configures the host name or IP address that is treated
+as the `stat host`: Whenever a request for this host is received,
+Tinyproxy will return an internal statistics page instead of
+forwarding the request to that host. The template for this
+page can be configured with the `StatFile` configuration option.
+The default value of `StatHost` is `@TINYPROXY_STATHOST@`.
+
+=item B<StatFile>
+
+This configures the HTML file that Tinyproxy sends when
+a request for the stathost is received. If this parameter is
+not set, Tinyproxy returns a hard-coded basic statistics page.
+See the STATHOST section in the L<tinyproxy(8)> manual page
+for details.
+
+Note that the StatFile and the error files configured with ErrorFile
+and DefaultErrorFile are template files that can contain a few
+template variables that Tinyproxy expands prior to delivery.
+Examples are "{cause}" for an abbreviated error description and
+"{detail}" for a detailed error message. The L<tinyproxy(8)>
+manual page contains a description of all template variables.
+
+=item B<LogFile>
+
+This controls the location of the file to which Tinyproxy
+writes its debug output. Alternatively, Tinyproxy can log
+to syslog -- see the Syslog option.
+
+=item B<Syslog>
- The user which the Tinyproxy process should run as, after the
- initial port-binding has been done as the `root` user. Either the
- user name or the UID may be specified.
+When set to `On`, this option tells Tinyproxy to write its
+debug messages to syslog instead of to a log file configured
+with `LogFile`. These two options are mutually exclusive.
-*Group*::
+=item B<LogLevel>
- The group which the Tinyproxy process should run as, after the
- initial port-binding has been done as the `root` user. Either the
- group name or the GID may be specified.
+Sets the log level. Messages from the set level and above are
+logged. For example, if the LogLevel was set to Warning, then all
+log messages from Warning to Critical would be output, but Notice
+and below would be suppressed. Allowed values are:
-*Port*::
+=over 4
- The port which the Tinyproxy service will listen on. If the port is
- less than 1024, you will need to start the Tinyproxy process as the
- `root` user.
+=item * Critical (least verbose)
-*Listen*::
+=item * Error
- By default, Tinyproxy listens for connections on all available
- interfaces (i.e. it listens on the wildcard address `0.0.0.0`).
- With this configuration parameter, Tinyproxy can be told to listen
- only on one specific address.
+=item * Warning
-*Bind*::
+=item * Notice
- This allows you to specify which address Tinyproxy will bind
- to for outgoing connections to web servers or upstream proxies.
+=item * Connect (log connections without Info's noise)
-*BindSame*::
+=item * Info (most verbose)
- If this boolean parameter is set to `yes`, then Tinyproxy will
- bind the outgoing connection to the IP address of the incoming
- connection that triggered the outgoing request.
+=back
-*Timeout*::
+=item B<PidFile>
- The maximum number of seconds of inactivity a connection is
- allowed to have before it is closed by Tinyproxy.
+This option controls the location of the file where the main
+Tinyproxy process stores its process ID for signaling purposes.
-*ErrorFile*::
+=item B<XTinyproxy>
- This parameter controls which HTML file Tinyproxy returns when a
- given HTTP error occurs. It takes two arguments, the error number
- and the location of the HTML error file.
+Setting this option to `Yes` tells Tinyproxy to add a header
+`X-Tinyproxy` containing the client's IP address to the request.
-*DefaultErrorFile*::
+=item B<Upstream>
- This parameter controls the HTML template file returned when an
- error occurs for which no specific error file has been set.
+This option allows you to set up a set of rules for deciding
+whether an upstream proxy server is to be used, based on the
+host or domain of the site being accessed. The rules are stored
+in the order encountered in the configuration file and the
+LAST matching rule wins. The following forms for specifying upstream
+rules exist:
-*StatHost*::
+=over 4
- This configures the host name or IP address that is treated
- as the `stat host`: Whenever a request for this host is received,
- Tinyproxy will return an internal statistics page instead of
- forwarding the request to that host. The template for this
- page can be configured with the `StatFile` configuration option.
- The default value of `StatHost` is `@TINYPROXY_STATHOST@`.
+=item * I<upstream type host:port> turns proxy upstream support on generally.
-*StatFile*::
+=item * I<upstream type user:pass@host:port>
+does the same, but uses the supplied credentials for authentication.
- This configures the HTML file that Tinyproxy sends when
- a request for the stathost is received. If this parameter is
- not set, Tinyproxy returns a hard-coded basic statistics page.
- See the STATHOST section in the `tinyproxy(8)` manual page
- for details.
- +
- Note that the StatFile and the error files configured with ErrorFile
- and DefaultErrorFile are template files that can contain a few
- template variables that Tinyproxy expands prior to delivery.
- Examples are "\{cause}" for an abbreviated error description and
- "\{detail}" for a detailed error message. The `tinyproxy(8)`
- manual page contains a description of all template variables.
+=item * I<upstream type host:port "site_spec">
+turns on the upstream proxy for the sites matching `site_spec`.
-*LogFile*::
+`type` can be one of `http`, `socks4`, `socks5`, `none`.
- This controls the location of the file to which Tinyproxy
- writes its debug output. Alternatively, Tinyproxy can log
- to syslog -- see the Syslog option.
+=item * I<upstream none "site_spec">
+turns off upstream support for sites matching `site_spec`, that means the
+connection is done directly.
-*Syslog*::
+=back
- When set to `On`, this option tells Tinyproxy to write its
- debug messages to syslog instead of to a log file configured
- with `LogFile`. These two options are mutually exclusive.
+The site can be specified in various forms as a hostname, domain
+name or as an IP range:
-*LogLevel*::
+=over 4
- Sets the log level. Messages from the set level and above are
- logged. For example, if the LogLevel was set to Warning, then all
- log messages from Warning to Critical would be output, but Notice
- and below would be suppressed. Allowed values are:
+=item * I<name> matches host exactly
- * Critical (least verbose)
- * Error
- * Warning
- * Notice
- * Connect (log connections without Info's noise)
- * Info (most verbose)
+=item * I<.name> matches any host in domain "name"
-*PidFile*::
+=item * I<.> matches any host with no domain (in 'empty' domain)
- This option controls the location of the file where the main
- Tinyproxy process stores its process ID for signaling purposes.
+=item * I<IP/bits> matches network/mask
-*XTinyproxy*::
+=item * I<IP/mask> matches network/mask
- Setting this option to `Yes` tells Tinyproxy to add a header
- `X-Tinyproxy` containing the client's IP address to the request.
+=back
-*Upstream*::
+Note that the upstream directive can also be used to null-route
+a specific target domain/host, e.g.:
+`upstream http 0.0.0.0:0 ".adserver.com"`
- This option allows you to set up a set of rules for deciding
- whether an upstream proxy server is to be used, based on the
- host or domain of the site being accessed. The rules are stored
- in the order encountered in the configuration file and the
- LAST matching rule wins. The following forms for specifying upstream
- rules exist:
+=item B<MaxClients>
- * 'upstream type host:port' turns proxy upstream support on generally.
+Tinyproxy creates one thread for each connected client.
+This options specifies the absolute highest number processes that
+will be created. With other words, only MaxClients clients can be
+connected to Tinyproxy simultaneously.
- * 'upstream type user:pass@host:port' does the same, but uses the
- supplied credentials for authentication.
+=item B<Allow>
- * 'upstream type host:port "site_spec"' turns on the upstream proxy
- for the sites matching `site_spec`.
+=item B<Deny>
- `type` can be one of `http`, `socks4`, `socks5`, `none`.
+The `Allow` and `Deny` options provide a means to customize
+which clients are allowed to access Tinyproxy. `Allow` and `Deny`
+lines can be specified multiple times to build the access control
+list for Tinyproxy. The order in the config file is important.
+If there are no `Allow` or `Deny` lines, then all clients are
+allowed. Otherwise, the default action is to deny access.
+The argument to `Allow` or `Deny` can be a single IP address
+of a client host, like `127.0.0.1`, an IP address range, like
+`192.168.0.1/24` or a string that will be matched against the
+end of the client host name, i.e, this can be a full host name
+like `host.example.com` or a domain name like `.example.com` or
+even a top level domain name like `.com`.
+Note that by adding a rule using a host or domain name, a costly name
+lookup has to be done for every new connection, which could slow down
+the service considerably.
- * 'upstream none "site_spec"' turns off upstream support for sites
- matching `site_spec`.
+=item B<BasicAuth>
- The site can be specified in various forms as a hostname, domain
- name or as an IP range:
+Configure HTTP "Basic Authentication" username and password
+for accessing the proxy. If there are any entries specified,
+access is only granted for authenticated users.
- * 'name' matches host exactly
- * '.name' matches any host in domain "name"
- * '.' matches any host with no domain (in 'empty' domain)
- * 'IP/bits' matches network/mask
- * 'IP/mask' matches network/mask
+ BasicAuth user password
-*MaxClients*::
+=item B<AddHeader>
- Tinyproxy creates one child process for each connected client.
- This options specifies the absolute highest number processes that
- will be created. With other words, only MaxClients clients can be
- connected to Tinyproxy simultaneously.
+Configure one or more HTTP request headers to be added to outgoing
+HTTP requests that Tinyproxy makes. Note that this option will not
+work for HTTPS traffic, as Tinyproxy has no control over what
+headers are exchanged.
-*MinSpareServers*::
-*MaxSpareServers*::
+ AddHeader "X-My-Header" "Powered by Tinyproxy"
- Tinyproxy always keeps a certain number of idle child processes
- so that it can handle new incoming client requests quickly.
- `MinSpareServer` and `MaxSpareServers` control the lower and upper
- limits for the number of spare processes. I.e. when the number of
- spare servers drops below `MinSpareServers` then Tinyproxy will
- start forking new spare processes in the background and when the
- number of spare processes exceeds `MaxSpareServers` then Tinyproxy
- will kill off extra processes.
-
-*StartServers*::
-
- The number of servers to start initially. This should usually be
- set to a value between MinSpareServers and MaxSpareServers.
-
-*MaxRequestsPerChild*::
-
- This limits the number of connections that a child process
- will handle before it is killed. The default value is `0`
- which disables this feature. This option is meant as an
- emergency measure in the case of problems with memory leakage.
- In that case, setting `MaxRequestsPerChild` to a value of e.g.
- 1000, or 10000 can be useful.
+=item B<ViaProxyName>
-*Allow*::
-*Deny*::
+RFC 2616 requires proxies to add a `Via` header to the HTTP
+requests, but using the real host name can be a security
+concern. If the `ViaProxyname` option is present, then its
+string value will be used as the host name in the Via header.
+Otherwise, the server's host name will be used.
- The `Allow` and `Deny` options provide a means to customize
- which clients are allowed to access Tinyproxy. `Allow` and `Deny`
- lines can be specified multiple times to build the access control
- list for Tinyproxy. The order in the config file is important.
- If there are no `Allow` or `Deny` lines, then all clients are
- allowed. Otherwise, the default action is to deny access.
- The argument to `Allow` or `Deny` can be a single IP address
- of a client host, like `127.0.0.1`, an IP address range, like
- `192.168.0.1/24` or a string that will be matched against the
- end of the client host name, i.e, this can be a full host name
- like `host.example.com` or a domain name like `.example.com` or
- even a top level domain name like `.com`.
-
-*AddHeader*::
-
- Configure one or more HTTP request headers to be added to outgoing
- HTTP requests that Tinyproxy makes. Note that this option will not
- work for HTTPS traffic, as Tinyproxy has no control over what
- headers are exchanged.
- +
-----
-AddHeader "X-My-Header" "Powered by Tinyproxy"
-----
-
-*ViaProxyName*::
-
- RFC 2616 requires proxies to add a `Via` header to the HTTP
- requests, but using the real host name can be a security
- concern. If the `ViaProxyname` option is present, then its
- string value will be used as the host name in the Via header.
- Otherwise, the server's host name will be used.
-
-*DisableViaHeader*::
-
- When this is set to yes, Tinyproxy does NOT add the `Via` header
- to the requests. This virtually puts Tinyproxy into stealth mode.
- Note that RFC 2616 requires proxies to set the `Via` header, so by
- enabling this option, you break compliance.
- Don't disable the `Via` header unless you know what you are doing...
-
-*Filter*::
+=item B<DisableViaHeader>
- Tinyproxy supports filtering of web sites based on URLs or
- domains. This option specifies the location of the file
- containing the filter rules, one rule per line.
-
-*FilterURLs*::
-
- If this boolean option is set to `Yes` or `On`, filtering is
- performed for URLs rather than for domains. The default is to
- filter based on domains.
-
-*FilterExtended*::
-
- If this boolean option is set to `Yes`, then extended POSIX
- regular expressions are used for matching the filter rules.
- The default is to use basic POSIX regular expressions.
-
-*FilterCaseSensitive*::
-
- If this boolean option is set to `Yes`, then the filter rules
- are matched in a case sensitive manner. The default is to
- match case-insensitively.
-
-*FilterDefaultDeny*::
-
- The default filtering policy is to allow everything that is
- not matched by a filtering rule. Setting `FilterDefaultDeny`
- to `Yes` changes the policy do deny everything but the domains
- or URLs matched by the filtering rules.
-
-*Anonymous*::
-
- If an `Anonymous` keyword is present, then anonymous proxying
- is enabled. The headers listed with `Anonymous` are allowed
- through, while all others are denied. If no Anonymous keyword
- is present, then all headers are allowed through. You must
- include quotes around the headers.
- +
- Most sites require cookies to be enabled for them to work correctly, so
- you will need to allow cookies through if you access those sites.
- +
- Example:
- +
-----
-Anonymous "Host"
-Anonymous "Authorization"
-Anonymous "Cookie"
-----
-
-*ConnectPort*::
-
- This option can be used to specify the ports allowed for the
- CONNECT method. If no `ConnectPort` line is found, then all
- ports are allowed. To disable CONNECT altogether, include a
- single ConnectPort line with a value of `0`.
-
-*ReversePath*::
-
- Configure one or more ReversePath directives to enable reverse proxy
- support. With reverse proxying it's possible to make a number of
- sites appear as if they were part of a single site.
- +
- If you uncomment the following two directives and run Tinyproxy
- on your own computer at port 8888, you can access example.com,
- using http://localhost:8888/example/.
- +
-----
-ReversePath "/example/" "http://www.example.com/"
-----
+When this is set to yes, Tinyproxy does NOT add the `Via` header
+to the requests. This virtually puts Tinyproxy into stealth mode.
+Note that RFC 2616 requires proxies to set the `Via` header, so by
+enabling this option, you break compliance.
+Don't disable the `Via` header unless you know what you are doing...
-*ReverseOnly*::
+=item B<Filter>
- When using Tinyproxy as a reverse proxy, it is STRONGLY
- recommended that the normal proxy is turned off by setting
- this boolean option to `Yes`.
-
-*ReverseMagic*::
+Tinyproxy supports filtering of web sites based on URLs or
+domains. This option specifies the location of the file
+containing the filter rules, one rule per line.
- Setting this option to `Yes`, makes Tinyproxy use a cookie to
- track reverse proxy mappings. If you need to reverse proxy
- sites which have absolute links you must use this option.
+Rules are specified as POSIX basic regular expressions (BRE), unless
+FilterExtended is activated.
+Comment lines start with a `#` character.
-*ReverseBaseURL*::
+Example filter file contents:
- The URL that is used to access this reverse proxy. The URL is
- used to rewrite HTTP redirects so that they won't escape the
- proxy. If you have a chain of reverse proxies, you'll need to
- put the outermost URL here (the address which the end user
- types into his/her browser). If this option is not set then
- no rewriting of redirects occurs.
+ # filter exactly cnn.com
+ ^cnn\.com$
+
+ # filter all subdomains of cnn.com, but not cnn.com itself
+ .*\.cnn.com$
+
+ # filter any domain that has cnn.com in it, like xcnn.comfy.org
+ cnn\.com
+
+ # filter any domain that ends in cnn.com
+ cnn\.com$
+
+ # filter any domain that starts with adserver
+ ^adserver
+=item B<FilterURLs>
-BUGS
-----
+If this boolean option is set to `Yes` or `On`, filtering is
+performed for URLs rather than for domains. The default is to
+filter based on domains.
+
+=item B<FilterExtended>
+
+If this boolean option is set to `Yes`, then extended POSIX
+regular expressions are used for matching the filter rules.
+The default is to use basic POSIX regular expressions.
+
+=item B<FilterCaseSensitive>
+
+If this boolean option is set to `Yes`, then the filter rules
+are matched in a case sensitive manner. The default is to
+match case-insensitively.
+
+=item B<FilterDefaultDeny>
+
+The default filtering policy is to allow everything that is
+not matched by a filtering rule. Setting `FilterDefaultDeny`
+to `Yes` changes the policy do deny everything but the domains
+or URLs matched by the filtering rules.
+
+=item B<Anonymous>
+
+If an `Anonymous` keyword is present, then anonymous proxying
+is enabled. The headers listed with `Anonymous` are allowed
+through, while all others are denied. If no Anonymous keyword
+is present, then all headers are allowed through. You must
+include quotes around the headers.
+
+Most sites require cookies to be enabled for them to work correctly, so
+you will need to allow cookies through if you access those sites.
+
+Example:
+
+ Anonymous "Host"
+ Anonymous "Authorization"
+ Anonymous "Cookie"
+
+=item B<ConnectPort>
+
+This option can be used to specify the ports allowed for the
+CONNECT method. If no `ConnectPort` line is found, then all
+ports are allowed. To disable CONNECT altogether, include a
+single ConnectPort line with a value of `0`.
+
+=item B<ReversePath>
+
+Configure one or more ReversePath directives to enable reverse proxy
+support. With reverse proxying it's possible to make a number of
+sites appear as if they were part of a single site.
+
+If you uncomment the following two directives and run Tinyproxy
+on your own computer at port 8888, you can access example.com,
+using http://localhost:8888/example/.
+
+ ReversePath "/example/" "http://www.example.com/"
+
+=item B<ReverseOnly>
+
+When using Tinyproxy as a reverse proxy, it is STRONGLY
+recommended that the normal proxy is turned off by setting
+this boolean option to `Yes`.
+
+=item B<ReverseMagic>
+
+Setting this option to `Yes`, makes Tinyproxy use a cookie to
+track reverse proxy mappings. If you need to reverse proxy
+sites which have absolute links you must use this option.
+
+=item B<ReverseBaseURL>
+
+The URL that is used to access this reverse proxy. The URL is
+used to rewrite HTTP redirects so that they won't escape the
+proxy. If you have a chain of reverse proxies, you'll need to
+put the outermost URL here (the address which the end user
+types into his/her browser). If this option is not set then
+no rewriting of redirects occurs.
+
+=back
+
+=head1 BUGS
To report bugs in Tinyproxy, please visit
-<https://tinyproxy.github.io/[https://tinyproxy.github.io/]>.
+L<https://tinyproxy.github.io/>.
+
+=head1 SEE ALSO
-SEE ALSO
---------
-tinyproxy(8)
+L<tinyproxy(8)>
-AUTHOR
-------
+=head1 AUTHOR
This manpage was written by the Tinyproxy project team.
-COPYRIGHT
----------
+=head1 COPYRIGHT
-Copyright (c) 1998-2018 the Tinyproxy authors.
+Copyright (c) 1998-2020 the Tinyproxy authors.
This program is distributed under the terms of the GNU General Public
License version 2 or above. See the COPYING file for additional
information.
+
diff --git a/docs/man8/Makefile.am b/docs/man8/Makefile.am
index 1bd0ffa..d2d7e19 100644
--- a/docs/man8/Makefile.am
+++ b/docs/man8/Makefile.am
@@ -1,25 +1,25 @@
-MAN8_FILES = \
+if HAVE_MANPAGE_INTEREST
+MAN8_FILES = \
tinyproxy.txt
-
-if HAVE_XMLLINT
-A2X_ARGS = -d manpage -f manpage
-else
-A2X_ARGS = -d manpage -f manpage -L
endif
+M_SECTION=8
+M_NAME=TINYPROXY
+
man_MANS = \
$(MAN8_FILES:.txt=.8)
.txt.8:
-if HAVE_A2X
- $(AM_V_GEN) $(A2X) $(A2X_ARGS) $<
+if HAVE_POD2MAN
+ $(AM_V_GEN) $(POD2MAN) --center="Tinyproxy manual" \
+ --section=$(M_SECTION) --name=$(M_NAME) --release="Version @VERSION@" \
+ $< > $@
else
- @echo "*** a2x (asciidoc) is required to regenerate $(@) ***"; exit 1;
+ @echo "*** pod2man is required to regenerate $(@) ***"; exit 1;
endif
-CLEANFILES = \
- $(MAN8_FILES:.txt=.8) \
- $(MAN8_FILES:.txt=.xml)
+MAINTAINERCLEANFILES = \
+ $(MAN8_FILES:.txt=.8)
-EXTRA_DIST= \
+EXTRA_DIST = \
$(MAN8_FILES:.txt=.8)
diff --git a/docs/man8/tinyproxy.txt.in b/docs/man8/tinyproxy.txt.in
index 54da867..7fa420f 100644
--- a/docs/man8/tinyproxy.txt.in
+++ b/docs/man8/tinyproxy.txt.in
@@ -1,24 +1,20 @@
-TINYPROXY(8)
-============
-:man source: Version @VERSION@
-:man manual: Tinyproxy manual
+=pod
-NAME
-----
+=encoding utf8
+
+=head1 NAME
tinyproxy - A light-weight HTTP proxy daemon
-SYNOPSIS
---------
+=head1 SYNOPSIS
-*tinyproxy* [-vdch]
+B<tinyproxy> [-vdch]
-DESCRIPTION
------------
+=head1 DESCRIPTION
-*tinyproxy* is a light-weight HTTP proxy daemon designed to consume a
+B<tinyproxy> is a light-weight HTTP proxy daemon designed to consume a
minimum amount of system resources. It listens on a given TCP port and
handles HTTP proxy requests. Designed from the ground up to be fast and
yet small, it is an ideal solution for use cases such as embedded
@@ -26,46 +22,66 @@ deployments where a full featured HTTP proxy is required, but the system
resources for a larger proxy are unavailable.
-OPTIONS
--------
+=head1 OPTIONS
+
+B<tinyproxy> accepts the following options:
+
+=over 4
+
+=item B<-c <config-file>>
-*tinyproxy* accepts the following options:
+Use an alternate configuration file.
-*-c <config-file>*::
- Use an alternate configuration file.
+=item B<-d>
-*-d*::
- Don't daemonize and stay in the foreground. Useful for debugging purposes.
+Don't daemonize and stay in the foreground. Useful for debugging purposes.
-*-h*::
- Display a short help screen of command line arguments and exit.
+=item B<-h>
-*-v*::
- Display version information and exit.
+Display a short help screen of command line arguments and exit.
+=item B<-v>
-SIGNALS
--------
+Display version information and exit.
+
+=back
+
+=head1 SIGNALS
In addition to command-line options, there are also several signals that
-can be sent to *tinyproxy* while it is running to generate debugging
+can be sent to B<tinyproxy> while it is running to generate debugging
information and to force certain events.
-*SIGHUP*::
- Force Tinyproxy to do a garbage collection on the current
- connections linked list. This is usually done automatically after a
- certain number of connections have been handled.
+=over 4
+
+=item B<SIGHUP>
+Force Tinyproxy to do a garbage collection on the current
+connections linked list. This is usually done automatically after a
+certain number of connections have been handled.
+(Daemon mode only)
-TEMPLATE FILES
---------------
+=item B<SIGUSR1>
+
+Force reload of config file and filter list.
+This is handy to update the configuration if Tinyproxy is running
+in foreground without dropping active connections.
+
+=back
+
+=head1 TEMPLATE FILES
There are two occasions when Tinyproxy delivers HTML pages to
the client on it's own right:
-. When an error occurred, a corresponding error page is returned.
-. When a request for the stathost is made, a page summarizing the
- connection statistics is returned. (See STATHOST below.)
+=over 4
+
+=item * When an error occurred, a corresponding error page is returned.
+
+=item * When a request for the stathost is made, a page summarizing the
+connection statistics is returned. (See STATHOST below.)
+
+=back
The layout of both error pages and the statistics page can be
controlled via configurable HTML template files that are plain
@@ -73,46 +89,60 @@ HTML files that additionally understand a few template
variables.
-TEMPLATE VARIABLES
-------------------
+=head1 TEMPLATE VARIABLES
There are several standard HTML variables that are available in every
template file:
-*request*::
- The full HTTP request line.
+=over 4
-*cause*::
- The abbreviated cause of the error condition.
+=item B<request>
-*clientip*::
- The IP address of the client making the request.
+The full HTTP request line.
-*clienthost*::
- The hostname of the client making the request.
+=item B<cause>
-*version*::
- The version of Tinyproxy.
+The abbreviated cause of the error condition.
-*package*::
- The package name. Presently, resolves to 'tinyproxy'.
+=item B<clientip>
-*date*::
- The current date/time in HTTP format.
+The IP address of the client making the request.
+
+=item B<clienthost>
+
+The hostname of the client making the request.
+
+=item B<version>
+
+The version of Tinyproxy.
+
+=item B<package>
+
+The package name. Presently, resolves to 'tinyproxy'.
+
+=item B<date>
+
+The current date/time in HTTP format.
+
+=back
In addition, almost all templates support:
-*detail*::
- A detailed, plain English explanation of the error and possible
- causes.
+=over 4
+
+=item B<detail>
+
+A detailed, plain English explanation of the error and possible
+causes.
+
+=back
When Tinyproxy finds a variable name enclosed in braces, e.g.
-"\{request}", then this is replaced by the value of the corresponding
+"{request}", then this is replaced by the value of the corresponding
variable before delivery of the page.
-STATHOST
---------
+=head1 STATHOST
Tinyproxy returns a HTML page with connection statistics when it
receives a HTTP request for a certain host -- the stathost. The
@@ -124,33 +154,29 @@ The stat file template can be changed at runtime through the
configuration variable `StatFile`.
-FILES
------
+=head1 FILES
`/etc/tinyproxy/tinyproxy.conf`, `/var/run/tinyproxy/tinyproxy.pid`, `/var/log/tinyproxy/tinyproxy.log`
-BUGS
-----
+=head1 BUGS
To report bugs in Tinyproxy, please visit
-<https://tinyproxy.github.io/[https://tinyproxy.github.io/]>.
+L<https://tinyproxy.github.io/>.
+
+=head1 SEE ALSO
-SEE ALSO
---------
-tinyproxy.conf(5)
+L<tinyproxy.conf(5)>
-AUTHOR
-------
+=head1 AUTHOR
This manpage was written by the Tinyproxy project team.
-COPYRIGHT
----------
+=head1 COPYRIGHT
-Copyright (c) 1998-2018 the Tinyproxy authors.
+Copyright (c) 1998-2020 the Tinyproxy authors.
This program is distributed under the terms of the GNU General Public
License version 2 or above. See the COPYING file for additional
diff --git a/docs/web/Makefile b/docs/web/Makefile
new file mode 100644
index 0000000..9b7c1ff
--- /dev/null
+++ b/docs/web/Makefile
@@ -0,0 +1,15 @@
+# test webpage with `python -m SimpleHTTPServer`
+
+all: index.html
+
+tp.html.conf: ../man5/tinyproxy.conf.txt
+ pod2html --noindex < $^ | awk -f podhtml-filter.awk > $@
+
+index.html: tp.html.head tp.html.conf tp.html.foot
+ cat $^ > $@
+
+clean:
+ rm tp.html.conf index.html *.tmp
+
+.PHONY: all clean
+
diff --git a/docs/web/podhtml-filter.awk b/docs/web/podhtml-filter.awk
new file mode 100644
index 0000000..4ea7892
--- /dev/null
+++ b/docs/web/podhtml-filter.awk
@@ -0,0 +1,5 @@
+BEGIN {i=0}
+/<\/{0,1}h1/ {if(!i)i=1; gsub("h1", "h4", $0);}
+#/<\/body>/ {i=0;}
+/BUGS/ {i=-1}
+{if(i==1) print;}
diff --git a/docs/web/stylesheets/stylesheet.css b/docs/web/stylesheets/stylesheet.css
new file mode 100644
index 0000000..eac0014
--- /dev/null
+++ b/docs/web/stylesheets/stylesheet.css
@@ -0,0 +1,426 @@
+/*******************************************************************************
+Slate Theme for GitHub Pages
+by Jason Costello, @jsncostello
+*******************************************************************************/
+
+@import url(github-light.css);
+
+/*******************************************************************************
+MeyerWeb Reset
+*******************************************************************************/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font: inherit;
+ vertical-align: baseline;
+}
+
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+ display: block;
+}
+
+ol, ul {
+ list-style: none;
+}
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+/*******************************************************************************
+Theme Styles
+*******************************************************************************/
+
+body {
+ box-sizing: border-box;
+ color:#373737;
+ background: #212121;
+ font-size: 16px;
+ font-family: 'Myriad Pro', Calibri, Helvetica, Arial, sans-serif;
+ line-height: 1.5;
+ -webkit-font-smoothing: antialiased;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ margin: 10px 0;
+ font-weight: 700;
+ color:#222222;
+ font-family: 'Lucida Grande', 'Calibri', Helvetica, Arial, sans-serif;
+ letter-spacing: -1px;
+}
+
+h1 {
+ font-size: 36px;
+ font-weight: 700;
+}
+
+h2 {
+ padding-bottom: 10px;
+ font-size: 32px;
+ background: url('../images/bg_hr.png') repeat-x bottom;
+}
+
+h3 {
+ font-size: 24px;
+}
+
+h4 {
+ font-size: 21px;
+}
+
+h5 {
+ font-size: 18px;
+}
+
+h6 {
+ font-size: 16px;
+}
+
+p {
+ margin: 10px 0 15px 0;
+}
+
+footer p {
+ color: #f2f2f2;
+}
+
+a {
+ text-decoration: none;
+ color: #007edf;
+ text-shadow: none;
+
+ transition: color 0.5s ease;
+ transition: text-shadow 0.5s ease;
+ -webkit-transition: color 0.5s ease;
+ -webkit-transition: text-shadow 0.5s ease;
+ -moz-transition: color 0.5s ease;
+ -moz-transition: text-shadow 0.5s ease;
+ -o-transition: color 0.5s ease;
+ -o-transition: text-shadow 0.5s ease;
+ -ms-transition: color 0.5s ease;
+ -ms-transition: text-shadow 0.5s ease;
+}
+
+a:hover, a:focus {text-decoration: underline;}
+
+footer a {
+ color: #F2F2F2;
+ text-decoration: underline;
+}
+
+em {
+ font-style: italic;
+}
+
+strong {
+ font-weight: bold;
+}
+
+img {
+ position: relative;
+ margin: 0 auto;
+ max-width: 739px;
+ padding: 5px;
+ margin: 10px 0 10px 0;
+ border: 1px solid #ebebeb;
+
+ box-shadow: 0 0 5px #ebebeb;
+ -webkit-box-shadow: 0 0 5px #ebebeb;
+ -moz-box-shadow: 0 0 5px #ebebeb;
+ -o-box-shadow: 0 0 5px #ebebeb;
+ -ms-box-shadow: 0 0 5px #ebebeb;
+}
+
+p img {
+ display: inline;
+ margin: 0;
+ padding: 0;
+ vertical-align: middle;
+ text-align: center;
+ border: none;
+}
+
+pre, code {
+ width: 100%;
+ color: #222;
+ background-color: #fff;
+
+ font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace;
+ font-size: 14px;
+
+ border-radius: 2px;
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+}
+
+pre {
+ width: 100%;
+ padding: 10px;
+ margin-bottom: 20px;
+ box-shadow: 0 0 10px rgba(0,0,0,.1);
+ overflow: auto;
+}
+
+code {
+ padding: 3px;
+ margin: 0 3px;
+ box-shadow: 0 0 10px rgba(0,0,0,.1);
+}
+
+pre code {
+ display: block;
+ box-shadow: none;
+}
+
+blockquote {
+ color: #666;
+ margin-bottom: 20px;
+ padding: 0 0 0 20px;
+ border-left: 3px solid #bbb;
+}
+
+
+ul, ol, dl {
+ margin-bottom: 15px
+}
+
+ul {
+ list-style-position: inside;
+ list-style: disc;
+ padding-left: 20px;
+}
+
+ol {
+ list-style-position: inside;
+ list-style: decimal;
+ padding-left: 20px;
+}
+
+dl dt {
+ font-weight: bold;
+}
+
+dl dd {
+ padding-left: 20px;
+/* font-style: italic; */
+}
+
+dl p {
+ padding-left: 20px;
+/* font-style: italic; */
+}
+
+hr {
+ height: 1px;
+ margin-bottom: 5px;
+ border: none;
+ background: url('../images/bg_hr.png') repeat-x center;
+}
+
+table {
+ border: 1px solid #373737;
+ margin-bottom: 20px;
+ text-align: left;
+ }
+
+th {
+ font-family: 'Lucida Grande', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ padding: 10px;
+ background: #373737;
+ color: #fff;
+ }
+
+td {
+ padding: 10px;
+ border: 1px solid #373737;
+ }
+
+form {
+ background: #f2f2f2;
+ padding: 20px;
+}
+
+/*******************************************************************************
+Full-Width Styles
+*******************************************************************************/
+
+.outer {
+ width: 100%;
+}
+
+.inner {
+ position: relative;
+ max-width: 640px;
+ padding: 20px 10px;
+ margin: 0 auto;
+}
+
+#forkme_banner {
+ display: block;
+ position: absolute;
+ top:0;
+ right: 10px;
+ z-index: 10;
+ padding: 10px 50px 10px 10px;
+ color: #fff;
+ background: url('../images/blacktocat.png') #0090ff no-repeat 95% 50%;
+ font-weight: 700;
+ box-shadow: 0 0 10px rgba(0,0,0,.5);
+ border-bottom-left-radius: 2px;
+ border-bottom-right-radius: 2px;
+}
+
+#header_wrap {
+ background: #212121;
+ background: -moz-linear-gradient(top, #373737, #212121);
+ background: -webkit-linear-gradient(top, #373737, #212121);
+ background: -ms-linear-gradient(top, #373737, #212121);
+ background: -o-linear-gradient(top, #373737, #212121);
+ background: linear-gradient(top, #373737, #212121);
+}
+
+#header_wrap .inner {
+ padding: 50px 10px 30px 10px;
+}
+
+#project_title {
+ margin: 0;
+ color: #fff;
+ font-size: 42px;
+ font-weight: 700;
+ text-shadow: #111 0px 0px 10px;
+}
+
+#project_tagline {
+ color: #fff;
+ font-size: 24px;
+ font-weight: 300;
+ background: none;
+ text-shadow: #111 0px 0px 10px;
+}
+
+#downloads {
+ position: absolute;
+ width: 210px;
+ z-index: 10;
+ bottom: -40px;
+ right: 0;
+ height: 70px;
+ background: url('../images/icon_download.png') no-repeat 0% 90%;
+}
+
+.zip_download_link {
+ display: block;
+ float: right;
+ width: 90px;
+ height:70px;
+ text-indent: -5000px;
+ overflow: hidden;
+ background: url(../images/sprite_download.png) no-repeat bottom left;
+}
+
+.tar_download_link {
+ display: block;
+ float: right;
+ width: 90px;
+ height:70px;
+ text-indent: -5000px;
+ overflow: hidden;
+ background: url(../images/sprite_download.png) no-repeat bottom right;
+ margin-left: 10px;
+}
+
+.zip_download_link:hover {
+ background: url(../images/sprite_download.png) no-repeat top left;
+}
+
+.tar_download_link:hover {
+ background: url(../images/sprite_download.png) no-repeat top right;
+}
+
+#main_content_wrap {
+ background: #f2f2f2;
+ border-top: 1px solid #111;
+ border-bottom: 1px solid #111;
+}
+
+#main_content {
+ padding-top: 40px;
+}
+
+#footer_wrap {
+ background: #212121;
+}
+
+
+
+/*******************************************************************************
+Small Device Styles
+*******************************************************************************/
+
+@media screen and (max-width: 480px) {
+ body {
+ font-size:14px;
+ }
+
+ #downloads {
+ display: none;
+ }
+
+ .inner {
+ min-width: 320px;
+ max-width: 480px;
+ }
+
+ #project_title {
+ font-size: 32px;
+ }
+
+ h1 {
+ font-size: 28px;
+ }
+
+ h2 {
+ font-size: 24px;
+ }
+
+ h3 {
+ font-size: 21px;
+ }
+
+ h4 {
+ font-size: 18px;
+ }
+
+ h5 {
+ font-size: 14px;
+ }
+
+ h6 {
+ font-size: 12px;
+ }
+
+ code, pre {
+ min-width: 320px;
+ max-width: 480px;
+ font-size: 11px;
+ }
+
+}
diff --git a/docs/web/tp.html.foot b/docs/web/tp.html.foot
new file mode 100644
index 0000000..d080bac
--- /dev/null
+++ b/docs/web/tp.html.foot
@@ -0,0 +1,21 @@
+<h2>
+<a id="support" class="anchor" href="#support" aria-hidden="true"><span class="octicon octicon-link"></span></a>Support</h2>
+
+<ul>
+<li>Feel free to report a new bug or suggest features via github issues.</li>
+<li>Tinyproxy developers hang out in #tinyproxy on irc.freenode.net.</li>
+</ul>
+ </section>
+ </div>
+
+ <!-- FOOTER -->
+ <div id="footer_wrap" class="outer">
+ <footer class="inner">
+ <p>Published with <a href="https://pages.github.com">GitHub Pages</a></p>
+ </footer>
+ </div>
+
+
+
+ </body>
+</html>
diff --git a/docs/web/tp.html.head b/docs/web/tp.html.head
new file mode 100644
index 0000000..6ce2b0b
--- /dev/null
+++ b/docs/web/tp.html.head
@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html>
+
+ <head>
+ <meta charset='utf-8'>
+ <meta http-equiv="X-UA-Compatible" content="chrome=1">
+ <meta name="description" content="Tinyproxy : lightweight http(s) proxy daemon">
+
+ <link rel="stylesheet" type="text/css" media="screen" href="stylesheets/stylesheet.css">
+
+ <title>Tinyproxy</title>
+ </head>
+
+ <body>
+
+ <!-- HEADER -->
+ <div id="header_wrap" class="outer">
+ <header class="inner">
+ <a id="forkme_banner" href="https://github.com/tinyproxy">View on GitHub</a>
+
+ <h1 id="project_title">Tinyproxy</h1>
+ <h2 id="project_tagline">lightweight http(s) proxy daemon</h2>
+
+ </header>
+ </div>
+
+ <!-- MAIN CONTENT -->
+ <div id="main_content_wrap" class="outer">
+ <section id="main_content" class="inner">
+ <h1>
+<a id="tinyproxy" class="anchor" href="#tinyproxy" aria-hidden="true"><span class="octicon octicon-link"></span></a>Tinyproxy</h1>
+
+<p>Tinyproxy is a light-weight HTTP/HTTPS proxy daemon for POSIX operating systems. Designed from the ground up to be fast and yet small, it is an ideal solution for use cases such as embedded deployments where a full featured HTTP proxy is required, but the system resources for a larger proxy are unavailable.</p>
+
+<p>Tinyproxy is distributed using the GNU GPL license (version 2 or above).</p>
+
+<h2>
+<a id="features" class="anchor" href="#features" aria-hidden="true"><span class="octicon octicon-link"></span></a>Features</h2>
+
+<p>Tinyproxy has a <strong>small footprint</strong> and requires very little in the way of system resources. The memory footprint tends to be around 2 MB with glibc, and the CPU load increases linearly with the number of simultaneous connections (depending on the speed of the connection). Thus, Tinyproxy can be run on an older machine, or on a network appliance such as a Linux-based broadband router, without any noticeable impact on performance.</p>
+
+<p>Tinyproxy requires only a <strong>minimal POSIX environment</strong> to build and operate. It can use additional libraries to add functionality though.</p>
+
+<p>Tinyproxy allows forwarding of <strong>HTTPS connections</strong> without modifying traffic in any way through the <code>CONNECT</code> method (see the <code>ConnectPort</code> directive).</p>
+
+<p>Tinyproxy supports being configured as a <strong>transparent proxy</strong>, so that a proxy can be used without requiring any client-side configuration. You can also use it as a <strong>reverse proxy</strong> front-end to your websites.</p>
+
+<p>Using the <code>AddHeader</code> directive, you can <strong>add/insert HTTP headers</strong> to outgoing traffic.</p>
+
+<p>If you're looking to build a custom web proxy, Tinyproxy is <strong>easy to modify</strong> to your custom needs. The source is straightforward, adhering to the KISS principle. As such, it can be used as a foundation for anything you may need a web proxy to do.</p>
+
+<p>Tinyproxy has <strong>privacy features</strong> which can let you configure which HTTP headers should be allowed through, and which should be blocked. This allows you to restrict both what data comes to your web browser from the HTTP server (e.g., cookies), and to restrict what data is allowed through from your web browser to the HTTP server (e.g., version information).</p>
+
+<p>Using the <strong>remote monitoring</strong> facility, you can access proxy statistics from afar, letting you know exactly how busy the proxy is.</p>
+
+<p>You can configure Tinyproxy to <strong>control access</strong> by only allowing requests from a certain subnet, or from a certain interface, thus ensuring that random, unauthorized people will not be using your proxy.</p>
+
+<p>With a bit of configuration (specifically, making Tinyproxy created files owned by a non-root user and running it on a port greater than 1024), Tinyproxy can be made to run without any special privileges, thus minimizing the chance of system compromise. Furthermore, it was designed with an eye towards preventing buffer overflows. The simplicity of the code ensures it remains easy to spot such bugs.</p>
+
+<h2>
+<a id="downloads" class="anchor" href="#downloads" aria-hidden="true"><span class="octicon octicon-link"></span></a>Downloads</h2>
+
+<ul>
+<li>On Red Hat Enterprise Linux, or its derivatives such as CentOS, install Tinyproxy from the EPEL repository by running yum install tinyproxy.</li>
+<li>On Fedora, install Tinyproxy by running yum install tinyproxy.</li>
+<li>On Debian and derived distributions, run apt-get install tinyproxy to install Tinyproxy.</li>
+<li>For openSUSE run: zypper in tinyproxy</li>
+<li>Arch users can install the Tinyproxy package from the community repository. Run pacman -S tinyproxy to install it.</li>
+<li>FreeBSD, OpenBSD or NetBSD users can use the pkg_add utility to install the tinyproxy package.</li>
+<li>Mac OS X users can check MacPorts to see if the Tinyproxy port there is recent enough.</li>
+</ul>
+
+<p>If you feel that the Tinyproxy binary package in your operating system is not recent, please contact the package maintainer for that particular operating system. If this fails, you can always compile the latest stable version from source code.</p>
+
+<p>We distribute Tinyproxy in source code form, and it has to be compiled in order to be used on your system. Please see the INSTALL file in the source code tree for build instructions. The current stable version of Tinyproxy is available on the <a href="https://github.com/tinyproxy/tinyproxy/releases">releases page</a>. The Tinyproxy NEWS file contains the release notes. You can verify the tarball using its PGP signature. You can also browse the older releases of Tinyproxy.</p>
+
+<p>We use Git as the version control system for the Tinyproxy source code repository. To get a copy of the Tinyproxy repository, use the command:</p>
+
+<p>git clone <a href="https://github.com/tinyproxy/tinyproxy.git">https://github.com/tinyproxy/tinyproxy.git</a></p>
+
+<h2>
+<a id="documentation" class="anchor" href="#documentation" aria-hidden="true"><span class="octicon octicon-link"></span></a>Documentation</h2>