Description
I can reproduce an issue with http2 in curl 7.53 (and seemingly nothing has changed in this area in 7.54)
I did this
- Issue 10 concurrent get requests to a local nginx server for a 1kb resource
- Every time one of them finishes I issue another one until 10000 completes
I expected the following
No asserts, instead I get this one every time:
http2_handle_stream_close: Assertion `httpc->drain_total >= data->state.drain' failed.
I believe it's related to retrying of requests since it seems to shortly follow this debug statement every time:
Issue another request to this URL: ...
It seems more or less innocuous to me and maybe the code that checks that state.drain > total_drain could just be defensive but I'm not 100% sure what unintended consequences that might have.
I compiled the app like this:
/usr/local/x86_64-toolchain-linux-gnu-master/bin/x86_64-toolchain-linux-gnu-gcc -I/usr/local/x86_64-toolchain-linux-gnu-master/include/ main.c -lcurl -lnghttp2 -L/usr/local/x86_64-toolchain-linux-gnu-master/lib -lssl -lcrypto -lz -Wl,-rpath,/usr/local/x86_64-toolchain-linux-gnu-master/lib
http2assert.zip
In the attached zip there is a small example program (main.c), an nginx.conf and a log from a run with --verbose (lots and lots of output, it'll kill your terminal if you don't redirect)
curl/libcurl version
7.53
[curl -V output]
curl 7.53.0-DEV (i686-pc-linux-gnu) libcurl/7.53.0-DEV OpenSSL/1.0.2f zlib/1.2.8 nghttp2/1.21.0
Protocols: http https smb smbs
Features: Debug TrackMemory IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy
operating system
Linux