-const char gateway_rcs[] = "$Id: gateway.c,v 1.91 2012/10/21 12:56:38 fabiankeil Exp $";
+const char gateway_rcs[] = "$Id: gateway.c,v 1.92 2012/10/23 10:16:52 fabiankeil Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/gateway.c,v $
#include "jbsockets.h"
#include "gateway.h"
#include "miscutil.h"
+#include "list.h"
+
#ifdef FEATURE_CONNECTION_KEEP_ALIVE
#ifdef HAVE_POLL
#ifdef __GLIBC__
sfd = socks4_connect(fwd, dest_host, dest_port, csp);
break;
case SOCKS_5:
+ case SOCKS_5T:
sfd = socks5_connect(fwd, dest_host, dest_port, csp);
break;
default:
err = 1;
}
- if (fwd->type != SOCKS_5)
+ if ((fwd->type != SOCKS_5) && (fwd->type != SOCKS_5T))
{
/* Should never get here */
log_error(LOG_LEVEL_FATAL,
return(JB_INVALID_SOCKET);
}
+ /*
+ * 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
+ * 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.
+ */
+ if ((fwd->type == SOCKS_5T) && (csp->http->ssl == 0)
+ && (csp->flags & CSP_FLAG_CLIENT_REQUEST_COMPLETELY_READ))
+ {
+ char *client_headers = list_to_text(csp->headers);
+ size_t header_length;
+
+ if (client_headers == NULL)
+ {
+ log_error(LOG_LEVEL_FATAL, "Out of memory rebuilding client headers");
+ }
+ list_remove_all(csp->headers);
+ header_length= strlen(client_headers);
+
+ log_error(LOG_LEVEL_CONNECT,
+ "Optimistically sending %d bytes of client headers intended for %s",
+ header_length, csp->http->hostport);
+
+ if (write_socket(sfd, client_headers, header_length))
+ {
+ log_error(LOG_LEVEL_CONNECT,
+ "optimistically writing header to: %s failed: %E", csp->http->hostport);
+ freez(client_headers);
+ return(JB_INVALID_SOCKET);
+ }
+ freez(client_headers);
+ }
+
server_size = read_socket(sfd, sbuf, sizeof(sbuf));
if (server_size != sizeof(sbuf))
{