Skip to content

Commit 196063f

Browse files
author
ladeak
committed
Minor perf opt when all headers fit in a single header frame.
1 parent fc6b94c commit 196063f

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -490,8 +490,20 @@ private void WriteResponseHeadersUnsynchronized(int streamId, int statusCode, Ht
490490
var buffer = _headerEncodingBuffer.GetSpan(_maxFrameSize)[0.._maxFrameSize]; // GetSpan might return more data that can result in a less deterministic behavior on the way headers are split into frames.
491491
var done = HPackHeaderWriter.BeginEncodeHeaders(statusCode, _hpackEncoder, _headersEnumerator, buffer, out var payloadLength);
492492
Debug.Assert(done != HPackHeaderWriter.HeaderWriteResult.BufferTooSmall, "Oversized frames should not be returned, beucase this always writes the status.");
493-
_headerEncodingBuffer.Advance(payloadLength);
494-
FinishWritingHeaders(streamId, payloadLength, done);
493+
if (done == HPackHeaderWriter.HeaderWriteResult.Done)
494+
{
495+
// Fast path
496+
_outgoingFrame.PayloadLength = payloadLength;
497+
_outgoingFrame.HeadersFlags |= Http2HeadersFrameFlags.END_HEADERS;
498+
WriteHeaderUnsynchronized();
499+
_outputWriter.Write(buffer[0..payloadLength]);
500+
}
501+
else
502+
{
503+
// Slow path
504+
_headerEncodingBuffer.Advance(payloadLength);
505+
FinishWritingHeaders(streamId, payloadLength, done);
506+
}
495507
}
496508
// Any exception from the HPack encoder can leave the dynamic table in a corrupt state.
497509
// Since we allow custom header encoders we don't know what type of exceptions to expect.

0 commit comments

Comments
 (0)