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/))