Increase socks5_connect()'s optimism
authorFabian Keil <fk@fabiankeil.de>
Thu, 18 Jun 2015 15:26:40 +0000 (15:26 +0000)
committerFabian Keil <fk@fabiankeil.de>
Thu, 18 Jun 2015 15:26:40 +0000 (15:26 +0000)
... and let it send the request body optimistically as well.

It's not that complicated and, more importantly, previously
the request body wasn't guaranteed to be sent at all.

Should fix #1686 reported by Peter Müller and G4JC.

gateway.c

index 81b9b81..60f2aa2 100644 (file)
--- a/gateway.c
+++ b/gateway.c
@@ -1,4 +1,4 @@
-const char gateway_rcs[] = "$Id: gateway.c,v 1.92 2012/10/23 10:16:52 fabiankeil Exp $";
+const char gateway_rcs[] = "$Id: gateway.c,v 1.93 2012/12/07 12:45:20 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/gateway.c,v $
@@ -67,6 +67,7 @@ const char gateway_rcs[] = "$Id: gateway.c,v 1.92 2012/10/23 10:16:52 fabiankeil
 #include "gateway.h"
 #include "miscutil.h"
 #include "list.h"
+#include "parsers.h"
 
 #ifdef FEATURE_CONNECTION_KEEP_ALIVE
 #ifdef HAVE_POLL
@@ -1082,14 +1083,11 @@ static jb_socket socks5_connect(const struct forward_spec *fwd,
    }
 
    /*
-    * Optimistically send the request headers with the initial
-    * request if the user requested use of Tor extensions, the
-    * CONNECT method isn't being used (in which case the client
+    * Optimistically send the HTTP request with the initial
+    * SOCKS request if the user enabled the use of Tor extensions,
+    * the CONNECT method isn't being used (in which case the client
     * doesn't send data until it gets our 200 response) and the
-    * client request has been already read completely.
-    *
-    * Not optimistically sending the request body (if there is one)
-    * makes it easier to implement, but isn't an actual requirement.
+    * client request has actually been completely read already.
     */
    if ((fwd->type == SOCKS_5T) && (csp->http->ssl == 0)
       && (csp->flags & CSP_FLAG_CLIENT_REQUEST_COMPLETELY_READ))
@@ -1116,6 +1114,23 @@ static jb_socket socks5_connect(const struct forward_spec *fwd,
          return(JB_INVALID_SOCKET);
       }
       freez(client_headers);
+      if (csp->expected_client_content_length != 0)
+      {
+         unsigned long long buffered_request_bytes =
+            (unsigned long long)(csp->client_iob->eod - csp->client_iob->cur);
+         log_error(LOG_LEVEL_CONNECT,
+            "Optimistically sending %d bytes of client body. Expected %d",
+            csp->expected_client_content_length, buffered_request_bytes);
+         assert(csp->expected_client_content_length == buffered_request_bytes);
+         if (write_socket(sfd, csp->client_iob->cur, buffered_request_bytes))
+         {
+            log_error(LOG_LEVEL_CONNECT,
+               "optimistically writing %d bytes of client body to: %s failed: %E",
+               buffered_request_bytes, csp->http->hostport);
+            return(JB_INVALID_SOCKET);
+         }
+         clear_iob(csp->client_iob);
+      }
    }
 
    server_size = read_socket(sfd, sbuf, sizeof(sbuf));