Closed abonander closed 1 year ago
Yea, I think we've talked about this in a previous issue, but don't remember where. h2
is making the "error" (the reset) trump any other frames that have been received. It should likely be changed to return all other received frames, and then return the error.
But somewhere in the stack it should probably just suppress the RST_STREAM(NO_ERROR)
and return the response, because the response is what's going to be meaningful to the user. The RST_STREAM
here is just being used as a "shut up and listen" signal.
Yes, it should return the response, that's why I mean. And then the body can return that there was a NO_ERROR
error. It should still be given to the user, so they know something happened.
Stumbled on this. How can I suppress the specific failure RST_STREAM(NO_ERROR)
somehow? How can I workaround this? I'm also in for contributing this fix :)
And then the body can return that there was a NO_ERROR error. It should still be given to the user, so they know something happened.
I don’t think it should be propagated at all:
The response body could be totally fine, there is no errors there, but NO_ERROR
happened due to request body being dropped. It affects h2 stream status, but not the request result. So why we should to enrich the response body with the error? Only if something like “state” to check if there were underlying protocol errors, Idk
That’s actually legit scenario when body of request wasn’t consumed because server already responded back with valid response.And seems this behavior corresponds the H2 specification.
This is already long story, started here - https://github.com/hyperium/h2/pull/600#issuecomment-1645579652, and then the behavior was changed here (what is actually correct). And I just extended the test in h2 to make it more clear (https://github.com/hyperium/h2/pull/703)
UPD: I've prepared the fix on hyper client level
Hi, any chance we could get this in a release soon?
Version
Platform
Description I've found that Google Cloud Storage's API can respond with HTTP/2
RST_STREAM
frame withNO_ERROR
set for the reason, which appears to mean "stop sending the request body and read my response" according to https://datatracker.ietf.org/doc/html/rfc7540#section-8.1I believe this is happening in response to a
PutObject
request when the bucket is being rate limited for writes. The server is trying to tell the client to stop sending the request body because it won't be processed, and instead it should immediately read the response to discover the429 Too Many Requests
error code.However, Hyper's client implementation appears to just return the
RST_STREAM
message as an error and discards the response instead of handling it, which gives a hilariously confusing error message of:To be compliant with the spec, the implementation should stop sending the body and immediately read the response and return it.
For context, I'm using the Gcloud Storage API via https://crates.io/crates/aws-sdk-s3 (because the Gcloud Rust SDK doesn't support streaming bodies, but thankfully Gcloud Storage exposes an S3-compatible API), which uses Hyper internally.
aws-sdk-s3
appears to be returning the error from Hyper verbatim, however.