Add optional client-side pipelining support
[privoxy.git] / project.h
index 66d9e00..2b1ca3d 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.179 2012/09/04 08:32:03 fabiankeil Exp $"
+#define PROJECT_H_VERSION "$Id: project.h,v 1.186 2012/10/21 12:52:35 fabiankeil Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/project.h,v $
@@ -412,17 +412,16 @@ 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));
+#define IOB_RESET(IOB) do {free(IOB->buf); memset(IOB, '\0', sizeof(*IOB));} while (0)
 
 /* Bits for csp->content_type bitmask: */
 #define CT_TEXT    0x0001U /**< Suitable for pcrs filtering. */
@@ -476,9 +475,9 @@ 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
+#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 */
@@ -639,6 +638,16 @@ 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 hold the server socket and the information
@@ -662,7 +671,7 @@ struct reusable_connection
 
    char *host;
    int  port;
-   int  forwarder_type;
+   enum forwarder_type forwarder_type;
    char *gateway_host;
    int  gateway_port;
    char *forward_host;
@@ -820,6 +829,12 @@ 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
 
 /*
  * Flags for use in return codes of child processes
@@ -892,9 +907,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];
 
@@ -1048,17 +1067,6 @@ 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.
  */
@@ -1200,6 +1208,9 @@ 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
+
 /**
  * Data loaded from the configuration file.
  *