#ifndef PROJECT_H_INCLUDED
#define PROJECT_H_INCLUDED
/** Version string. */
-#define PROJECT_H_VERSION "$Id: project.h,v 1.153 2009/11/27 13:46:47 fabiankeil Exp $"
+#define PROJECT_H_VERSION "$Id: project.h,v 1.195 2012/12/07 12:45:20 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-2009 the
+ * Copyright : Written by and Copyright (C) 2001-2012 the
* Privoxy team. http://www.privoxy.org/
*
* Based on the Internet Junkbuster originally written
/* Needed for pcre choice */
#include "config.h"
-#ifdef HAVE_RFC2553
/* Need for struct sockaddr_storage */
-#include <sys/socket.h>
+#ifdef HAVE_RFC2553
+# ifndef _WIN32
+# include <netdb.h>
+# include <sys/socket.h>
+# else
+# include <stdint.h>
+# include <winsock2.h>
+# include <ws2tcpip.h>
+ typedef unsigned short in_port_t;
+# endif
#endif
#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
+#define JB_ERR_MODIFIED 5 /**< File has been modified outside of the
CGI actions editor. */
#define JB_ERR_COMPRESS 6 /**< Error on decompression */
/**
- * Fix a problem with Solaris. There should be no effect on other
- * platforms.
- *
- * Solaris's isspace() is a macro which uses it's argument directly
- * as an array index. Therefore we need to make sure that high-bit
- * characters generate +ve values, and ideally we also want to make
- * the argument match the declared parameter type of "int".
- *
+ * Macro definitions for platforms where isspace() and friends
+ * are macros that use their argument directly as an array index
+ * and thus better be positive. Supposedly that's the case on
+ * some unspecified Solaris versions.
* Note: Remember to #include <ctype.h> if you use these macros.
*/
-#define ijb_toupper(__X) toupper((int)(unsigned char)(__X))
-#define ijb_tolower(__X) tolower((int)(unsigned char)(__X))
-#define ijb_isspace(__X) isspace((int)(unsigned char)(__X))
+#define privoxy_isdigit(__X) isdigit((int)(unsigned char)(__X))
+#define privoxy_isupper(__X) isupper((int)(unsigned char)(__X))
+#define privoxy_toupper(__X) toupper((int)(unsigned char)(__X))
+#define privoxy_tolower(__X) tolower((int)(unsigned char)(__X))
+#define privoxy_isspace(__X) isspace((int)(unsigned char)(__X))
/**
* Use for statically allocated buffers if you have no other choice.
* Buffer size for capturing struct hostent data in the
* gethostby(name|addr)_r library calls. Since we don't
* loop over gethostbyname_r, the buffer must be sufficient
- * to accomodate multiple IN A RRs, as used in DNS round robin
+ * to accommodate multiple IN A RRs, as used in DNS round robin
* load balancing. W3C's wwwlib uses 1K, so that should be
* good enough for us, too.
*/
* your own code.
*/
char *str;
-
+
/** Next entry in the linked list, or NULL if no more. */
struct list_entry *next;
};
* the requested resource. Mostly ordered the way they are checked
* for in chat().
*/
-#define RSP_REASON_UNSUPPORTED 1
-#define RSP_REASON_BLOCKED 2
-#define RSP_REASON_UNTRUSTED 3
-#define RSP_REASON_REDIRECTED 4
-#define RSP_REASON_CGI_CALL 5
-#define RSP_REASON_NO_SUCH_DOMAIN 6
-#define RSP_REASON_FORWARDING_FAILED 7
-#define RSP_REASON_CONNECT_FAILED 8
-#define RSP_REASON_OUT_OF_MEMORY 9
-#define RSP_REASON_INTERNAL_ERROR 10
-#define RSP_REASON_CONNECTION_TIMEOUT 11
-#define RSP_REASON_NO_SERVER_DATA 12
+enum crunch_reason
+{
+ UNSUPPORTED,
+ BLOCKED,
+ UNTRUSTED,
+ REDIRECTED,
+ CGI_CALL,
+ NO_SUCH_DOMAIN,
+ FORWARDING_FAILED,
+ CONNECT_FAILED,
+ OUT_OF_MEMORY,
+ INTERNAL_ERROR,
+ CONNECTION_TIMEOUT,
+ NO_SERVER_DATA
+};
/**
* Response generated by CGI, blocker, or error handler
*/
struct http_response
{
- char *status; /**< HTTP status (string). */
- struct list headers[1]; /**< List of header lines. */
- char *head; /**< Formatted http response head. */
- size_t head_length; /**< Length of http response head. */
- char *body; /**< HTTP document body. */
- 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). */
- int reason; /**< Why the response was generated in the first place. */
+ 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 head_length; /**< Length of http response head. */
+ char *body; /**< HTTP document body. */
+ 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). */
};
/**
/**
* Return the number of bytes in the I/O buffer associated with the passed
- * client_state pointer.
- * May be zero.
+ * I/O buffer. May be zero.
*/
-#define IOB_PEEK(CSP) ((CSP->iob->cur > CSP->iob->eod) ? (CSP->iob->eod - CSP->iob->cur) : 0)
-
+#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(CSP) if(CSP->iob->buf) free(CSP->iob->buf); memset(CSP->iob, '\0', sizeof(CSP->iob));
/* Bits for csp->content_type bitmask: */
#define CT_TEXT 0x0001U /**< Suitable for pcrs filtering. */
/** Action bitmap: Prevent compression. */
#define ACTION_NO_COMPRESSION 0x00000400UL
/** Action bitmap: Change cookies to session only cookies. */
-#define ACTION_NO_COOKIE_KEEP 0x00000800UL
-/** Action bitmap: Block rending cookies. */
-#define ACTION_NO_COOKIE_READ 0x00001000UL
-/** Action bitmap: Block setting cookies. */
-#define ACTION_NO_COOKIE_SET 0x00002000UL
+#define ACTION_SESSION_COOKIES_ONLY 0x00000800UL
+/** Action bitmap: Block cookies coming from the client. */
+#define ACTION_CRUNCH_OUTGOING_COOKIES 0x00001000UL
+/** Action bitmap: Block cookies coming from the server. */
+#define ACTION_CRUNCH_INCOMING_COOKIES 0x00002000UL
/** Action bitmap: Override the forward settings in the config file */
#define ACTION_FORWARD_OVERRIDE 0x00004000UL
/** Action bitmap: Block as empty document */
#define ACTION_FORCE_TEXT_MODE 0x00400000UL
/** Action bitmap: Enable text mode by force */
#define ACTION_CRUNCH_IF_NONE_MATCH 0x00800000UL
-/** Action bitmap: Enable content-dispostion crunching */
+/** Action bitmap: Enable content-disposition crunching */
#define ACTION_HIDE_CONTENT_DISPOSITION 0x01000000UL
/** Action bitmap: Replace or block Last-Modified header */
#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_LANGUAGE 8
/** Action string index: Replacement for the "Content-Type:" header*/
#define ACTION_STRING_CONTENT_TYPE 9
-/** Action string index: Replacement for the "content-dispostion:" header*/
+/** Action string index: Replacement for the "content-disposition:" header*/
#define ACTION_STRING_CONTENT_DISPOSITION 10
/** Action string index: Replacement for the "If-Modified-Since:" header*/
#define ACTION_STRING_IF_MODIFIED_SINCE 11
#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 */
struct url_actions *next; /**< Next action section in file, or NULL. */
};
+enum forwarder_type {
+ /**< Don't use a SOCKS server */
+ SOCKS_NONE = 0,
+ /**< original SOCKS 4 protocol */
+ SOCKS_4 = 40,
+ /**< SOCKS 4A, DNS resolution is done by the SOCKS server */
+ 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,
+};
/*
* Structure to hold the server socket and the information
* connection will no longer be reused.
*/
unsigned int keep_alive_timeout;
+ /*
+ * Number of requests that were sent to this connection.
+ * This is currently only for debugging purposes.
+ */
+ unsigned int requests_sent_total;
char *host;
int port;
- int forwarder_type;
+ enum forwarder_type forwarder_type;
char *gateway_host;
int gateway_port;
char *forward_host;
/*
* Flags for use in csp->flags
*/
-
+
/**
* Flag for csp->flags: Set if this client is processing data.
* Cleared when the thread associated with this structure dies.
*/
#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_CONTENT_LENGTH_SET 0x00002000U
/**
- * Flag for csp->flags: Set if we know the content lenght,
+ * Flag for csp->flags: Set if we know the content length,
* either because the server set it, or we figured it out
* on our own.
*/
*/
#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.
+ * the server socket. XXX: It's also set after sabotaging
+ * pipelining attempts which is somewhat inconsistent with
+ * the name.
*/
#define CSP_FLAG_SERVER_SOCKET_TAINTED 0x00040000U
*/
#define CSP_FLAG_REUSED_CLIENT_CONNECTION 0x00100000U
+/**
+ * Flag for csp->flags: Set if the supports deflate compression.
+ */
+#define CSP_FLAG_CLIENT_SUPPORTS_DEFLATE 0x00200000U
+
+/**
+ * Flag for csp->flags: Set if the content has been deflated by Privoxy
+ */
+#define CSP_FLAG_BUFFERED_CONTENT_DEFLATED 0x00400000U
+
+/**
+ * Flag for csp->flags: Set if we already read (parts of)
+ * a pipelined request in which case the client obviously
+ * isn't done talking.
+ */
+#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
+
+
/*
* 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
+ * to size an array.
+ */
+#define MAX_LISTENING_SOCKETS 10
/**
* The state of a Privoxy processing thread.
/** 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;
*/
struct forward_spec * fwd;
- /** An I/O buffer used for buffering data read from the network */
+ /** An I/O buffer used for buffering data read from the server */
+ /* XXX: should be renamed to server_iob */
struct iob iob[1];
+ /** An I/O buffer used for buffering data read from the client */
+ struct iob client_iob[1];
+
/** List of all headers for this request */
struct list headers[1];
/** 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
* or NULL. Currently only used for socks errors.
*/
char *error_message;
-
- /** Next thread in linked list. Only read or modify from the main thread! */
- struct client_state *next;
};
+/**
+ * List of client states so the main thread can keep
+ * track of them and garbage collect their resources.
+ */
+struct client_states
+{
+ struct client_states *next;
+ struct client_state csp;
+};
/**
* A function to add a header
* Read-only once the structure has been created.
*/
time_t lastmodified;
-
+
/**
* The full filename.
*/
#endif /* def FEATURE_TRUST */
-
-#define SOCKS_NONE 0 /**< Don't use a SOCKS server */
-#define SOCKS_4 40 /**< original SOCKS 4 protocol */
-#define SOCKS_4A 41 /**< as modified for hosts w/o external DNS */
-#define SOCKS_5 50 /**< as modified for hosts w/o external DNS */
-
-
/**
* How to forward a connection to a parent proxy.
*/
struct url_spec url[1];
/** Connection type. Must be SOCKS_NONE, SOCKS_4, SOCKS_4A or SOCKS_5. */
- int type;
+ enum forwarder_type type;
/** SOCKS server hostname. Only valid if "type" is SOCKS_4 or SOCKS_4A. */
char *gateway_host;
#define FORWARD_SPEC_INITIALIZER { { URL_SPEC_INITIALIZER }, 0, NULL, 0, NULL, 0, NULL }
/* Supported filter types */
-#define FT_CONTENT_FILTER 0
-#define FT_CLIENT_HEADER_FILTER 1
-#define FT_SERVER_HEADER_FILTER 2
-#define FT_CLIENT_HEADER_TAGGER 3
-#define FT_SERVER_HEADER_TAGGER 4
-
+enum filter_type
+{
+ FT_CONTENT_FILTER = 0,
+ FT_CLIENT_HEADER_FILTER = 1,
+ FT_SERVER_HEADER_FILTER = 2,
+ FT_CLIENT_HEADER_TAGGER = 3,
+ FT_SERVER_HEADER_TAGGER = 4,
+ FT_INVALID_FILTER = 42,
+};
#define MAX_FILTER_TYPES 5
/**
char *description; /**< Description from FILTER: statement in re_filterfile. */
struct list patterns[1]; /**< The patterns from the re_filterfile. */
pcrs_job *joblist; /**< The resulting compiled pcrs_jobs. */
- int type; /**< Filter type (content, client-header, server-header). */
+ enum filter_type type; /**< Filter type (content, client-header, server-header). */
int dynamic; /**< Set to one if the pattern might contain variables
and has to be recompiled for every request. */
struct re_filterfile_spec *next; /**< The pointer for chaining. */
/** configuration_spec::feature_flags: Pages blocked with +handle-as-empty-doc get a return status of 200 OK. */
#define RUNTIME_FEATURE_EMPTY_DOC_RETURNS_OK 512U
+/** configuration_spec::feature_flags: Buffered content is sent compressed if the client supports it. */
+#define RUNTIME_FEATURE_COMPRESSION 1024U
+
+/** 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.
*
{
/** What to log */
int debug;
-
+
/** Nonzero to enable multithreading. */
int multi_threaded;
/** The short names of the pcre filter files. */
const char *re_filterfile_short[MAX_AF_FILES];
+ /**< List of ordered client header names. */
+ struct list ordered_client_headers[1];
+
/** The hostname to show on CGI pages, or NULL to use the real one. */
const char *hostname;
- /** IP address to bind to. Defaults to HADDR_DEFAULT == 127.0.0.1. */
- const char *haddr;
+ /** IP addresses to bind to. Defaults to HADDR_DEFAULT == 127.0.0.1. */
+ const char *haddr[MAX_LISTENING_SOCKETS];
- /** Port to bind to. Defaults to HADDR_PORT == 8118. */
- int hport;
+ /** Ports to bind to. Defaults to HADDR_PORT == 8118. */
+ int hport[MAX_LISTENING_SOCKETS];
/** Size limit for IOB */
size_t buffer_limit;
unsigned int default_server_timeout;
#endif
+#ifdef FEATURE_COMPRESSION
+ int compression_level;
+#endif
+
/** All options from the config file, HTML-formatted. */
char *proxy_args;
#endif /* def FEATURE_NO_GIFS */
-/*
+/*
* Hardwired URLs
*/