I don't have a small reproducer for this, but I'm seeing that when I'm sending an ill-formed gRPC request to one of Google's servers (specifically, when I use a GET request instead of a POST request), I'm getting a response back from the server that looks something like this:
and this then repeats a few times (within a single packet). I don't know why this repeats, but both the Google Python implementation and the the C++ implementation do this. When this happens, http2 (the lib) throws an undefined exception after it receives another HTTP2 messages on that now-reset stream. This commit changes this to simply drop such messages instead.
The spec (https://datatracker.ietf.org/doc/html/rfc7540#section-6.4) is strangely silent on this topic: it says that when you receive a RST_STREAM, you MUST NOT send any messages on that stream anymore, and when you send a RST_STREAM, you MUST be prepared to receive frames that your counterpart might have sent before it received the RST_STREAM. However, it is silent on whether or not it's legal to send further frames after sending a RST_STREAM, which is what we are observing here.
I don't have a small reproducer for this, but I'm seeing that when I'm sending an ill-formed gRPC request to one of Google's servers (specifically, when I use a
GET
request instead of aPOST
request), I'm getting a response back from the server that looks something like this:and this then repeats a few times (within a single packet). I don't know why this repeats, but both the Google Python implementation and the the C++ implementation do this. When this happens,
http2
(the lib) throws anundefined
exception after it receives another HTTP2 messages on that now-reset stream. This commit changes this to simply drop such messages instead.The spec (https://datatracker.ietf.org/doc/html/rfc7540#section-6.4) is strangely silent on this topic: it says that when you receive a
RST_STREAM
, you MUST NOT send any messages on that stream anymore, and when you send aRST_STREAM
, you MUST be prepared to receive frames that your counterpart might have sent before it received theRST_STREAM
. However, it is silent on whether or not it's legal to send further frames after sending aRST_STREAM
, which is what we are observing here.