#ifndef PROJECT_H_INCLUDED
#define PROJECT_H_INCLUDED
/** Version string. */
-#define PROJECT_H_VERSION "$Id: project.h,v 1.187 2012/10/21 12:53:33 fabiankeil Exp $"
+#define PROJECT_H_VERSION "$Id: project.h,v 1.207 2014/07/25 11:55:11 fabiankeil Exp $"
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/project.h,v $
* project. Does not define any variables or functions
* (though it does declare some macros).
*
- * Copyright : Written by and Copyright (C) 2001-2012 the
+ * Copyright : Written by and Copyright (C) 2001-2014 the
* Privoxy team. http://www.privoxy.org/
*
* Based on the Internet Junkbuster originally written
#endif
-#ifdef __cplusplus
-extern "C" {
-#endif
-
#ifdef _WIN32
typedef SOCKET jb_socket;
* A standard error code. This should be JB_ERR_OK or one of the JB_ERR_xxx
* series of errors.
*/
-typedef int jb_err;
+enum privoxy_err
+{
+ JB_ERR_OK = 0, /**< Success, no error */
+ JB_ERR_MEMORY = 1, /**< Out of memory */
+ JB_ERR_CGI_PARAMS = 2, /**< Missing or corrupt CGI parameters */
+ JB_ERR_FILE = 3, /**< Error opening, reading or writing a file */
+ JB_ERR_PARSE = 4, /**< Error parsing file */
+ JB_ERR_MODIFIED = 5, /**< File has been modified outside of the
+ CGI actions editor. */
+ JB_ERR_COMPRESS = 6 /**< Error on decompression */
+};
-#define JB_ERR_OK 0 /**< Success, no error */
-#define JB_ERR_MEMORY 1 /**< Out of memory */
-#define JB_ERR_CGI_PARAMS 2 /**< Missing or corrupt CGI parameters */
-#define JB_ERR_FILE 3 /**< Error opening, reading or writing a file */
-#define JB_ERR_PARSE 4 /**< Error parsing file */
-#define JB_ERR_MODIFIED 5 /**< File has been modified outside of the
- CGI actions editor. */
-#define JB_ERR_COMPRESS 6 /**< Error on decompression */
+typedef enum privoxy_err jb_err;
/**
* This macro is used to free a pointer that may be NULL.
*/
#define HOSTENT_BUFFER_SIZE 2048
-/**
- * Do not use. Originally this was so that you can
- * say "while (FOREVER) { ...do something... }".
- * However, this gives a warning with some compilers (e.g. VC++).
- * Instead, use "for (;;) { ...do something... }".
- */
-#define FOREVER 1
-
/**
* Default TCP/IP address to listen on, as a string.
* Set to "127.0.0.1:8118".
*/
struct http_response
{
- enum crunch_reason crunch_reason; /**< Why the response was generated in the first place. */
char *status; /**< HTTP status (string). */
struct list headers[1]; /**< List of header lines. */
char *head; /**< Formatted http response head. */
size_t content_length; /**< Length of body, REQUIRED if binary body. */
int is_static; /**< Nonzero if the content will never change and
should be cached by the browser (e.g. images). */
+ enum crunch_reason crunch_reason; /**< Why the response was generated in the first place. */
};
-/**
- * A URL or a tag pattern.
- */
struct url_spec
{
- /** The string which was parsed to produce this url_spec.
- Used for debugging or display only. */
- char *spec;
-
#ifdef FEATURE_EXTENDED_HOST_PATTERNS
regex_t *host_regex;/**< Regex for host matching */
#else
char *port_list; /**< List of acceptable ports, or NULL to match all ports */
regex_t *preg; /**< Regex for matching path part */
- regex_t *tag_regex; /**< Regex for matching tags */
};
/**
- * If you declare a static url_spec, this is the value to initialize it to zero.
+ * A URL or a tag pattern.
*/
-#ifndef FEATURE_EXTENDED_HOST_PATTERNS
-#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, 0, 0, NULL, NULL, NULL }
-#else
-#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, NULL, NULL }
-#endif /* def FEATURE_EXTENDED_HOST_PATTERNS */
+struct pattern_spec
+{
+ /** The string which was parsed to produce this pattern_spec.
+ Used for debugging or display only. */
+ char *spec;
+
+ union
+ {
+ struct url_spec url_spec;
+ regex_t *tag_regex;
+ } pattern;
+
+ unsigned int flags; /**< Bitmap with various pattern properties. */
+};
/**
* Constant for host part matching in URLs. If set, indicates that the start of
*/
#define ANCHOR_RIGHT 2
+/** Pattern spec bitmap: It's an URL pattern. */
+#define PATTERN_SPEC_URL_PATTERN 0x00000001UL
+
+/** Pattern spec bitmap: It's a TAG pattern. */
+#define PATTERN_SPEC_TAG_PATTERN 0x00000002UL
+
+/** Pattern spec bitmap: It's a NO-REQUEST-TAG pattern. */
+#define PATTERN_SPEC_NO_REQUEST_TAG_PATTERN 0x00000004UL
+
+/** Pattern spec bitmap: It's a NO-RESPONSE-TAG pattern. */
+#define PATTERN_SPEC_NO_RESPONSE_TAG_PATTERN 0x00000008UL
/**
* An I/O buffer. Holds a string which can be appended to, and can have data
#define IOB_PEEK(IOB) ((IOB->cur > IOB->eod) ? (IOB->eod - IOB->cur) : 0)
-/**
- * Remove any data in the I/O buffer associated with the passed
- * client_state pointer.
- */
-#define IOB_RESET(IOB) do {free(IOB->buf); memset(IOB, '\0', sizeof(*IOB));} while (0)
-
/* Bits for csp->content_type bitmask: */
#define CT_TEXT 0x0001U /**< Suitable for pcrs filtering. */
#define CT_GIF 0x0002U /**< Suitable for GIF filtering. */
#define ACTION_OVERWRITE_LAST_MODIFIED 0x02000000UL
/** Action bitmap: Replace or block Accept-Language header */
#define ACTION_HIDE_ACCEPT_LANGUAGE 0x04000000UL
+/** Action bitmap: Limit the cookie lifetime */
+#define ACTION_LIMIT_COOKIE_LIFETIME 0x08000000UL
/** Action string index: How to deanimate GIFs */
#define ACTION_STRING_BLOCK 16
/** Action string index: what to do with the "X-Forwarded-For" header. */
#define ACTION_STRING_CHANGE_X_FORWARDED_FOR 17
+/** Action string index: how many minutes cookies should be valid. */
+#define ACTION_STRING_LIMIT_COOKIE_LIFETIME 18
/** Number of string actions. */
-#define ACTION_STRING_COUNT 18
+#define ACTION_STRING_COUNT 19
/* To make the ugly hack in sed easier to understand */
/** Index into current_action_spec::multi[] for server-header tags to apply. */
#define ACTION_MULTI_SERVER_HEADER_TAGGER 5
/** Number of multi-string actions. */
-#define ACTION_MULTI_COUNT 6
+#define ACTION_MULTI_EXTERNAL_FILTER 6
+/** Number of multi-string actions. */
+#define ACTION_MULTI_COUNT 7
/**
unsigned long add; /**< Actions to add. A bit set to "1" means add action. */
/**
- * Paramaters for those actions that require them.
+ * Parameters for those actions that require them.
* Each entry is valid if & only if the corresponding entry in "flags" is
* set.
*/
*/
struct url_actions
{
- struct url_spec url[1]; /**< The URL or tag pattern. */
+ struct pattern_spec url[1]; /**< The URL or tag pattern. */
struct action_spec *action; /**< Action settings that might be shared with
the list entry before or after the current
SOCKS_4A = 41,
/**< SOCKS 5 with hostnames, DNS resolution is done by the SOCKS server */
SOCKS_5 = 50,
+ /**< Like SOCKS5, but uses non-standard Tor extensions (currently only optimistic data) */
+ SOCKS_5T,
};
/*
*/
#define CSP_FLAG_TOGGLED_ON 0x20U
-/**
- * Flag for csp->flags: Set if we answered the request ourselve.
- */
-#define CSP_FLAG_CRUNCHED 0x40U
-
/**
* Flag for csp->flags: Set if an acceptable Connection header
* has already been set by the client.
*/
#define CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE 0x00001000U
-#ifdef FEATURE_CONNECTION_KEEP_ALIVE
/**
* Flag for csp->flags: Set if the server specified the
* content length.
*/
#define CSP_FLAG_SERVER_KEEP_ALIVE_TIMEOUT_SET 0x00020000U
-#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
-
/**
* Flag for csp->flags: Set if we think we can't reuse
* the server socket. XXX: It's also set after sabotaging
*/
#define CSP_FLAG_PIPELINED_REQUEST_WAITING 0x00800000U
+/**
+ * Flag for csp->flags: Set if the client body is chunk-encoded
+ */
+#define CSP_FLAG_CHUNKED_CLIENT_BODY 0x01000000U
+
+/**
+ * Flag for csp->flags: Set if the client set the Expect header
+ */
+#define CSP_FLAG_UNSUPPORTED_CLIENT_EXPECTATION 0x02000000U
+
+/**
+ * Flag for csp->flags: Set if we answered the request ourselve.
+ */
+#define CSP_FLAG_CRUNCHED 0x04000000U
+
+
/*
* Flags for use in return codes of child processes
*/
* Maximum number of actions/filter files. This limit is arbitrary - it's just used
* to size an array.
*/
-#define MAX_AF_FILES 10
+#define MAX_AF_FILES 30
/**
* Maximum number of sockets to listen to. This limit is arbitrary - it's just used
/** socket to talk to client (web browser) */
jb_socket cfd;
+ /** Number of requests received on the client socket. */
+ unsigned int requests_received_total;
+
/** current connection to the server (may go through a proxy) */
struct reusable_connection server_connection;
/** Length after content modification. */
unsigned long long content_length;
-#ifdef FEATURE_CONNECTION_KEEP_ALIVE
/* XXX: is this the right location? */
/** Expected length of content after which we
* should stop reading from the client socket.
*/
unsigned long long expected_client_content_length;
-#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
#ifdef FEATURE_TRUST
*/
struct block_spec
{
- struct url_spec url[1]; /**< The URL pattern */
- int reject; /**< FIXME: Please document this! */
- struct block_spec *next; /**< Next entry in linked list */
+ struct pattern_spec url[1]; /**< The URL pattern */
+ int reject; /**< FIXME: Please document this! */
+ struct block_spec *next; /**< Next entry in linked list */
};
/**
struct forward_spec
{
/** URL pattern that this forward_spec is for. */
- struct url_spec url[1];
+ struct pattern_spec url[1];
/** Connection type. Must be SOCKS_NONE, SOCKS_4, SOCKS_4A or SOCKS_5. */
enum forwarder_type type;
};
-/**
- * Initializer for a static struct forward_spec.
- */
-#define FORWARD_SPEC_INITIALIZER { { URL_SPEC_INITIALIZER }, 0, NULL, 0, NULL, 0, NULL }
-
/* Supported filter types */
enum filter_type
{
FT_SERVER_HEADER_FILTER = 2,
FT_CLIENT_HEADER_TAGGER = 3,
FT_SERVER_HEADER_TAGGER = 4,
+#ifdef FEATURE_EXTERNAL_FILTERS
+ FT_EXTERNAL_CONTENT_FILTER = 5,
+#endif
FT_INVALID_FILTER = 42,
};
+
+#ifdef FEATURE_EXTERNAL_FILTERS
+#define MAX_FILTER_TYPES 6
+#else
#define MAX_FILTER_TYPES 5
+#endif
/**
* This struct represents one filter (one block) from
/** configuration_spec::feature_flags: Pipelined requests are served instead of being discarded. */
#define RUNTIME_FEATURE_TOLERATE_PIPELINING 2048U
+/** configuration_spec::feature_flags: Proxy authentication headers are forwarded instead of removed. */
+#define RUNTIME_FEATURE_FORWARD_PROXY_AUTHENTICATION_HEADERS 4096U
+
/**
* Data loaded from the configuration file.
*
/** Nonzero to enable multithreading. */
int multi_threaded;
- /**
- * Bitmask of features that can be enabled/disabled through the config
- * file. Currently defined bits:
- *
- * - RUNTIME_FEATURE_CGI_EDIT_ACTIONS
- * - RUNTIME_FEATURE_CGI_TOGGLE
- * - RUNTIME_FEATURE_HTTP_TOGGLE
- * - RUNTIME_FEATURE_SPLIT_LARGE_FORMS
- * - RUNTIME_FEATURE_ACCEPT_INTERCEPTED_REQUESTS
- * - RUNTIME_FEATURE_ENFORCE_BLOCKS
- * - RUNTIME_FEATURE_CGI_CRUNCHING
- * - RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE
- * - RUNTIME_FEATURE_CONNECTION_SHARING
- * - RUNTIME_FEATURE_EMPTY_DOC_RETURNS_OK
- */
+ /** Bitmask of features that can be controlled through the config file. */
unsigned feature_flags;
/** The log file name. */
/** The directory for customized CGI templates. */
const char *templdir;
+#ifdef FEATURE_EXTERNAL_FILTERS
+ /** The template used to create temporary files. */
+ const char *temporary_directory;
+#endif
+
/** The log file directory. */
const char *logdir;
struct list trust_info[1];
/** FIXME: DOCME: Document this. */
- struct url_spec *trust_list[MAX_TRUSTED_REFERRERS];
+ struct pattern_spec *trust_list[MAX_TRUSTED_REFERRERS];
#endif /* def FEATURE_TRUST */
*/
#define CGI_PREFIX "http://" CGI_SITE_2_HOST CGI_SITE_2_PATH "/"
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
#endif /* ndef PROJECT_H_INCLUDED */
/*