Skip to content

Commit d760ea4

Browse files
committed
PR feedback
1 parent 1516d2c commit d760ea4

File tree

7 files changed

+20
-18
lines changed

7 files changed

+20
-18
lines changed

src/Servers/Kestrel/Core/src/Internal/Http3/Http3Connection.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -224,16 +224,13 @@ private void UpdateStreamTimeouts(DateTimeOffset now)
224224

225225
if (stream.StreamTimeoutTicks == default)
226226
{
227-
var expirationTicks = Math.Max(
228-
_context.TimeoutControl.GetWriteTimingTimeoutTimestamp(),
229-
ticks + minDataRate.GracePeriod.Ticks);
230-
231-
stream.StreamTimeoutTicks = expirationTicks >= 0 ? expirationTicks : long.MaxValue;
227+
stream.StreamTimeoutTicks = _context.TimeoutControl.GetResponseDrainDeadline(ticks, minDataRate);
232228
}
233229

234230
if (stream.StreamTimeoutTicks < ticks)
235231
{
236-
stream.Abort(new ConnectionAbortedException(CoreStrings.ConnectionTimedBecauseResponseMininumDataRateNotSatisfied), Http3ErrorCode.RequestCancelled);
232+
// Cancel connection to be consistent with other data rate limits.
233+
Abort(new ConnectionAbortedException(CoreStrings.ConnectionTimedBecauseResponseMininumDataRateNotSatisfied), Http3ErrorCode.InternalError);
237234
}
238235
}
239236
}
@@ -449,7 +446,7 @@ private ConnectionAbortedException CreateConnectionAbortError(Exception? error,
449446

450447
if (clientAbort)
451448
{
452-
return new ConnectionAbortedException("The client closed the HTTP/3 connection.", error!);
449+
return new ConnectionAbortedException(CoreStrings.ConnectionAbortedByClient, error!);
453450
}
454451

455452
return new ConnectionAbortedException(CoreStrings.Http3ConnectionFaulted, error!);

src/Servers/Kestrel/Core/src/Internal/Infrastructure/ITimeoutControl.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ internal interface ITimeoutControl
2626
void StartTimingWrite();
2727
void StopTimingWrite();
2828
void BytesWrittenToBuffer(MinDataRate minRate, long count);
29-
long GetWriteTimingTimeoutTimestamp();
29+
long GetResponseDrainDeadline(long ticks, MinDataRate minRate);
3030
}
3131
}

src/Servers/Kestrel/Core/src/Internal/Infrastructure/TimeoutControl.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,9 +331,11 @@ void IConnectionTimeoutFeature.ResetTimeout(TimeSpan timeSpan)
331331
ResetTimeout(timeSpan.Ticks, TimeoutReason.TimeoutFeature);
332332
}
333333

334-
public long GetWriteTimingTimeoutTimestamp()
334+
public long GetResponseDrainDeadline(long ticks, MinDataRate minRate)
335335
{
336-
return _writeTimingTimeoutTimestamp;
336+
var timestamp = Math.Max(_writeTimingTimeoutTimestamp, ticks + minRate.GracePeriod.Ticks);
337+
338+
return timestamp >= 0 ? timestamp : long.MaxValue;
337339
}
338340
}
339341
}

src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockTimeoutControl.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public void CancelTimeout()
2424
{
2525
}
2626

27-
public long GetWriteTimingTimeoutTimestamp()
27+
public long GetResponseDrainDeadline(long ticks, MinDataRate minRate)
2828
{
2929
return 0;
3030
}

src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TestBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1385,9 +1385,9 @@ public virtual void Tick(DateTimeOffset now)
13851385
_realTimeoutControl.Tick(now);
13861386
}
13871387

1388-
public long GetWriteTimingTimeoutTimestamp()
1388+
public long GetResponseDrainDeadline(long ticks, MinDataRate minRate)
13891389
{
1390-
return _realTimeoutControl.GetWriteTimingTimeoutTimestamp();
1390+
return _realTimeoutControl.GetResponseDrainDeadline(ticks, minRate);
13911391
}
13921392
}
13931393
}

src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3TimeoutTests.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,10 +270,13 @@ await requestStream.SendHeadersAsync(new[]
270270

271271
Http3Api.TriggerTick(now + limits.MinResponseDataRate.GracePeriod + TimeSpan.FromTicks(1));
272272

273-
await requestStream.WaitForStreamErrorAsync(
274-
Http3ErrorCode.RequestCancelled,
275-
AssertExpectedErrorMessages,
276-
CoreStrings.ConnectionTimedBecauseResponseMininumDataRateNotSatisfied);
273+
requestStream.StartStreamDisposeTcs.TrySetResult();
274+
275+
await Http3Api.WaitForConnectionErrorAsync<ConnectionAbortedException>(
276+
ignoreNonGoAwayFrames: false,
277+
expectedLastStreamId: 4,
278+
Http3ErrorCode.InternalError,
279+
expectedErrorMessage: CoreStrings.ConnectionTimedBecauseResponseMininumDataRateNotSatisfied);
277280
}
278281

279282
private class EchoAppWithNotification

src/Servers/Kestrel/test/Interop.FunctionalTests/Http3/Http3RequestTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -888,7 +888,7 @@ await WaitForLogAsync(logs =>
888888

889889
// This message says the client closed the connection because the server
890890
// sends a GOAWAY and the client then closes the connection once all requests are finished.
891-
Assert.Contains("The client closed the HTTP/3 connection.", connectionAbortLog.Message);
891+
Assert.Contains("The client closed the connection.", connectionAbortLog.Message);
892892
return true;
893893
}, "Wait for connection abort.");
894894

0 commit comments

Comments
 (0)