-
Notifications
You must be signed in to change notification settings - Fork 31
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
Handle multiple RST_STREAM frames #184
Handle multiple RST_STREAM frames #184
Conversation
Thanks for this, I’ll look over it soon. Note that we might need to do the same for the server implementation (up to you whether you add it in this PR or another one) |
Looking at the match statements in server_connection.ml's |
I have fixed the client and added a server test (that might need improvement), which passes. |
I added a new test verifying we also behave correctly for 2 RST_STREAM frames with a
Looking over the code in A follow-up PR could unify the behavior with the client implementation, if it makes sense. |
Sounds good! That would also be useful for solving an issue I'll likely raise tomorrow where it seems that the server continues to send RESET_STREAM and DATA frames after sending a RESET_STREAM frame due to a malformed content-length header. |
Also, this makes me think that the error code might not be relevant, as far as the above parts of the protocol mention. Would it make sense to have the match statement in client_connection look like the following instead: (match respd.state, error_code with
| Idle, _ -> ...
| Closed _, _ -> ()
| Active _, Error_code.NoError -> ...
| _ -> ...) |
I applied your suggestion, thanks! |
…2-async (0.10.0) CHANGES: - hpack: fix a case where hpack would raise an array out of bounds exception ([anmonteiro/ocaml-h2#183](anmonteiro/ocaml-h2#183)) ([@jonathanjameswatson](https://github.com/jonathanjameswatson)) - h2: (client) handle multiple RST_STREAM frames ([anmonteiro/ocaml-h2#184](anmonteiro/ocaml-h2#184)) ([@jonathanjameswatson](https://github.com/jonathanjameswatson)) - h2: (client) Fix a race condition with `~flush_headers_immediately:false` and empty request bodies ([anmonteiro/ocaml-h2#186](anmonteiro/ocaml-h2#186)) - h2: Make `H2.Reqd.error_code` part of the public interface ([anmonteiro/ocaml-h2#188](anmonteiro/ocaml-h2#188)) - h2: Add `~request_method` argument to `H2.Method.body_length` ([anmonteiro/ocaml-h2#190](anmonteiro/ocaml-h2#190)) ([@jonathanjameswatson](https://github.com/jonathanjameswatson)) - h2: Don't send any frames on a stream after an `RST_STREAM` frame ([anmonteiro/ocaml-h2#187](anmonteiro/ocaml-h2#187), [anmonteiro/ocaml-h2#194](anmonteiro/ocaml-h2#194)) - h2: call error handler on the client if the remote peer closes the commmunication channel ([anmonteiro/ocaml-h2#177](anmonteiro/ocaml-h2#177), [anmonteiro/ocaml-h2#196](anmonteiro/ocaml-h2#194)) - h2: when reprioritizing a stream, respect its new priority (accounts for inferred default priority when a dependent stream is not in the tree ([RFC7540§5.3.1](https://www.rfc-editor.org/rfc/rfc7540.html#section-5.3.1))) ([anmonteiro/ocaml-h2#200](anmonteiro/ocaml-h2#200)) - h2: don't remove parent streams from the scheduler if they have children ([anmonteiro/ocaml-h2#201](anmonteiro/ocaml-h2#201)) - h2: don't schedule streams as dependencies of others marked for removal ([anmonteiro/ocaml-h2#205](anmonteiro/ocaml-h2#205)) - h2: revise scheduling algorithm to avoid starvation ([anmonteiro/ocaml-h2#199](anmonteiro/ocaml-h2#199), [anmonteiro/ocaml-h2#204](anmonteiro/ocaml-h2#204), reported in [anmonteiro/ocaml-h2#162](anmonteiro/ocaml-h2#162), thanks [@quernd](https://github.com/quernd)) - h2-eio: adapt to the next gluten-eio version ([anmonteiro/ocaml-h2#210](anmonteiro/ocaml-h2#210))
When a client receives two RST_STREAM frames, a NYI exception is raised. This is not ideal, as servers are allowed to send multiple RST_STREAM frames.
From RFC7540§5.4.2:
The first RST_STREAM frame should close the stream. In the closed state, extra RST_STREAM frames should be ignored (unless they arrive after a "significant" amount of time).
From RFC7540§5.1:
Here is a relevant issue:
dotnet/aspnetcore#32442
I have added a test for this problem, and will add a case to solve it soon.