Mercurial > dovecot > core-2.2
changeset 17987:43728039836c
lib-http: client: Fixed proxied client connect timeout.
Timeout didn't cause requests to be aborted with error.
author | Stephan Bosch <stephan@rename-it.nl> |
---|---|
date | Thu, 23 Oct 2014 05:55:51 +0300 |
parents | 44fd142fac1e |
children | 5d3898cacf8b |
files | src/lib-http/http-client-connection.c src/lib-http/http-client-private.h |
diffstat | 2 files changed, 20 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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;
--- 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;