2008-05-24 16:05:49 +08:00
|
|
|
/* tinyproxy - A fast light-weight HTTP proxy
|
|
|
|
* Copyright (C) 2004 Robert James Kaes <rjkaes@users.sourceforge.net>
|
2009-12-22 20:20:36 +08:00
|
|
|
* Copyright (C) 2009 Michael Adam <obnox@samba.org>
|
2004-08-14 04:19:50 +08:00
|
|
|
*
|
2008-05-24 16:05:49 +08:00
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
2004-08-14 04:19:50 +08:00
|
|
|
*
|
2008-05-24 16:05:49 +08:00
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
2004-08-14 04:19:50 +08:00
|
|
|
*
|
2008-05-24 16:05:49 +08:00
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
2004-08-14 04:19:50 +08:00
|
|
|
*/
|
|
|
|
|
2009-09-21 12:11:59 +08:00
|
|
|
/* See 'conf.c' for detailed information. */
|
2008-05-24 16:05:49 +08:00
|
|
|
|
2009-09-21 12:11:59 +08:00
|
|
|
#ifndef TINYPROXY_CONF_H
|
|
|
|
#define TINYPROXY_CONF_H
|
2004-08-14 04:19:50 +08:00
|
|
|
|
2009-12-08 05:23:31 +08:00
|
|
|
#include "hashmap.h"
|
|
|
|
#include "vector.h"
|
|
|
|
|
2010-01-09 00:35:17 +08:00
|
|
|
/*
|
|
|
|
* Stores a HTTP header created using the AddHeader directive.
|
|
|
|
*/
|
|
|
|
typedef struct {
|
|
|
|
char *name;
|
|
|
|
char *value;
|
|
|
|
} http_header_t;
|
|
|
|
|
2009-12-08 05:23:31 +08:00
|
|
|
/*
|
|
|
|
* Hold all the configuration time information.
|
|
|
|
*/
|
|
|
|
struct config_s {
|
2017-11-16 20:04:37 +08:00
|
|
|
vector_t basicauth_list;
|
2009-12-08 05:23:31 +08:00
|
|
|
char *logf_name;
|
|
|
|
unsigned int syslog; /* boolean */
|
2010-01-25 15:36:58 +08:00
|
|
|
unsigned int port;
|
2009-12-08 05:23:31 +08:00
|
|
|
char *stathost;
|
|
|
|
unsigned int quit; /* boolean */
|
simplify codebase by using one thread/conn, instead of preforked procs
the existing codebase used an elaborate and complex approach for
its parallelism:
5 different config file options, namely
- MaxClients
- MinSpareServers
- MaxSpareServers
- StartServers
- MaxRequestsPerChild
were used to steer how (and how many) parallel processes tinyproxy
would spin up at start, how many processes at each point needed to
be idle, etc.
it seems all preforked processes would listen on the server port
and compete with each other about who would get assigned the new
incoming connections.
since some data needs to be shared across those processes, a half-
baked "shared memory" implementation was provided for this purpose.
that implementation used to use files in the filesystem, and since
it had a big FIXME comment, the author was well aware of how hackish
that approach was.
this entire complexity is now removed. the main thread enters
a loop which polls on the listening fds, then spins up a new
thread per connection, until the maximum number of connections
(MaxClients) is hit. this is the only of the 5 config options
left after this cleanup. since threads share the same address space,
the code necessary for shared memory access has been removed.
this means that the other 4 mentioned config option will now
produce a parse error, when encountered.
currently each thread uses a hardcoded default of 256KB per thread
for the thread stack size, which is quite lavish and should be
sufficient for even the worst C libraries, but people may want
to tweak this value to the bare minimum, thus we may provide a new
config option for this purpose in the future.
i suspect that on heavily optimized C libraries such a musl, a
stack size of 8-16 KB per thread could be sufficient.
since the existing list implementation in vector.c did not provide
a way to remove a single item from an existing list, i added my
own list implementation from my libulz library which offers this
functionality, rather than trying to add an ad-hoc, and perhaps
buggy implementation to the vector_t list code. the sblist
code is contained in an 80 line C file and as simple as it can get,
while offering good performance and is proven bugfree due to years
of use in other projects.
2018-12-17 08:23:09 +08:00
|
|
|
unsigned int maxclients;
|
2009-12-08 05:23:31 +08:00
|
|
|
char *user;
|
|
|
|
char *group;
|
2013-11-07 18:00:19 +08:00
|
|
|
vector_t listen_addrs;
|
2009-12-08 05:23:31 +08:00
|
|
|
#ifdef FILTER_ENABLE
|
|
|
|
char *filter;
|
|
|
|
unsigned int filter_url; /* boolean */
|
|
|
|
unsigned int filter_extended; /* boolean */
|
|
|
|
unsigned int filter_casesensitive; /* boolean */
|
|
|
|
#endif /* FILTER_ENABLE */
|
|
|
|
#ifdef XTINYPROXY_ENABLE
|
|
|
|
unsigned int add_xtinyproxy; /* boolean */
|
|
|
|
#endif
|
|
|
|
#ifdef REVERSE_SUPPORT
|
|
|
|
struct reversepath *reversepath_list;
|
|
|
|
unsigned int reverseonly; /* boolean */
|
|
|
|
unsigned int reversemagic; /* boolean */
|
|
|
|
char *reversebaseurl;
|
|
|
|
#endif
|
|
|
|
#ifdef UPSTREAM_SUPPORT
|
|
|
|
struct upstream *upstream_list;
|
|
|
|
#endif /* UPSTREAM_SUPPORT */
|
|
|
|
char *pidpath;
|
|
|
|
unsigned int idletimeout;
|
|
|
|
char *bind_address;
|
|
|
|
unsigned int bindsame;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The configured name to use in the HTTP "Via" header field.
|
|
|
|
*/
|
|
|
|
char *via_proxy_name;
|
|
|
|
|
|
|
|
unsigned int disable_viaheader; /* boolean */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Error page support. Map error numbers to file paths.
|
|
|
|
*/
|
|
|
|
hashmap_t errorpages;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Error page to be displayed if appropriate page cannot be located
|
|
|
|
* in the errorpages structure.
|
|
|
|
*/
|
|
|
|
char *errorpage_undef;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The HTML statistics page.
|
|
|
|
*/
|
|
|
|
char *statpage;
|
|
|
|
|
|
|
|
vector_t access_list;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Store the list of port allowed by CONNECT.
|
|
|
|
*/
|
|
|
|
vector_t connect_ports;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Map of headers which should be let through when the
|
|
|
|
* anonymous feature is turned on.
|
|
|
|
*/
|
|
|
|
hashmap_t anonymous_map;
|
2010-01-09 00:35:17 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Extra headers to be added to outgoing HTTP requests.
|
|
|
|
*/
|
|
|
|
vector_t add_headers;
|
2009-12-08 05:23:31 +08:00
|
|
|
};
|
|
|
|
|
2020-01-16 00:57:00 +08:00
|
|
|
extern int reload_config_file (const char *config_fname, struct config_s *conf);
|
2004-08-14 04:19:50 +08:00
|
|
|
|
2010-06-01 10:24:25 +08:00
|
|
|
int config_compile_regex (void);
|
|
|
|
|
2004-08-14 04:19:50 +08:00
|
|
|
#endif
|