diff --git a/lib/cfilters.c b/lib/cfilters.c
index 01f1e28218..6326f79f78 100644
--- a/lib/cfilters.c
+++ b/lib/cfilters.c
@@ -972,12 +972,15 @@ size_t Curl_conn_get_max_concurrent(struct Curl_easy *data,
int sockindex)
{
CURLcode result;
- int n = 0;
+ int n = -1;
struct Curl_cfilter *cf = conn->cfilter[sockindex];
result = cf ? cf->cft->query(cf, data, CF_QUERY_MAX_CONCURRENT,
&n, NULL) : CURLE_UNKNOWN_OPTION;
- return (result || n <= 0) ? 1 : (size_t)n;
+ /* If no filter answered the query, the default is a non-multiplexed
+ * connection with limit 1. Otherwise, the the query may return 0
+ * for connections that are in shutdown, e.g. server HTTP/2 GOAWAY. */
+ return (result || n < 0) ? 1 : (size_t)n;
}
int Curl_conn_get_stream_error(struct Curl_easy *data,
diff --git a/lib/multi.c b/lib/multi.c
index 8543bfa8e5..b7f16a81c3 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -535,6 +535,22 @@ static void multi_done_locked(struct connectdata *conn,
void *userdata)
{
struct multi_done_ctx *mdctx = userdata;
+#ifndef CURL_DISABLE_VERBOSE_STRINGS
+ const char *host =
+#ifndef CURL_DISABLE_PROXY
+ conn->bits.socksproxy ?
+ conn->socks_proxy.host.dispname :
+ conn->bits.httpproxy ? conn->http_proxy.host.dispname :
+#endif
+ conn->bits.conn_to_host ? conn->conn_to_host.dispname :
+ conn->host.dispname;
+ int port =
+#ifndef CURL_DISABLE_PROXY
+ conn->bits.httpproxy ? conn->http_proxy.port :
+#endif
+ conn->bits.conn_to_port ? conn->conn_to_port :
+ conn->remote_port;
+#endif
Curl_detach_connection(data);
@@ -580,30 +596,27 @@ static void multi_done_locked(struct connectdata *conn,
#endif
) || conn->bits.close
|| (mdctx->premature && !Curl_conn_is_multiplex(conn, FIRSTSOCKET))) {
- CURL_TRC_M(data, "multi_done, not reusing connection=%"
- FMT_OFF_T ", forbid=%d"
- ", close=%d, premature=%d, conn_multiplex=%d",
- conn->connection_id, data->set.reuse_forbid,
- conn->bits.close, mdctx->premature,
- Curl_conn_is_multiplex(conn, FIRSTSOCKET));
+ CURL_TRC_M(data, "multi_done, terminating conn #%" FMT_OFF_T " to %s:%d, "
+ "forbid=%d, close=%d, premature=%d, conn_multiplex=%d",
+ conn->connection_id, host, port, data->set.reuse_forbid,
+ conn->bits.close, mdctx->premature,
+ Curl_conn_is_multiplex(conn, FIRSTSOCKET));
connclose(conn, "disconnecting");
Curl_conn_terminate(data, conn, mdctx->premature);
}
+ else if(!Curl_conn_get_max_concurrent(data, conn, FIRSTSOCKET)) {
+ CURL_TRC_M(data, "multi_done, conn #%" FMT_OFF_T " to %s:%d was shutdown"
+ " by server, not reusing", conn->connection_id, host, port);
+ connclose(conn, "server shutdown");
+ Curl_conn_terminate(data, conn, mdctx->premature);
+ }
else {
/* the connection is no longer in use by any transfer */
if(Curl_cpool_conn_now_idle(data, conn)) {
/* connection kept in the cpool */
- const char *host =
-#ifndef CURL_DISABLE_PROXY
- conn->bits.socksproxy ?
- conn->socks_proxy.host.dispname :
- conn->bits.httpproxy ? conn->http_proxy.host.dispname :
-#endif
- conn->bits.conn_to_host ? conn->conn_to_host.dispname :
- conn->host.dispname;
data->state.lastconnect_id = conn->connection_id;
- infof(data, "Connection #%" FMT_OFF_T " to host %s left intact",
- conn->connection_id, host);
+ infof(data, "Connection #%" FMT_OFF_T " to host %s:%d left intact",
+ conn->connection_id, host, port);
}
else {
/* connection was removed from the cpool and destroyed. */
diff --git a/tests/data/test1506 b/tests/data/test1506
index 90f1ed421c..d3cec05780 100644
--- a/tests/data/test1506
+++ b/tests/data/test1506
@@ -83,10 +83,10 @@ Accept: */*
^Host:.*
-* Connection #0 to host server1.example.com left intact
-* Connection #1 to host server2.example.com left intact
-* Connection #2 to host server3.example.com left intact
-* Connection #3 to host server4.example.com left intact
+* Connection #0 to host server1.example.com:%HTTPPORT left intact
+* Connection #1 to host server2.example.com:%HTTPPORT left intact
+* Connection #2 to host server3.example.com:%HTTPPORT left intact
+* Connection #3 to host server4.example.com:%HTTPPORT left intact
$_ = '' if(($_ !~ /left intact/) && ($_ !~ /Closing connection/))
diff --git a/tests/data/test1510 b/tests/data/test1510
index 23ef9517c9..236fbde3d9 100644
--- a/tests/data/test1510
+++ b/tests/data/test1510
@@ -83,10 +83,10 @@ Accept: */*
^Host:.*
-* Connection #0 to host server1.example.com left intact
-* Connection #1 to host server2.example.com left intact
-* Connection #2 to host server3.example.com left intact
-* Connection #3 to host server4.example.com left intact
+* Connection #0 to host server1.example.com:%HTTPPORT left intact
+* Connection #1 to host server2.example.com:%HTTPPORT left intact
+* Connection #2 to host server3.example.com:%HTTPPORT left intact
+* Connection #3 to host server4.example.com:%HTTPPORT left intact
$_ = '' if(($_ !~ /left intact/) && ($_ !~ /Closing connection/))
diff --git a/tests/data/test1542 b/tests/data/test1542
index 25df4a46e3..656af421df 100644
--- a/tests/data/test1542
+++ b/tests/data/test1542
@@ -55,11 +55,11 @@ Accept: */*
-== Info: Connection #0 to host %HOSTIP left intact
-== Info: Connection #0 to host %HOSTIP left intact
-== Info: Connection #0 to host %HOSTIP left intact
+== Info: Connection #0 to host %HOSTIP:%HTTPPORT left intact
+== Info: Connection #0 to host %HOSTIP:%HTTPPORT left intact
+== Info: Connection #0 to host %HOSTIP:%HTTPPORT left intact
== Info: shutting down connection #0
-== Info: Connection #1 to host %HOSTIP left intact
+== Info: Connection #1 to host %HOSTIP:%HTTPPORT left intact
$_ = '' if(($_ !~ /left intact/) && ($_ !~ /(closing|shutting down) connection #\d+/))
diff --git a/tests/data/test2402 b/tests/data/test2402
index 52c582415f..563443171a 100644
--- a/tests/data/test2402
+++ b/tests/data/test2402
@@ -96,10 +96,10 @@ Via: 2 nghttpx
^Host:.*
-* Connection #0 to host localhost left intact
-* Connection #0 to host localhost left intact
-* Connection #0 to host localhost left intact
-* Connection #0 to host localhost left intact
+* Connection #0 to host localhost:%HTTP2TLSPORT left intact
+* Connection #0 to host localhost:%HTTP2TLSPORT left intact
+* Connection #0 to host localhost:%HTTP2TLSPORT left intact
+* Connection #0 to host localhost:%HTTP2TLSPORT left intact
$_ = '' if(($_ !~ /left intact/) && ($_ !~ /Closing connection/))
diff --git a/tests/data/test2404 b/tests/data/test2404
index e7d68299ce..4ebcceac81 100644
--- a/tests/data/test2404
+++ b/tests/data/test2404
@@ -96,10 +96,10 @@ Via: 2 nghttpx
^Host:.*
-* Connection #0 to host localhost left intact
-* Connection #0 to host localhost left intact
-* Connection #0 to host localhost left intact
-* Connection #0 to host localhost left intact
+* Connection #0 to host localhost:%HTTP2TLSPORT left intact
+* Connection #0 to host localhost:%HTTP2TLSPORT left intact
+* Connection #0 to host localhost:%HTTP2TLSPORT left intact
+* Connection #0 to host localhost:%HTTP2TLSPORT left intact
$_ = '' if(($_ !~ /left intact/) && ($_ !~ /Closing connection/))
diff --git a/tests/data/test2502 b/tests/data/test2502
index e86e6125ad..311b23deff 100644
--- a/tests/data/test2502
+++ b/tests/data/test2502
@@ -91,10 +91,10 @@ Via: 3 nghttpx
^Host:.*
-== Info: Connection #0 to host localhost left intact
-== Info: Connection #0 to host localhost left intact
-== Info: Connection #0 to host localhost left intact
-== Info: Connection #0 to host localhost left intact
+== Info: Connection #0 to host localhost:%HTTP3PORT left intact
+== Info: Connection #0 to host localhost:%HTTP3PORT left intact
+== Info: Connection #0 to host localhost:%HTTP3PORT left intact
+== Info: Connection #0 to host localhost:%HTTP3PORT left intact
$_ = '' if(($_ !~ /left intact/) && ($_ !~ /Closing connection/))