New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
HTTP/2 libcurl regression #13292
Comments
I think I have an idea what is going wrong here. Your |
It doesn't seem to use |
- When the writing of response data fails, reset the stream and do not return a callback error to nghttp2. That would be a fatal error for the connection and harm other requests. - add test cases for various abort scenarios - refs curl#13292
I see. Thanks for the links. I added more tests around this situation. Aborting a transfer from the XFERINFO callback works, but when the writing of the response fails, this brought the connection into a fatal state. Maybe there was some ulimit on the file or the disk was full? Anyways, I'd be curious if #13298 works for you. |
Another theory is that the target file was closed before the easy handle was shutdown and incoming data tried to write to it. Just an idea. |
It seems pacman sets 16kb filesize limit for signature files (*.sig) with CURLOPT_MAXFILESIZE_LARGE. But server was responding with 404 error and accompanied error page for these files due to their absence for database files in official distro's repositories. And on this particular server error page exceed 16kb limit almost twice (~29kb) due to embedded base64'd image.
Seems to work and doesn't timeout for subsequent files anymore. In debug info for absent files I have this now:
|
I did this
ArchLinux's pacman which is using libcurl through libalpm started to timeout on mirror synchronization if this mirror have http/2 enabled. Bisect is pointing to commit 0dc0362.
I also hacked a bit libalpm and here is an output:
It seems there is some trouble with client callbacks (according to "nghttp2_session_mem_recv() returned -902:The user callback function failed") when some file is not present on server (core.db.sig in the case above). Which then prevents downloading subsequent files.
I expected the following
Log with build before aformentioned commit:
curl/libcurl version
curl 8.7.1 and current master branch
operating system
Archlinux
Linux xxx.xxx.xxx 6.8.1-arch1-1 #1 SMP PREEMPT_DYNAMIC Sat, 16 Mar 2024 17:15:35 +0000 x86_64 GNU/Linux
The text was updated successfully, but these errors were encountered: