Open franfastly opened 4 months ago
I'm not sure why clippy started complaining about this. I could amend this PR to appease clippy or push a fix in separate PR.
Could be a newer clippy being a jerk.
@seanmonstar I'm taking over this one from Fran while he's on vacation for the next few weeks. I would offer to do the review myself, but I'm the coauthor of the internal predecessor to this patch; it probably would be good to have a third party perspective before landing this change.
h2
returnsRST_STREAM
frames with thePROTOCOL_ERROR
bit set as a response to many types of errors in client requests. Many of those cases, when handled by an HTTP/1 server such as the one used inhyper
, would result in an HTTP 400 Bad Request response returned to the client rather than a TCP reset (the HTTP/1 equivalent of aRST_STREAM
). As a consequence, a client will observe differences in behaviour between HTTP/1 and HTTP/2: a malformed request will result in a 400 response when HTTP/1 is used whereas the same request will result in a reset stream withh2
.This PR makes
h2
reply aHEADERS
+400
+END_STREAM
frame followed by aRST_STREAM
+PROTOCOL_ERROR
frame to all themalformed!()
macro invocations inPeer::convert_poll_message()
insrc/server.rs
.The
Reset
variant in theh2::proto::error::Error
Enum now contains anOption<http::StatusCode>
value that is set by themalformed!()
macro with aSome(400)
. That value is propagated all the way untilh2::proto::streams::send::Send::send_reset()
where, if notNone
, ah2::frame::headers::Headers
frame with the status code and theEND_STREAM
flag set will now be sent to the client before theRST_STREAM
frame.Some of the parameters passed to
send_reset()
have been grouped into a newSendResetContext
Struct in order to avoid aclippy::too_many_arguments
lint.Tests where malformed requests were sent have been updated to check that an additional
HEADERS
+400
+END_STREAM
frame is now received before theRST_STREAM + PROTOCOL_ERROR
frame.This change has been validated with other clients like
curl
, a custom ad-hoc client written withpython3+httpx
andvarnishtest
.Fixes #747