ReadOnlySpan<byte> pingContent = _incomingBuffer.ActiveSpan.Slice(0, FrameHeader.PingLength);
long pingContentLong = BinaryPrimitives.ReadInt64BigEndian(pingContent);
+ if (NetEventSource.Log.IsEnabled()) Trace($"Received PING frame, content:{pingContentLong} ack: {frameHeader.AckFlag}");
+
if (frameHeader.AckFlag)
{
ProcessPingAck(pingContentLong);
// Send a PING
_pingCounter--;
+ if (NetEventSource.Log.IsEnabled()) connection.Trace($"[FlowControl] Sending RTT PING with payload {_pingCounter}");
connection.LogExceptions(connection.SendPingAsync(_pingCounter, isAck: false));
_pingSentTimestamp = now;
_state = State.PingSent;
{
if (_state != State.PingSent && _state != State.TerminatingMayReceivePingAck)
{
+ if (NetEventSource.Log.IsEnabled()) connection.Trace($"[FlowControl] Unexpected PING ACK in state {_state}");
ThrowProtocolError();
}
Debug.Assert(payload < 0);
if (_pingCounter != payload)
+ {
+ if (NetEventSource.Log.IsEnabled()) connection.Trace($"[FlowControl] Unexpected RTT PING ACK payload {payload}, should be {_pingCounter}.");
ThrowProtocolError();
+ }
RefreshRtt(connection);
_state = State.Waiting;
Assert.Equal(WindowSize, (int)entry.Value);
}
- [Fact]
- public Task InvalidRttPingResponse_RequestShouldFail()
+ [Theory]
+ [InlineData(0)] // Invalid PING payload
+ [InlineData(1)] // Unexpected PING response
+ public Task BadRttPingResponse_RequestShouldFail(int mode)
{
return Http2LoopbackServer.CreateClientAndServerAsync(async uri =>
{
(int streamId, _) = await connection.ReadAndParseRequestHeaderAsync();
await connection.SendDefaultResponseHeadersAsync(streamId);
PingFrame pingFrame = await connection.ReadPingAsync(); // expect an RTT PING
- await connection.SendPingAckAsync(-6666); // send an invalid PING response
+
+ if (mode == 0)
+ {
+ // Invalid PING payload
+ await connection.SendPingAckAsync(-6666); // send an invalid PING response
+ }
+ else
+ {
+ // Unexpected PING response
+ await connection.SendPingAckAsync(pingFrame.Data); // send an valid PING response
+ await connection.SendPingAckAsync(pingFrame.Data - 1); // send a second unexpected PING response
+ }
+
await connection.SendResponseDataAsync(streamId, new byte[] { 1, 2, 3 }, true); // otherwise fine response
},
NoAutoPingResponseHttp2Options);
}
-
[OuterLoop("Runs long")]
[Fact]
public async Task HighBandwidthDelayProduct_ClientStreamReceiveWindowWindowScalesUp()