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