dovecot-2.2: lib-http: Made sure that connections that are still...

dovecot at dovecot.org dovecot at dovecot.org
Wed Jul 9 07:57:20 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/320a224ad353
changeset: 17610:320a224ad353
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Wed Jul 09 10:55:27 2014 +0300
description:
lib-http: Made sure that connections that are still connecting to the server aren't marked as idle.

diffstat:

 src/lib-http/http-client-connection.c |  80 +++++++++++++++++++---------------
 1 files changed, 45 insertions(+), 35 deletions(-)

diffs (149 lines):

diff -r 16d4cf2c0d65 -r 320a224ad353 src/lib-http/http-client-connection.c
--- a/src/lib-http/http-client-connection.c	Mon Jul 07 16:21:08 2014 +0300
+++ b/src/lib-http/http-client-connection.c	Wed Jul 09 10:55:27 2014 +0300
@@ -45,6 +45,8 @@
  */
 
 static void http_client_connection_input(struct connection *_conn);
+static void
+http_client_connection_disconnect(struct http_client_connection *conn);
 
 unsigned int
 http_client_connection_count_pending(struct http_client_connection *conn)
@@ -89,12 +91,11 @@
 	struct http_client_connection *conn = *_conn;
 	struct http_client_request **req;
 
-	conn->connected = FALSE;
-	conn->closing = TRUE;
-
 	http_client_connection_debug(conn,
 		"Server explicitly closed connection");
 
+	http_client_connection_disconnect(conn);
+
 	array_foreach_modifiable(&conn->request_wait_list, req) {
 		if ((*req)->state < HTTP_REQUEST_STATE_FINISHED)
 			http_client_request_resubmit(*req);
@@ -117,9 +118,8 @@
 
 	http_client_connection_debug(conn, "Aborting connection: %s", error);
 
-	conn->connected = FALSE;
-	conn->closing = TRUE;
-	
+	http_client_connection_disconnect(conn);
+
 	array_foreach_modifiable(&conn->request_wait_list, req) {
 		i_assert((*req)->submitted);
 		http_client_request_error(*req, status, error);
@@ -156,8 +156,7 @@
 	http_client_connection_debug(conn,
 		"Aborting connection with temporary error: %s", error);
 
-	conn->connected = FALSE;
-	conn->closing = TRUE;
+	http_client_connection_disconnect(conn);
 	
 	http_client_connection_retry_requests(conn, status, error);
 	http_client_connection_unref(_conn);
@@ -168,6 +167,10 @@
 {
 	http_client_connection_debug(conn, "Idle connection timed out");
 
+	/* cannot get here unless connection was established at some point */
+	i_assert(conn->connect_succeeded);
+
+	http_client_connection_disconnect(conn);
 	http_client_connection_unref(&conn);
 }
 
@@ -175,7 +178,8 @@
 {
 	unsigned int timeout, count;
 
-	if (array_is_created(&conn->request_wait_list) &&
+	if (conn->connected &&
+		array_is_created(&conn->request_wait_list) &&
 		array_count(&conn->request_wait_list) == 0 &&
 		conn->incoming_payload == NULL &&
 		conn->client->set.max_idle_time_msecs > 0) {
@@ -1102,6 +1106,37 @@
 	conn->refcount++;
 }
 
+static void
+http_client_connection_disconnect(struct http_client_connection *conn)
+{
+	conn->closing = TRUE;
+	conn->connected = FALSE;
+
+	if (conn->connect_request != NULL)
+		http_client_request_abort(&conn->connect_request);
+
+	if (conn->incoming_payload != NULL) {
+		/* the stream is still accessed by lib-http caller. */
+		i_stream_remove_destroy_callback(conn->incoming_payload,
+						 http_client_payload_destroyed);
+	}
+
+	connection_disconnect(&conn->conn);
+
+	if (conn->io_req_payload != NULL)
+		io_remove(&conn->io_req_payload);
+	if (conn->to_requests != NULL)
+		timeout_remove(&conn->to_requests);
+	if (conn->to_connect != NULL)
+		timeout_remove(&conn->to_connect);
+	if (conn->to_input != NULL)
+		timeout_remove(&conn->to_input);
+	if (conn->to_idle != NULL)
+		timeout_remove(&conn->to_idle);
+	if (conn->to_response != NULL)
+		timeout_remove(&conn->to_response);
+}
+
 void http_client_connection_unref(struct http_client_connection **_conn)
 {
 	struct http_client_connection *conn = *_conn;
@@ -1117,19 +1152,7 @@
 
 	http_client_connection_debug(conn, "Connection destroy");
 
-	conn->closing = TRUE;
-	conn->connected = FALSE;
-
-	if (conn->connect_request != NULL)
-		http_client_request_abort(&conn->connect_request);
-
-	if (conn->incoming_payload != NULL) {
-		/* the stream is still accessed by lib-http caller. */
-		i_stream_remove_destroy_callback(conn->incoming_payload,
-						 http_client_payload_destroyed);
-	}
-
-	connection_disconnect(&conn->conn);
+	http_client_connection_disconnect(conn);
 
 	if (array_is_created(&conn->request_wait_list)) {
 		/* abort all pending requests */
@@ -1151,19 +1174,6 @@
 	if (conn->ssl_iostream != NULL)
 		ssl_iostream_unref(&conn->ssl_iostream);
 	connection_deinit(&conn->conn);
-
-	if (conn->io_req_payload != NULL)
-		io_remove(&conn->io_req_payload);
-	if (conn->to_requests != NULL)
-		timeout_remove(&conn->to_requests);
-	if (conn->to_connect != NULL)
-		timeout_remove(&conn->to_connect);
-	if (conn->to_input != NULL)
-		timeout_remove(&conn->to_input);
-	if (conn->to_idle != NULL)
-		timeout_remove(&conn->to_idle);
-	if (conn->to_response != NULL)
-		timeout_remove(&conn->to_response);
 	
 	/* remove this connection from the list */
 	conn_arr = &conn->peer->conns;


More information about the dovecot-cvs mailing list