diff options
author | Daniel Stenberg <daniel@haxx.se> | 2016-08-11 14:00:23 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2016-08-28 16:44:49 +0200 |
commit | 3533def3d556e09f178e52e37b89fe8015b907f9 (patch) | |
tree | b0739d3a99475488a66e92ca29ed02521ae8a32f /lib/connect.c | |
parent | a6ddd6555e02bb3114e3d193f7474c402269a040 (diff) | |
download | curl-3533def3d556e09f178e52e37b89fe8015b907f9.tar.gz |
http2: make sure stream errors don't needlessly close the connection
With HTTP/2 each transfer is made in an indivial logical stream over the
connection, making most previous errors that caused the connection to get
forced-closed now instead just kill the stream and not the connection.
Fixes #941
Diffstat (limited to 'lib/connect.c')
-rw-r--r-- | lib/connect.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/lib/connect.c b/lib/connect.c index 7f8c0870a..eca817c35 100644 --- a/lib/connect.c +++ b/lib/connect.c @@ -1371,25 +1371,26 @@ CURLcode Curl_socket(struct connectdata *conn, } -#ifdef CURLDEBUG /* - * Curl_conncontrol() is used to set the conn->bits.close bit on or off. It - * MUST be called with the connclose() or connkeep() macros with a stated - * reason. The reason is only shown in debug builds but helps to figure out - * decision paths when connections are or aren't re-used as expected. + * Curl_conncontrol() marks streams or connection for closure. */ -void Curl_conncontrol(struct connectdata *conn, bool closeit, - const char *reason) -{ -#if defined(CURL_DISABLE_VERBOSE_STRINGS) - (void) reason; +void Curl_conncontrol(struct connectdata *conn, + int ctrl /* see defines in header */ +#ifdef CURLDEBUG + , const char *reason #endif - if(closeit != conn->bits.close) { - infof(conn->data, "Marked for [%s]: %s\n", closeit?"closure":"keep alive", - reason); - + ) +{ + /* close if a connection, or a stream that isn't multiplexed */ + bool closeit = (ctrl == CONNCTRL_CONNECTION) || + ((ctrl == CONNCTRL_STREAM) && !(conn->handler->flags & PROTOPT_STREAM)); + if((ctrl == CONNCTRL_STREAM) && + (conn->handler->flags & PROTOPT_STREAM)) + DEBUGF(infof(conn->data, "Kill stream: %s\n", reason)); + else if(closeit != conn->bits.close) { + DEBUGF(infof(conn->data, "Marked for [%s]: %s\n", + closeit?"closure":"keep alive", reason)); conn->bits.close = closeit; /* the only place in the source code that should assign this bit */ } } -#endif |