Turn keep-alive support into a runtime feature
[privoxy.git] / project.h
index ae3836b..088b864 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.110 2008/03/29 12:13:46 fabiankeil Exp $"
+#define PROJECT_H_VERSION "$Id: project.h,v 1.123 2008/11/10 16:55:59 fabiankeil Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/project.h,v $
  *
  * Revisions   :
  *    $Log: project.h,v $
+ *    Revision 1.123  2008/11/10 16:55:59  fabiankeil
+ *    Fix a gcc44 warning (in filters.c).
+ *
+ *    Revision 1.122  2008/10/16 07:11:34  fabiankeil
+ *    Fix a bunch of gcc44 conversion warnings.
+ *
+ *    Revision 1.121  2008/10/09 18:21:41  fabiankeil
+ *    Flush work-in-progress changes to keep outgoing connections
+ *    alive where possible. Incomplete and mostly #ifdef'd out.
+ *
+ *    Revision 1.120  2008/09/21 13:36:52  fabiankeil
+ *    If change-x-forwarded-for{add} is used and the client
+ *    sends multiple X-Forwarded-For headers, append the client's
+ *    IP address to each one of them. "Traditionally" we would
+ *    lose all but the last one.
+ *
+ *    Revision 1.119  2008/09/20 10:04:33  fabiankeil
+ *    Remove hide-forwarded-for-headers action which has
+ *    been obsoleted by change-x-forwarded-for{block}.
+ *
+ *    Revision 1.118  2008/09/19 15:26:29  fabiankeil
+ *    Add change-x-forwarded-for{} action to block or add
+ *    X-Forwarded-For headers. Mostly based on code removed
+ *    before 3.0.7.
+ *
+ *    Revision 1.117  2008/08/30 12:03:07  fabiankeil
+ *    Remove FEATURE_COOKIE_JAR.
+ *
+ *    Revision 1.116  2008/05/20 16:05:02  fabiankeil
+ *    Move parsers structure definition from project.h to parsers.h.
+ *
+ *    Revision 1.115  2008/05/19 16:57:20  fabiankeil
+ *    Declare all members of the parsers structure immutable.
+ *
+ *    Revision 1.114  2008/04/11 16:35:39  fabiankeil
+ *    Oops, I forgot to shorten the URL_SPEC_INITIALIZER in my last commit.
+ *
+ *    Revision 1.113  2008/04/10 14:41:04  fabiankeil
+ *    Ditch url_spec's path member now that it's no longer used.
+ *
+ *    Revision 1.112  2008/04/06 15:18:34  fabiankeil
+ *    Oh well, rename the --enable-pcre-host-patterns option to
+ *    --enable-extended-host-patterns as it's not really PCRE syntax.
+ *
+ *    Revision 1.111  2008/04/06 14:54:26  fabiankeil
+ *    Use PCRE syntax in host patterns when configured
+ *    with --enable-pcre-host-patterns.
+ *
  *    Revision 1.110  2008/03/29 12:13:46  fabiankeil
  *    Remove send-wafer and send-vanilla-wafer actions.
  *
@@ -933,18 +981,17 @@ struct url_spec
        Used for debugging or display only.  */
    char  *spec;
 
-#ifdef FEATURE_PCRE_HOST_PATTERNS
+#ifdef FEATURE_EXTENDED_HOST_PATTERNS
    regex_t *host_regex;/**< Regex for host matching                          */
 #else
    char  *dbuffer;     /**< Buffer with '\0'-delimited domain name, or NULL to match all hosts. */
    char **dvec;        /**< List of pointers to the strings in dbuffer.       */
    int    dcount;      /**< How many parts to this domain? (length of dvec)   */
    int    unanchored;  /**< Bitmap - flags are ANCHOR_LEFT and ANCHOR_RIGHT.  */
-#endif /* defined FEATURE_PCRE_HOST_PATTERNS */
+#endif /* defined FEATURE_EXTENDED_HOST_PATTERNS */
 
    char  *port_list;   /**< List of acceptable ports, or NULL to match all ports */
 
-   char  *path;        /**< The source for the regex.                         */
    regex_t *preg;      /**< Regex for matching path part                      */
    regex_t *tag_regex; /**< Regex for matching tags                           */
 };
@@ -952,11 +999,11 @@ struct url_spec
 /**
  * If you declare a static url_spec, this is the value to initialize it to zero.
  */
-#ifndef FEATURE_PCRE_HOST_PATTERNS
-#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, NULL }
+#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, NULL }
-#endif /* def FEATURE_PCRE_HOST_PATTERNS */
+#define URL_SPEC_INITIALIZER { NULL, NULL, NULL, NULL, NULL }
+#endif /* def FEATURE_EXTENDED_HOST_PATTERNS */
 
 /**
  * Constant for host part matching in URLs.  If set, indicates that the start of
@@ -1040,8 +1087,8 @@ struct iob
 #define ACTION_DOWNGRADE                             0x00000004UL
 /** Action bitmap: Fast redirects. */
 #define ACTION_FAST_REDIRECTS                        0x00000008UL
-/** Action bitmap: Remove existing "Forwarded" header, and do not add another. */
-#define ACTION_HIDE_FORWARDED                        0x00000010UL
+/** Action bitmap: Remove or add "X-Forwarded-For" header. */
+#define ACTION_CHANGE_X_FORWARDED_FOR                0x00000010UL
 /** Action bitmap: Hide "From" header. */
 #define ACTION_HIDE_FROM                             0x00000020UL
 /** Action bitmap: Hide "Referer" header.  (sic - follow HTTP, not English). */
@@ -1122,8 +1169,10 @@ struct iob
 #define ACTION_STRING_FORWARD_OVERRIDE     15
 /** Action string index: Reason for the block. */
 #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
 /** Number of string actions. */
-#define ACTION_STRING_COUNT                17
+#define ACTION_STRING_COUNT                18
 
 
 /* To make the ugly hack in sed easier to understand */
@@ -1225,40 +1274,40 @@ struct url_actions
  * Flag for csp->flags: Set if this client is processing data.
  * Cleared when the thread associated with this structure dies.
  */
-#define CSP_FLAG_ACTIVE     0x01
+#define CSP_FLAG_ACTIVE     0x01U
 
 /**
  * Flag for csp->flags: Set if the server's reply is in "chunked"
  * transfer encoding
  */
-#define CSP_FLAG_CHUNKED    0x02
+#define CSP_FLAG_CHUNKED    0x02U
 
 /**
  * Flag for csp->flags: Set if this request was enforced, although it would
  * normally have been blocked.
  */
-#define CSP_FLAG_FORCED     0x04
+#define CSP_FLAG_FORCED     0x04U
 
 /**
  * Flag for csp->flags: Set if any modification to the body was done.
  */
-#define CSP_FLAG_MODIFIED   0x08
+#define CSP_FLAG_MODIFIED   0x08U
 
 /**
  * Flag for csp->flags: Set if request was blocked.
  */
-#define CSP_FLAG_REJECTED   0x10
+#define CSP_FLAG_REJECTED   0x10U
 
 /**
  * Flag for csp->flags: Set if we are toggled on (FEATURE_TOGGLE).
  */
-#define CSP_FLAG_TOGGLED_ON 0x20
+#define CSP_FLAG_TOGGLED_ON 0x20U
 
 /**
- * Flag for csp->flags: Set if adding the 'Connection: close' header
- * for the client isn't necessary.
+ * Flag for csp->flags: Set if an acceptable Connection header
+ * is already set.
  */
-#define CSP_FLAG_CLIENT_CONNECTION_CLOSE_SET   0x00000040UL
+#define CSP_FLAG_CLIENT_CONNECTION_HEADER_SET   0x00000040UL
 
 /**
  * Flag for csp->flags: Set if adding the 'Connection: close' header
@@ -1284,6 +1333,29 @@ struct url_actions
  */
 #define CSP_FLAG_NO_FILTERING                  0x00000400UL
 
+/**
+ * Flag for csp->flags: Set the client IP has appended to
+ * an already existing X-Forwarded-For header in which case
+ * no new header has to be generated.
+ */
+#define CSP_FLAG_X_FORWARDED_FOR_APPENDED      0x00000800UL
+
+/**
+ * Flag for csp->flags: Set if the server wants to keep
+ * the connection alive.
+ *
+ * XXX: Incomplete implementation, we currently only
+ * look for "Connection: keep-alive".
+ */
+#define CSP_FLAG_SERVER_CONNECTION_KEEP_ALIVE  0x00001000UL
+
+#ifdef FEATURE_CONNECTION_KEEP_ALIVE
+/**
+ * Flag for csp->flags: Set if the server specified the
+ * content length.
+ */
+#define CSP_FLAG_CONTENT_LENGTH_SET            0x00002000UL
+#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
 
 /*
  * Flags for use in return codes of child processes
@@ -1332,7 +1404,7 @@ struct client_state
    char *ip_addr_str;
    /** Client PC's IP address, as reported by the accept() function.
        As a number. */
-   long  ip_addr_long;
+   unsigned long ip_addr_long;
 
    /** The URL that was requested */
    struct http_request http[1];
@@ -1365,6 +1437,14 @@ struct client_state
    /** Length after content modification. */
    size_t content_length;
 
+#ifdef FEATURE_CONNECTION_KEEP_ALIVE
+   /** Expected length of content after which we
+    * should stop reading from the server socket.
+    */
+   /* XXX: is this the right location? */
+   size_t expected_content_length;
+#endif /* def FEATURE_CONNECTION_KEEP_ALIVE */
+
 #ifdef FEATURE_TRUST
 
    /** Trust file. */
@@ -1394,22 +1474,6 @@ typedef jb_err (*add_header_func_ptr)(struct client_state *);
 typedef jb_err (*parser_func_ptr    )(struct client_state *, char **);
 
 
-/**
- * List of functions to run on a list of headers
- */
-struct parsers
-{
-   /** The header prefix to match */
-   char   *str;
-   
-   /** The length of the prefix to match */
-   size_t len;
-   
-   /** The function to apply to this line */
-   parser_func_ptr parser;
-};
-
-
 /**
  * List of available CGI functions.
  */
@@ -1601,26 +1665,28 @@ struct access_control_list
 
 
 /** configuration_spec::feature_flags: CGI actions editor. */
-#define RUNTIME_FEATURE_CGI_EDIT_ACTIONS             1
+#define RUNTIME_FEATURE_CGI_EDIT_ACTIONS             1U
 
 /** configuration_spec::feature_flags: Web-based toggle. */
-#define RUNTIME_FEATURE_CGI_TOGGLE                   2
+#define RUNTIME_FEATURE_CGI_TOGGLE                   2U
 
 /** configuration_spec::feature_flags: HTTP-header-based toggle. */
-#define RUNTIME_FEATURE_HTTP_TOGGLE                  4
+#define RUNTIME_FEATURE_HTTP_TOGGLE                  4U
 
 /** configuration_spec::feature_flags: Split large forms to limit the number of GET arguments. */
-#define RUNTIME_FEATURE_SPLIT_LARGE_FORMS            8
+#define RUNTIME_FEATURE_SPLIT_LARGE_FORMS            8U
 
 /** configuration_spec::feature_flags: Check the host header for requests with host-less request lines. */
-#define RUNTIME_FEATURE_ACCEPT_INTERCEPTED_REQUESTS 16
+#define RUNTIME_FEATURE_ACCEPT_INTERCEPTED_REQUESTS 16U
 
 /** configuration_spec::feature_flags: Don't allow to circumvent blocks with the force prefix. */
-#define RUNTIME_FEATURE_ENFORCE_BLOCKS              32
+#define RUNTIME_FEATURE_ENFORCE_BLOCKS              32U
 
 /** configuration_spec::feature_flags: Allow to block or redirect CGI requests. */
-#define RUNTIME_FEATURE_CGI_CRUNCHING               64
+#define RUNTIME_FEATURE_CGI_CRUNCHING               64U
 
+/** configuration_spec::feature_flags: Try to keep the connection to the server alive. */
+#define RUNTIME_FEATURE_CONNECTION_KEEP_ALIVE      128U
 
 /**
  * Data loaded from the configuration file.
@@ -1682,16 +1748,6 @@ struct configuration_spec
    /** The hostname to show on CGI pages, or NULL to use the real one. */
    const char *hostname;
 
-#ifdef FEATURE_COOKIE_JAR
-
-   /** The file name of the cookie jar file */
-   const char * jarfile;
-
-   /** The handle to the cookie jar file */
-   FILE * jar;
-
-#endif /* def FEATURE_COOKIE_JAR */
-
    /** IP address to bind to.  Defaults to HADDR_DEFAULT == 127.0.0.1. */
    const char *haddr;