From: Stephan Bosch Date: Sat, 17 Feb 2018 10:08:20 +0000 (+0100) Subject: lib-http: client: Handle output stream errors in a separate function. X-Git-Tag: 2.3.1~121 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a3bf9c8acd6f7dcb47656d10475396eae80979a1;p=thirdparty%2Fdovecot%2Fcore.git lib-http: client: Handle output stream errors in a separate function. --- diff --git a/src/lib-http/http-client-connection.c b/src/lib-http/http-client-connection.c index 4b5ba96fd1..037588704d 100644 --- a/src/lib-http/http-client-connection.c +++ b/src/lib-http/http-client-connection.c @@ -270,6 +270,23 @@ http_client_connection_lost(struct http_client_connection **_conn, HTTP_CLIENT_REQUEST_ERROR_CONNECTION_LOST, error); } +void http_client_connection_handle_output_error( + struct http_client_connection *conn) +{ + struct ostream *output = conn->conn.output; + + if (output->stream_errno != EPIPE && + output->stream_errno != ECONNRESET) { + http_client_connection_lost(&conn, + t_strdup_printf("write(%s) failed: %s", + o_stream_get_name(output), + o_stream_get_error(output))); + } else { + http_client_connection_lost(&conn, + "Remote disconnected"); + } +} + int http_client_connection_check_ready(struct http_client_connection *conn) { const struct http_client_settings *set = &conn->peer->client->set; @@ -1192,12 +1209,8 @@ int http_client_connection_output(struct http_client_connection *conn) http_client_connection_reset_request_timeout(conn); if ((ret = o_stream_flush(output)) <= 0) { - if (ret < 0) { - http_client_connection_lost(&conn, - t_strdup_printf("write(%s) failed: %s", - o_stream_get_name(output), - o_stream_get_error(output))); - } + if (ret < 0) + http_client_connection_handle_output_error(conn); return ret; } diff --git a/src/lib-http/http-client-private.h b/src/lib-http/http-client-private.h index 626d82552b..43463f4e42 100644 --- a/src/lib-http/http-client-private.h +++ b/src/lib-http/http-client-private.h @@ -519,6 +519,8 @@ void http_client_connection_peer_closed(struct http_client_connection **_conn); void http_client_connection_request_destroyed( struct http_client_connection *conn, struct http_client_request *req); +void http_client_connection_handle_output_error( + struct http_client_connection *conn); int http_client_connection_output(struct http_client_connection *conn); void http_client_connection_start_request_timeout( struct http_client_connection *conn);