#ifndef PROJECT_H_INCLUDED
#define PROJECT_H_INCLUDED
/** Version string. */
-#define PROJECT_H_VERSION "$Id: project.h,v 1.144 2009/07/13 17:12:28 fabiankeil Exp $"
+#define PROJECT_H_VERSION "$Id: project.h,v 1.167 2011/07/03 17:55:23 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-2010 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
* 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.
*/
* 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). */
};
/**
#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
#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
/*
- * 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
{
*/
#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_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_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
+
+
/*
* Flags for use in return codes of child processes
*/
/** socket to talk to client (web browser) */
jb_socket cfd;
- /** socket to talk to server (web server or proxy) */
- jb_socket sfd;
-
/** current connection to the server (may go through a proxy) */
struct reusable_connection server_connection;
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
* 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
#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 */
-
+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,
+};
/**
* 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,
+};
#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: 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
+
/**
* Data loaded from the configuration file.
*
* - 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;
#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. */