curl/lib
Laramie Leavitt ef86daf4d3
http2: close the http2 connection when no more requests may be sent
Well-behaving HTTP2 servers send two GOAWAY messages. The first
message is a warning that indicates that the server is going to
stop accepting streams. The second one actually closes the stream.

nghttp2 reports this state (and the other state of no more stream
identifiers) via the call nghttp2_session_check_request_allowed().
In this state the client should not create more streams on the
session (tcp connection), and in curl this means that the server
has requested that the connection is closed.

It would be also be possible to put the connclose() call into the
on_http2_frame_recv() function that triggers on the GOAWAY message.

This fixes a bug seen when the client sees the following sequence of
frames:

// advisory GOAWAY
HTTP2 GOAWAY [stream-id = 0, promised-stream-id = -1]
... some additional frames

// final GOAWAY
HTTP2 GOAWAY [stream-id = 0, promised-stream-id = N ]

Before this change, curl will attempt to reuse the connection even
after the last stream, will encounter this error:

* Found bundle for host localhost: 0x5595f0a694e0 [can multiplex]
* Re-using existing connection! (#0) with host localhost
* Connected to localhost (::1) port 10443 (#0)
* Using Stream ID: 9 (easy handle 0x5595f0a72e30)
> GET /index.html?5 HTTP/2
> Host: localhost:10443
> user-agent: curl/7.68.0
> accept: */*
>
* stopped the pause stream!
* Connection #0 to host localhost left intact
curl: (16) Error in the HTTP2 framing layer

This error may posion the connection cache, causing future requests
which resolve to the same curl connection to go through the same error
path.

Closes #5643
2020-07-03 11:16:48 +02:00
..
vauth ntlm: enable NTLM support with wolfSSL 2020-06-16 09:06:19 +02:00
vquic ngtcp2: sync with current master 2020-06-29 17:09:59 +02:00
vssh libssh2: keep sftp errors as 'unsigned long' 2020-06-08 08:38:48 +02:00
vtls vtls: compare cert blob when finding a connection to reuse 2020-06-29 09:01:55 +02:00
.gitattributes
.gitignore
altsvc.c altsvc: bump to h3-29 2020-06-19 23:29:26 +02:00
altsvc.h altsvc: remove the num field from the altsvc struct 2020-06-12 23:24:11 +02:00
amigaos.c
amigaos.h
arpa_telnet.h
asyn-ares.c timeouts: move ms timeouts to timediff_t from int and long 2020-06-06 20:05:58 +02:00
asyn-thread.c build: disable more code/data when built without proxy support 2020-05-30 23:18:16 +02:00
asyn.h source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
base64.c
checksrc.pl wording: avoid blacklist/whitelist stereotypes 2020-06-10 08:49:17 +02:00
CMakeLists.txt cmake: add aliases so exported target names are available in tree 2020-04-13 23:27:35 +02:00
config-amigaos.h
config-dos.h lib: never define CURL_CA_BUNDLE with a getenv 2020-04-05 23:59:20 +02:00
config-mac.h
config-os400.h config: remove all defines of HAVE_DES_H 2020-03-24 17:54:26 +01:00
config-plan9.h
config-riscos.h config: remove all defines of HAVE_DES_H 2020-03-24 17:54:26 +01:00
config-symbian.h config: remove all defines of HAVE_DES_H 2020-03-24 17:54:26 +01:00
config-tpf.h config: remove all defines of HAVE_DES_H 2020-03-24 17:54:26 +01:00
config-vxworks.h config: remove all defines of HAVE_DES_H 2020-03-24 17:54:26 +01:00
config-win32.h source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
config-win32ce.h
conncache.c conncache: download buffer needs +1 size for trailing zero 2020-05-31 17:45:57 +02:00
conncache.h conncache: various concept cleanups 2020-04-30 14:27:54 +02:00
connect.c connect: improve happy eyeballs handling 2020-06-18 00:20:42 +02:00
connect.h source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
content_encoding.c source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
content_encoding.h source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
cookie.c terminology: call them null-terminated strings 2020-06-28 00:31:24 +02:00
cookie.h
curl_addrinfo.c Curl_addrinfo: use one malloc instead of three 2020-06-08 16:10:53 +02:00
curl_addrinfo.h copyright: updated year ranges out of sync 2020-05-24 00:02:33 +02:00
curl_base64.h
curl_config.h.cmake CMake: add libssh build support 2020-05-15 21:58:12 +02:00
curl_ctype.c
curl_ctype.h
curl_des.c
curl_des.h
curl_endian.c
curl_endian.h
curl_fnmatch.c
curl_fnmatch.h
curl_get_line.c
curl_get_line.h
curl_gethostname.c
curl_gethostname.h
curl_gssapi.c
curl_gssapi.h
curl_hmac.h source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
curl_ldap.h
curl_md4.h
curl_md5.h source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
curl_memory.h
curl_memrchr.c
curl_memrchr.h
curl_multibyte.c multibyte: Fixed access-> waccess to file for Windows Plarform 2020-06-21 19:31:39 +02:00
curl_multibyte.h curl_multibyte: add to curlx 2020-05-14 18:13:27 +02:00
curl_ntlm_core.c ntlm: enable NTLM support with wolfSSL 2020-06-16 09:06:19 +02:00
curl_ntlm_core.h ntlm: enable NTLM support with wolfSSL 2020-06-16 09:06:19 +02:00
curl_ntlm_wb.c http: move header storage to Curl_easy from connectdata 2020-06-15 22:56:25 +02:00
curl_ntlm_wb.h
curl_path.c escape: make the URL decode able to reject only %00 bytes 2020-06-25 09:57:18 +02:00
curl_path.h
curl_printf.h
curl_range.c
curl_range.h
curl_rtmp.c
curl_rtmp.h
curl_sasl.c build: disable more code/data when built without proxy support 2020-05-30 23:18:16 +02:00
curl_sasl.h
curl_sec.h
curl_setup_once.h tool: support UTF-16 command line on Windows 2020-05-14 18:13:36 +02:00
curl_setup.h multibyte: Fixed access-> waccess to file for Windows Plarform 2020-06-21 19:31:39 +02:00
curl_sha256.h
curl_sspi.c curl_multibyte: add to curlx 2020-05-14 18:13:27 +02:00
curl_sspi.h
curl_threads.c checksrc: enhance the ASTERISKSPACE and update code accordingly 2020-05-14 00:02:05 +02:00
curl_threads.h
curlx.h curl_multibyte: add to curlx 2020-05-14 18:13:27 +02:00
dict.c escape: make the URL decode able to reject only %00 bytes 2020-06-25 09:57:18 +02:00
dict.h
doh.c Curl_addrinfo: use one malloc instead of three 2020-06-08 16:10:53 +02:00
doh.h source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
dotdot.c terminology: call them null-terminated strings 2020-06-28 00:31:24 +02:00
dotdot.h
dynbuf.c terminology: call them null-terminated strings 2020-06-28 00:31:24 +02:00
dynbuf.h terminology: call them null-terminated strings 2020-06-28 00:31:24 +02:00
easy.c timeouts: move ms timeouts to timediff_t from int and long 2020-06-06 20:05:58 +02:00
easyif.h dynbuf: introduce internal generic dynamic buffer functions 2020-05-04 10:40:39 +02:00
escape.c escape: make the URL decode able to reject only %00 bytes 2020-06-25 09:57:18 +02:00
escape.h escape: make the URL decode able to reject only %00 bytes 2020-06-25 09:57:18 +02:00
file.c escape: make the URL decode able to reject only %00 bytes 2020-06-25 09:57:18 +02:00
file.h
fileinfo.c
fileinfo.h
firefox-db2pem.sh copyright: fix out-of-date copyright ranges and missing headers 2020-03-24 15:05:59 +01:00
formdata.c terminology: call them null-terminated strings 2020-06-28 00:31:24 +02:00
formdata.h source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
ftp.c terminology: call them null-terminated strings 2020-06-28 00:31:24 +02:00
ftp.h lib: clean up whitespace 2020-04-25 11:15:49 +02:00
ftplistparser.c
ftplistparser.h
getenv.c
getinfo.c build: disable more code/data when built without proxy support 2020-05-30 23:18:16 +02:00
getinfo.h
gopher.c escape: make the URL decode able to reject only %00 bytes 2020-06-25 09:57:18 +02:00
gopher.h
hash.c
hash.h
hmac.c source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
hostasyn.c source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
hostcheck.c
hostcheck.h
hostip4.c source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
hostip6.c hostip: make Curl_printable_address not return anything 2020-05-19 08:11:46 +02:00
hostip.c hostip: fix the memory-leak introduced in 67d2802 2020-06-02 12:43:50 +02:00
hostip.h hostip: make Curl_printable_address not return anything 2020-05-19 08:11:46 +02:00
hostsyn.c
http2.c http2: close the http2 connection when no more requests may be sent 2020-07-03 11:16:48 +02:00
http2.h dynbuf: introduce internal generic dynamic buffer functions 2020-05-04 10:40:39 +02:00
http_chunks.c trailers: switch h1-trailer logic to use dynbuf 2020-06-05 17:57:24 +02:00
http_chunks.h
http_digest.c http: move header storage to Curl_easy from connectdata 2020-06-15 22:56:25 +02:00
http_digest.h http: move header storage to Curl_easy from connectdata 2020-06-15 22:56:25 +02:00
http_negotiate.c http: move header storage to Curl_easy from connectdata 2020-06-15 22:56:25 +02:00
http_negotiate.h conncache: various concept cleanups 2020-04-30 14:27:54 +02:00
http_ntlm.c http: move header storage to Curl_easy from connectdata 2020-06-15 22:56:25 +02:00
http_ntlm.h conncache: various concept cleanups 2020-04-30 14:27:54 +02:00
http_proxy.c http: move header storage to Curl_easy from connectdata 2020-06-15 22:56:25 +02:00
http_proxy.h http_proxy: ported to use dynbuf instead of a static size buffer 2020-05-04 10:41:06 +02:00
http.c terminology: call them null-terminated strings 2020-06-28 00:31:24 +02:00
http.h http2: simplify and clean up trailer handling 2020-05-07 09:49:51 +02:00
idn_win32.c curl_multibyte: add to curlx 2020-05-14 18:13:27 +02:00
if2ip.c Curl_inet_ntop: always check the return code 2020-06-24 16:04:54 +02:00
if2ip.h
imap.c escape: make the URL decode able to reject only %00 bytes 2020-06-25 09:57:18 +02:00
imap.h
inet_ntop.c
inet_ntop.h
inet_pton.c
inet_pton.h
krb5.c
ldap.c escape: make the URL decode able to reject only %00 bytes 2020-06-25 09:57:18 +02:00
libcurl.plist
libcurl.rc
libcurl.vers.in
llist.c
llist.h
Makefile.am cleanup: correct copyright year range on a few files 2020-04-06 23:21:52 +02:00
makefile.amiga copyright: fix out-of-date copyright ranges and missing headers 2020-03-24 15:05:59 +01:00
makefile.dj copyright: fix out-of-date copyright ranges and missing headers 2020-03-24 15:05:59 +01:00
Makefile.inc vtls: Extract and simplify key log file handling from OpenSSL 2020-05-27 21:19:51 +02:00
Makefile.m32 Makefile.m32: Improve windres parameter compatibility 2020-03-14 19:08:17 -04:00
Makefile.netware lib: never define CURL_CA_BUNDLE with a getenv 2020-04-05 23:59:20 +02:00
Makefile.vxworks copyright: fix out-of-date copyright ranges and missing headers 2020-03-24 15:05:59 +01:00
Makefile.Watcom copyright: fix out-of-date copyright ranges and missing headers 2020-03-24 15:05:59 +01:00
md4.c source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
md5.c source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
memdebug.c memdebug: don't log free(NULL) 2020-03-31 09:44:23 +02:00
memdebug.h
mime.c terminology: call them null-terminated strings 2020-06-28 00:31:24 +02:00
mime.h source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
mk-ca-bundle.pl lib/mk-ca-bundle: skip empty certs 2020-04-22 22:55:08 +02:00
mk-ca-bundle.vbs copyright: fix out-of-date copyright ranges and missing headers 2020-03-24 15:05:59 +01:00
mprintf.c source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
mqtt.c escape: make the URL decode able to reject only %00 bytes 2020-06-25 09:57:18 +02:00
mqtt.h mqtt: make NOSTATE get within the debug name array 2020-04-20 23:27:04 +02:00
multi.c Revert "multi: implement wait using winsock events" 2020-06-30 12:27:23 +02:00
multihandle.h Revert "multi: implement wait using winsock events" 2020-06-30 12:27:23 +02:00
multiif.h url: make sure pushed streams get an allocated download buffer 2020-06-23 15:13:27 +02:00
netrc.c
netrc.h
non-ascii.c
non-ascii.h
nonblock.c
nonblock.h
nwlib.c source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
nwos.c
openldap.c source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
parsedate.c
parsedate.h
pingpong.c terminology: call them null-terminated strings 2020-06-28 00:31:24 +02:00
pingpong.h timeouts: change millisecond timeouts to timediff_t from time_t 2020-05-30 23:10:57 +02:00
pop3.c escape: make the URL decode able to reject only %00 bytes 2020-06-25 09:57:18 +02:00
pop3.h
progress.c timeouts: change millisecond timeouts to timediff_t from time_t 2020-05-30 23:10:57 +02:00
progress.h
psl.c
psl.h
quic.h connect: improve happy eyeballs handling 2020-06-18 00:20:42 +02:00
rand.c
rand.h
rename.c
rename.h
rtsp.c http: move header storage to Curl_easy from connectdata 2020-06-15 22:56:25 +02:00
rtsp.h
security.c
select.c select: remove the unused ELAPSED_MS() macro 2020-06-18 00:11:25 +02:00
select.h select: use timediff_t instead of time_t and int for timeout_ms 2020-05-30 10:20:40 +02:00
sendf.c sendf: improve the message on client write errors 2020-06-24 16:03:40 +02:00
sendf.h
setopt.c urldata: let the HTTP method be in the set.* struct 2020-06-02 16:30:36 +02:00
setopt.h setopt: support certificate options in memory with struct curl_blob 2020-05-15 13:03:59 +02:00
setup-os400.h checksrc: enhance the ASTERISKSPACE and update code accordingly 2020-05-14 00:02:05 +02:00
setup-vms.h copyright: updated year ranges out of sync 2020-05-24 00:02:33 +02:00
setup-win32.h curl_setup: define _WIN32_WINNT_[OS] symbols 2020-03-21 17:42:44 -04:00
sha256.c sha256: move assign to the declaration line 2020-05-19 08:52:38 +02:00
share.c share: don't set the share flag it something fails 2020-06-12 09:42:52 +02:00
share.h
sigpipe.h
slist.c
slist.h
smb.c escape: make the URL decode able to reject only %00 bytes 2020-06-25 09:57:18 +02:00
smb.h copyright updates: adjust year ranges 2020-04-26 23:59:22 +02:00
smtp.c escape: make the URL decode able to reject only %00 bytes 2020-06-25 09:57:18 +02:00
smtp.h
sockaddr.h
socketpair.c
socketpair.h
socks_gssapi.c all: fix codespell errors 2020-05-25 19:44:04 +00:00
socks_sspi.c all: fix codespell errors 2020-05-25 19:44:04 +00:00
socks.c socks: detect connection close during handshake 2020-06-08 23:19:36 +02:00
socks.h
speedcheck.c
speedcheck.h
splay.c
splay.h
strcase.c
strcase.h
strdup.c
strdup.h
strerror.c terminology: call them null-terminated strings 2020-06-28 00:31:24 +02:00
strerror.h
strtok.c terminology: call them null-terminated strings 2020-06-28 00:31:24 +02:00
strtok.h
strtoofft.c
strtoofft.h
system_win32.c
system_win32.h
telnet.c copyright: update mismatched copyright years 2020-06-22 11:55:34 +02:00
telnet.h
tftp.c escape: make the URL decode able to reject only %00 bytes 2020-06-25 09:57:18 +02:00
tftp.h
timeval.c
timeval.h
transfer.c urldata: let the HTTP method be in the set.* struct 2020-06-02 16:30:36 +02:00
transfer.h
url.c url: silence MSVC warning 2020-07-02 13:31:22 +02:00
url.h build: disable more code/data when built without proxy support 2020-05-30 23:18:16 +02:00
urlapi-int.h
urlapi.c terminology: call them null-terminated strings 2020-06-28 00:31:24 +02:00
urldata.h vtls: compare cert blob when finding a connection to reuse 2020-06-29 09:01:55 +02:00
version.c version: skip idn2_check_version() check and add precaution 2020-04-22 22:52:32 +02:00
warnless.c
warnless.h cleanup: correct copyright year range on a few files 2020-04-06 23:21:52 +02:00
wildcard.c
wildcard.h
x509asn1.c source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00
x509asn1.h source cleanup: remove all custom typedef structs 2020-05-15 08:54:42 +02:00