X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=project.h;h=4d9bc5767672c33469d95083b16cdf0c071b5895;hp=6e24ed2c6954eaf5276e20562993f398b982b9ad;hb=eadc3100faaf9d658801c21ca1dccc0bfa6da0e2;hpb=640ef193745c0bab70ded93c34dff846655aa73f diff --git a/project.h b/project.h index 6e24ed2c..4d9bc576 100644 --- a/project.h +++ b/project.h @@ -1,7 +1,7 @@ #ifndef PROJECT_H_INCLUDED #define PROJECT_H_INCLUDED /** Version string. */ -#define PROJECT_H_VERSION "$Id: project.h,v 1.146 2009/07/14 17:45:05 fabiankeil Exp $" +#define PROJECT_H_VERSION "$Id: project.h,v 1.189 2012/10/21 12:58:03 fabiankeil Exp $" /********************************************************************* * * File : $Source: /cvsroot/ijbswa/current/project.h,v $ @@ -10,7 +10,7 @@ * 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 @@ -46,9 +46,17 @@ /* Needed for pcre choice */ #include "config.h" -#ifdef HAVE_RFC2553 /* Need for struct sockaddr_storage */ -#include +#ifdef HAVE_RFC2553 +# ifndef _WIN32 +# include +# include +# else +# include +# include +# include + typedef unsigned short in_port_t; +# endif #endif @@ -140,7 +148,7 @@ typedef int jb_err; #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 */ @@ -153,19 +161,17 @@ typedef int jb_err; /** - * 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 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. @@ -183,7 +189,7 @@ typedef int jb_err; * 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. */ @@ -225,7 +231,7 @@ struct list_entry * your own code. */ char *str; - + /** Next entry in the linked list, or NULL if no more. */ struct list_entry *next; }; @@ -308,33 +314,36 @@ struct http_request * 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). */ }; /** @@ -403,18 +412,11 @@ struct iob /** * 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. */ #define CT_GIF 0x0002U /**< Suitable for GIF filtering. */ @@ -467,11 +469,11 @@ struct iob /** 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 */ @@ -492,7 +494,7 @@ struct iob #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 @@ -520,7 +522,7 @@ struct iob #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 @@ -630,10 +632,21 @@ struct url_actions 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, +}; /* - * Structure to make sure we only reuse the server socket - * if the host and forwarding settings are the same. + * Structure to hold the server socket and the information + * required to make sure we only reuse the connection if + * the host and forwarding settings are the same. */ struct reusable_connection { @@ -649,10 +662,15 @@ struct reusable_connection * 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; @@ -663,7 +681,7 @@ struct reusable_connection /* * 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. @@ -697,6 +715,11 @@ struct reusable_connection */ #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. @@ -748,7 +771,7 @@ struct reusable_connection #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. */ @@ -778,10 +801,40 @@ struct reusable_connection /** * 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 +/** + * Flag for csp->flags: Set if the Proxy-Connection header + * is among the server headers. + */ +#define CSP_FLAG_SERVER_PROXY_CONNECTION_HEADER_SET 0x00080000U + +/** + * Flag for csp->flags: Set if the client reused its connection. + */ +#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 + /* * Flags for use in return codes of child processes */ @@ -804,6 +857,12 @@ struct reusable_connection */ #define MAX_AF_FILES 10 +/** + * 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. */ @@ -818,8 +877,8 @@ struct client_state /** socket to talk to client (web browser) */ jb_socket cfd; - /** socket to talk to server (web server or proxy) */ - jb_socket sfd; + /** 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; @@ -850,9 +909,13 @@ struct client_state */ 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]; @@ -872,11 +935,17 @@ struct client_state 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 server socket. */ - /* XXX: is this the right location? */ unsigned long long expected_content_length; + + /** 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 @@ -891,11 +960,17 @@ struct client_state * 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 @@ -958,7 +1033,7 @@ struct file_list * Read-only once the structure has been created. */ time_t lastmodified; - + /** * The full filename. */ @@ -994,13 +1069,6 @@ struct block_spec #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. */ @@ -1010,7 +1078,7 @@ struct forward_spec 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; @@ -1035,12 +1103,15 @@ struct forward_spec #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 /** @@ -1055,7 +1126,7 @@ struct re_filterfile_spec 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. */ @@ -1133,6 +1204,15 @@ struct access_control_list /** configuration_spec::feature_flags: Share outgoing connections between different client connections. */ #define RUNTIME_FEATURE_CONNECTION_SHARING 256U +/** 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 + /** * Data loaded from the configuration file. * @@ -1142,7 +1222,7 @@ struct configuration_spec { /** What to log */ int debug; - + /** Nonzero to enable multithreading. */ int multi_threaded; @@ -1154,6 +1234,12 @@ struct configuration_spec * - 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 */ unsigned feature_flags; @@ -1190,14 +1276,17 @@ struct configuration_spec /** 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; @@ -1237,6 +1326,13 @@ struct configuration_spec #ifdef FEATURE_CONNECTION_KEEP_ALIVE /* Maximum number of seconds after which an open connection will no longer be reused. */ unsigned int keep_alive_timeout; + + /* Assumed server-side keep alive timeout if none is specified. */ + unsigned int default_server_timeout; +#endif + +#ifdef FEATURE_COMPRESSION + int compression_level; #endif /** All options from the config file, HTML-formatted. */ @@ -1268,7 +1364,7 @@ struct configuration_spec #endif /* def FEATURE_NO_GIFS */ -/* +/* * Hardwired URLs */