Set the timestamp directly after receiving the response headers.
authorFabian Keil <fk@fabiankeil.de>
Sat, 11 Jul 2009 14:49:09 +0000 (14:49 +0000)
committerFabian Keil <fk@fabiankeil.de>
Sat, 11 Jul 2009 14:49:09 +0000 (14:49 +0000)
When checking if the server socket is still usable, we have to take the
time into account it took the client to decide that it's done talking.

gateway.c
gateway.h
jcc.c

index 9088a5c..855ebf2 100644 (file)
--- a/gateway.c
+++ b/gateway.c
@@ -1,4 +1,4 @@
-const char gateway_rcs[] = "$Id: gateway.c,v 1.54 2009/05/19 17:43:45 fabiankeil Exp $";
+const char gateway_rcs[] = "$Id: gateway.c,v 1.55 2009/07/05 12:01:45 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/gateway.c,v $
@@ -131,7 +131,7 @@ static const char socks_userid[] = "anonymous";
 static unsigned int keep_alive_timeout = DEFAULT_KEEP_ALIVE_TIMEOUT;
 
 static struct reusable_connection reusable_connection[MAX_REUSABLE_CONNECTIONS];
-static int mark_connection_unused(jb_socket sfd);
+static int mark_connection_unused(const struct reusable_connection *connection);
 
 /*********************************************************************
  *
@@ -172,26 +172,22 @@ extern void initialize_reusable_connections(void)
  * Description :  Remembers a connection for reuse later on.
  *
  * Parameters  :
- *          1  :  sfd  = Open socket to remember.
- *          2  :  http = The destination for the connection.
- *          3  :  fwd  = The forwarder settings used.
- *          4  :  timeout = Number of seconds after which the
- *                          connection shouldn't be reused.
+ *          1  :  csp = Current client state (buffers, headers, etc...)
+ *          2  :  fwd = The forwarder settings used.
  *
  * Returns     : void
  *
  *********************************************************************/
-void remember_connection(jb_socket sfd,
-                         const struct http_request *http,
-                         const struct forward_spec *fwd,
-                         unsigned int timeout)
+void remember_connection(const struct client_state *csp, const struct forward_spec *fwd)
 {
    unsigned int slot = 0;
    int free_slot_found = FALSE;
+   const struct reusable_connection *connection = &csp->server_connection;
+   const struct http_request *http = csp->http;
 
-   assert(sfd != JB_INVALID_SOCKET);
+   assert(connection->sfd != JB_INVALID_SOCKET);
 
-   if (mark_connection_unused(sfd))
+   if (mark_connection_unused(connection))
    {
       return;
    }
@@ -206,7 +202,7 @@ void remember_connection(jb_socket sfd,
          assert(reusable_connection[slot].in_use == 0);
          log_error(LOG_LEVEL_CONNECT,
             "Remembering socket %d for %s:%d in slot %d.",
-            sfd, http->host, http->port, slot);
+            connection->sfd, http->host, http->port, slot);
          free_slot_found = TRUE;
          break;
       }
@@ -218,7 +214,7 @@ void remember_connection(jb_socket sfd,
         "No free slots found to remembering socket for %s:%d. Last slot %d.",
         http->host, http->port, slot);
       privoxy_mutex_unlock(&connection_reuse_mutex);
-      close_socket(sfd);
+      close_socket(connection->sfd);
       return;
    }
 
@@ -228,11 +224,11 @@ void remember_connection(jb_socket sfd,
    {
       log_error(LOG_LEVEL_FATAL, "Out of memory saving socket.");
    }
-   reusable_connection[slot].sfd = sfd;
+   reusable_connection[slot].sfd = connection->sfd;
    reusable_connection[slot].port = http->port;
    reusable_connection[slot].in_use = 0;
-   reusable_connection[slot].timestamp = time(NULL);
-   reusable_connection[slot].keep_alive_timeout = timeout;
+   reusable_connection[slot].timestamp = connection->timestamp;
+   reusable_connection[slot].keep_alive_timeout = connection->keep_alive_timeout;
 
    assert(NULL != fwd);
    assert(reusable_connection[slot].gateway_host == NULL);
@@ -516,33 +512,33 @@ static jb_socket get_reusable_connection(const struct http_request *http,
  * Description :  Gives a remembered connection free for reuse.
  *
  * Parameters  :
- *          1  :  sfd = The socket belonging to the connection in question.
+ *          1  :  connection = The connection in question.
  *
  * Returns     :  TRUE => Socket found and marked as unused.
  *                FALSE => Socket not found.
  *
  *********************************************************************/
-static int mark_connection_unused(jb_socket sfd)
+static int mark_connection_unused(const struct reusable_connection *connection)
 {
    unsigned int slot = 0;
    int socket_found = FALSE;
 
-   assert(sfd != JB_INVALID_SOCKET);
+   assert(connection->sfd != JB_INVALID_SOCKET);
 
    privoxy_mutex_lock(&connection_reuse_mutex);
 
    for (slot = 0; slot < SZ(reusable_connection); slot++)
    {
-      if (reusable_connection[slot].sfd == sfd)
+      if (reusable_connection[slot].sfd == connection->sfd)
       {
          assert(reusable_connection[slot].in_use);
          socket_found = TRUE;
          log_error(LOG_LEVEL_CONNECT,
             "Marking open socket %d for %s:%d in slot %d as unused.",
-            sfd, reusable_connection[slot].host,
+            connection->sfd, reusable_connection[slot].host,
             reusable_connection[slot].port, slot);
          reusable_connection[slot].in_use = 0;
-         reusable_connection[slot].timestamp = time(NULL);
+         reusable_connection[slot].timestamp = connection->timestamp;
          break;
       }
    }
index 89da0d8..0782257 100644 (file)
--- a/gateway.h
+++ b/gateway.h
@@ -1,6 +1,6 @@
 #ifndef GATEWAY_H_INCLUDED
 #define GATEWAY_H_INCLUDED
-#define GATEWAY_H_VERSION "$Id: gateway.h,v 1.15 2009/05/13 18:22:45 fabiankeil Exp $"
+#define GATEWAY_H_VERSION "$Id: gateway.h,v 1.16 2009/05/16 13:27:20 fabiankeil Exp $"
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/gateway.h,v $
@@ -59,10 +59,8 @@ extern jb_socket forwarded_connect(const struct forward_spec * fwd,
 extern void set_keep_alive_timeout(unsigned int timeout);
 extern void initialize_reusable_connections(void);
 extern void forget_connection(jb_socket sfd);
-extern void remember_connection(jb_socket sfd,
-                                const struct http_request *http,
-                                const struct forward_spec *fwd,
-                                unsigned int timeout);
+extern void remember_connection(const struct client_state *csp,
+                                const struct forward_spec *fwd);
 extern int close_unusable_connections(void);
 extern void mark_connection_closed(struct reusable_connection *closed_connection);
 extern int connection_destination_matches(const struct reusable_connection *connection,
diff --git a/jcc.c b/jcc.c
index c24075c..ea6f99d 100644 (file)
--- a/jcc.c
+++ b/jcc.c
@@ -1,4 +1,4 @@
-const char jcc_rcs[] = "$Id: jcc.c,v 1.265 2009/07/11 11:17:35 fabiankeil Exp $";
+const char jcc_rcs[] = "$Id: jcc.c,v 1.266 2009/07/11 14:39:34 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/jcc.c,v $
@@ -1077,6 +1077,8 @@ void save_connection_destination(jb_socket sfd,
 {
    assert(sfd != JB_INVALID_SOCKET);
    assert(NULL != http->host);
+
+   server_connection->sfd = sfd;
    server_connection->host = strdup(http->host);
    if (NULL == server_connection->host)
    {
@@ -2188,6 +2190,8 @@ static void chat(struct client_state *csp)
                return;
             }
 
+            csp->server_connection.timestamp = time(NULL);
+
             /*
              * We have now received the entire server header,
              * filter it and send the result to the client
@@ -2391,9 +2395,7 @@ static void serve(struct client_state *csp)
                "No additional client request received in time.");
             if ((csp->config->feature_flags & RUNTIME_FEATURE_CONNECTION_SHARING))
             {
-               remember_connection(csp->sfd, csp->http,
-                  forward_url(csp, csp->http),
-                  csp->server_connection.keep_alive_timeout);
+               remember_connection(csp, forward_url(csp, csp->http));
                csp->sfd = JB_INVALID_SOCKET;
                close_socket(csp->cfd);
                csp->cfd = JB_INVALID_SOCKET;