Introduce negative tag patterns NO-REQUEST-TAG and NO-RESPONSE-TAG
[privoxy.git] / project.h
index b52b0b8..8e0e937 100644 (file)
--- 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.173 2012/03/04 11:49:44 fabiankeil Exp $"
+#define PROJECT_H_VERSION "$Id: project.h,v 1.199 2013/11/24 14:23:28 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-2010 the
+ * Copyright   :  Written by and Copyright (C) 2001-2012 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;
@@ -167,11 +163,11 @@ typedef int jb_err;
  * some unspecified Solaris versions.
  * Note: Remember to #include <ctype.h> if you use these macros.
  */
-#define ijb_isdigit(__X) isdigit((int)(unsigned char)(__X))
-#define ijb_isupper(__X) isupper((int)(unsigned char)(__X))
-#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.
@@ -335,7 +331,6 @@ enum crunch_reason
  */
 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. */
@@ -344,17 +339,11 @@ struct http_response
   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
@@ -367,17 +356,25 @@ struct url_spec
    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
@@ -396,6 +393,17 @@ struct url_spec
  */
 #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
@@ -412,18 +420,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.  */
@@ -476,11 +477,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 */
@@ -507,6 +508,8 @@ struct iob
 #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 */
@@ -545,8 +548,10 @@ struct iob
 #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 */
@@ -630,7 +635,7 @@ struct action_spec
  */
 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
@@ -639,6 +644,18 @@ 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,
+   /**< Like SOCKS5, but uses non-standard Tor extensions (currently only optimistic data) */
+   SOCKS_5T,
+};
 
 /*
  * Structure to hold the server socket and the information
@@ -659,10 +676,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;
@@ -755,7 +777,6 @@ struct reusable_connection
  */
 #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.
@@ -789,11 +810,11 @@ struct reusable_connection
  */
 #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
 
@@ -818,6 +839,18 @@ struct reusable_connection
  */
 #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
@@ -839,7 +872,7 @@ struct reusable_connection
  * 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
@@ -861,6 +894,9 @@ struct client_state
    /** 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;
 
@@ -890,9 +926,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];
 
@@ -911,7 +951,6 @@ struct client_state
    /** 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
@@ -923,7 +962,6 @@ struct client_state
     *  should stop reading from the client socket.
     */
    unsigned long long expected_client_content_length;
-#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
 
 #ifdef FEATURE_TRUST
 
@@ -1034,9 +1072,9 @@ struct file_list
  */
 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    */
 };
 
 /**
@@ -1046,24 +1084,13 @@ struct block_spec
 
 #endif /* def FEATURE_TRUST */
 
-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 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;
@@ -1085,11 +1112,6 @@ struct forward_spec
 };
 
 
-/**
- * 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
 {
@@ -1098,6 +1120,7 @@ enum filter_type
    FT_SERVER_HEADER_FILTER = 2,
    FT_CLIENT_HEADER_TAGGER = 3,
    FT_SERVER_HEADER_TAGGER = 4,
+   FT_INVALID_FILTER       = 42,
 };
 #define MAX_FILTER_TYPES        5
 
@@ -1197,6 +1220,12 @@ struct access_control_list
 /** 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.
  *
@@ -1260,6 +1289,9 @@ 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;
 
@@ -1281,7 +1313,7 @@ struct configuration_spec
    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 */
 
@@ -1380,10 +1412,6 @@ struct configuration_spec
  */
 #define CGI_PREFIX  "http://" CGI_SITE_2_HOST CGI_SITE_2_PATH "/"
 
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
 #endif /* ndef PROJECT_H_INCLUDED */
 
 /*