-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 $
#include "gateway.h"
#include "miscutil.h"
#include "list.h"
+#include "parsers.h"
#ifdef FEATURE_CONNECTION_KEEP_ALIVE
#ifdef HAVE_POLL
}
/*
- * 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))
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));