dovecot-2.2: lib-http: client: Fixed proxied client connect time...

dovecot at dovecot.org dovecot at dovecot.org
Thu Oct 23 02:56:51 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/43728039836c
changeset: 17987:43728039836c
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Thu Oct 23 05:55:51 2014 +0300
description:
lib-http: client: Fixed proxied client connect timeout.
Timeout didn't cause requests to be aborted with error.

diffstat:

 src/lib-http/http-client-connection.c |  22 +++++++++++++++++++---
 src/lib-http/http-client-private.h    |   1 +
 2 files changed, 20 insertions(+), 3 deletions(-)

diffs (78 lines):

diff -r 44fd142fac1e -r 43728039836c src/lib-http/http-client-connection.c
--- a/src/lib-http/http-client-connection.c	Thu Oct 23 05:55:51 2014 +0300
+++ b/src/lib-http/http-client-connection.c	Thu Oct 23 05:55:51 2014 +0300
@@ -1063,6 +1063,18 @@
 static void
 http_client_connect_tunnel_timeout(struct http_client_connection *conn)
 {
+	const char *error, *name = http_client_peer_addr2str(&conn->peer->addr);
+	unsigned int msecs;
+
+	msecs = timeval_diff_msecs(&ioloop_timeval,
+				   &conn->connect_start_timestamp);
+	error = t_strdup_printf(
+		"Tunnel connect(%s) failed: "
+		"Connection timed out in %u.%03u secs",
+		name, msecs/1000, msecs%1000);
+
+	http_client_connection_debug(conn, "%s", error);
+	http_client_peer_connection_failure(conn->peer, error);
 	http_client_connection_close(&conn);
 }
 
@@ -1111,7 +1123,7 @@
 
 	if (response->status != 200) {
 		http_client_peer_connection_failure(conn->peer, t_strdup_printf(
-			"tunnel connect(%s) failed: %d %s", name,
+			"Tunnel connect(%s) failed: %d %s", name,
 				response->status, response->reason));
 		conn->connect_request = NULL;
 		return;
@@ -1122,6 +1134,7 @@
 
 	_connection_init_from_streams
 		(conn->client->conn_list, &conn->conn, name, tunnel.input, tunnel.output);
+	conn->connect_initialized = TRUE;
 }
 
 static void
@@ -1184,6 +1197,7 @@
 	} else {
 		connection_init_client_ip
 			(peer->client->conn_list, &conn->conn, &addr->ip, addr->port);
+		conn->connect_initialized = TRUE;
 		http_client_connection_connect(conn);
 	}
 
@@ -1217,7 +1231,8 @@
 		conn->incoming_payload = NULL;
 	}
 
-	connection_disconnect(&conn->conn);
+	if (conn->connect_initialized)
+		connection_disconnect(&conn->conn);
 
 	if (conn->io_req_payload != NULL)
 		io_remove(&conn->io_req_payload);
@@ -1269,7 +1284,8 @@
 
 	if (conn->ssl_iostream != NULL)
 		ssl_iostream_unref(&conn->ssl_iostream);
-	connection_deinit(&conn->conn);
+	if (conn->connect_initialized)
+		connection_deinit(&conn->conn);
 	
 	/* remove this connection from the list */
 	conn_arr = &conn->peer->conns;
diff -r 44fd142fac1e -r 43728039836c src/lib-http/http-client-private.h
--- a/src/lib-http/http-client-private.h	Thu Oct 23 05:55:51 2014 +0300
+++ b/src/lib-http/http-client-private.h	Thu Oct 23 05:55:51 2014 +0300
@@ -142,6 +142,7 @@
 	unsigned int connected:1;           /* connection is connected */
 	unsigned int tunneling:1;          /* last sent request turns this
 	                                      connection into tunnel */
+	unsigned int connect_initialized:1; /* connection was initialized */
 	unsigned int connect_succeeded:1;
 	unsigned int closing:1;
 	unsigned int close_indicated:1;


More information about the dovecot-cvs mailing list