Skip to content

curl_easy_perform returns CURLE_SEND_ERROR even if the http/2 request was successful. #22984

Description

@paolonevis

I did this

start the server like that:

python3 h2-backend.py localhost 11074

and run then the compiled curltest_deterministic.c.

client: curltest_deterministic.c

server: h2-backend.py

I expected the following

I would have expected that this would work without problems, but I get this error:

curl: [HTTP/2] [1] cf_send(len=0) -> 55, 0, eos=1, h2 windows -1-65502 (stream-conn), buffers 0-0 (stream-conn)
curl: Connection #0 to host localhost:11074 left intact
ERROR: curl_easy_perform() failed: Failed sending data to the peer
paolo@localhost:~/tmp$

The problem seems to be that curl is finalizing the request body with len=0, eos=1 after receiving a complete early HTTP/2 response. The stream has already been marked closed internally, and cf_h2_send() incorrectly returns CURLE_SEND_ERROR instead of accepting the completed response.

Find here a possible fix.
libcurl-http2-early-response.patch

The proposed patch is also consistent with libcurl’s existing cf_h2_body_send() behavior, which already treats a closed stream with completed response headers as a valid early response

I'll open a PR with the proposed patch.

curl/libcurl version

curl 8.22.0

operating system

Linux localhost.localdomain 5.14.0-611.36.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Mar 3 17:30:12 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions