From e75c4cb2cd54108aa55218f6040a065851d5b625 Mon Sep 17 00:00:00 2001 From: Tratcher Date: Wed, 27 Mar 2024 08:04:10 +0000 Subject: [PATCH] Sync shared code from runtime --- .../runtime/Http2/Hpack/HPackEncoder.cs | 31 ++++++------------- .../runtime/Http3/QPack/QPackEncoder.cs | 28 ++++++----------- 2 files changed, 19 insertions(+), 40 deletions(-) diff --git a/src/Shared/runtime/Http2/Hpack/HPackEncoder.cs b/src/Shared/runtime/Http2/Hpack/HPackEncoder.cs index 5c0bbecfcc7d..dab588146dc2 100644 --- a/src/Shared/runtime/Http2/Hpack/HPackEncoder.cs +++ b/src/Shared/runtime/Http2/Hpack/HPackEncoder.cs @@ -285,12 +285,7 @@ private static bool EncodeLiteralHeaderNewNameCore(byte mask, string name, strin } /// Encodes a "Literal Header Field without Indexing - New Name". - public static bool EncodeLiteralHeaderFieldWithoutIndexingNewName(string name, ReadOnlySpan values, string separator, Span destination, out int bytesWritten) - { - return EncodeLiteralHeaderFieldWithoutIndexingNewName(name, values, separator, valueEncoding: null, destination, out bytesWritten); - } - - public static bool EncodeLiteralHeaderFieldWithoutIndexingNewName(string name, ReadOnlySpan values, string separator, Encoding? valueEncoding, Span destination, out int bytesWritten) + public static bool EncodeLiteralHeaderFieldWithoutIndexingNewName(string name, ReadOnlySpan values, byte[] separator, Encoding? valueEncoding, Span destination, out int bytesWritten) { // From https://tools.ietf.org/html/rfc7541#section-6.2.2 // ------------------------------------------------------ @@ -515,12 +510,7 @@ public static bool EncodeDynamicTableSizeUpdate(int value, Span destinatio return false; } - public static bool EncodeStringLiterals(ReadOnlySpan values, string? separator, Span destination, out int bytesWritten) - { - return EncodeStringLiterals(values, separator, valueEncoding: null, destination, out bytesWritten); - } - - public static bool EncodeStringLiterals(ReadOnlySpan values, string? separator, Encoding? valueEncoding, Span destination, out int bytesWritten) + public static bool EncodeStringLiterals(ReadOnlySpan values, byte[]? separator, Encoding? valueEncoding, Span destination, out int bytesWritten) { bytesWritten = 0; @@ -536,23 +526,22 @@ public static bool EncodeStringLiterals(ReadOnlySpan values, string? sep if (destination.Length != 0) { Debug.Assert(separator != null); - int valueLength; + Debug.Assert(Ascii.IsValid(separator)); + int valueLength = checked((values.Length - 1) * separator.Length); - // Calculate length of all parts and separators. + // Calculate length of all values. if (valueEncoding is null || ReferenceEquals(valueEncoding, Encoding.Latin1)) { - valueLength = checked((int)(values.Length - 1) * separator.Length); foreach (string part in values) { - valueLength = checked((int)(valueLength + part.Length)); + valueLength = checked(valueLength + part.Length); } } else { - valueLength = checked((int)(values.Length - 1) * valueEncoding.GetByteCount(separator)); foreach (string part in values) { - valueLength = checked((int)(valueLength + valueEncoding.GetByteCount(part))); + valueLength = checked(valueLength + valueEncoding.GetByteCount(part)); } } @@ -571,7 +560,7 @@ public static bool EncodeStringLiterals(ReadOnlySpan values, string? sep for (int i = 1; i < values.Length; i++) { - EncodeValueStringPart(separator, destination); + separator.CopyTo(destination); destination = destination.Slice(separator.Length); value = values[i]; @@ -586,8 +575,8 @@ public static bool EncodeStringLiterals(ReadOnlySpan values, string? sep for (int i = 1; i < values.Length; i++) { - written = valueEncoding.GetBytes(separator, destination); - destination = destination.Slice(written); + separator.CopyTo(destination); + destination = destination.Slice(separator.Length); written = valueEncoding.GetBytes(values[i], destination); destination = destination.Slice(written); diff --git a/src/Shared/runtime/Http3/QPack/QPackEncoder.cs b/src/Shared/runtime/Http3/QPack/QPackEncoder.cs index aa951b249719..5d96530b457d 100644 --- a/src/Shared/runtime/Http3/QPack/QPackEncoder.cs +++ b/src/Shared/runtime/Http3/QPack/QPackEncoder.cs @@ -144,14 +144,9 @@ public static bool EncodeLiteralHeaderFieldWithoutNameReference(string name, str /// /// Encodes a Literal Header Field Without Name Reference, building the value by concatenating a collection of strings with separators. /// - public static bool EncodeLiteralHeaderFieldWithoutNameReference(string name, ReadOnlySpan values, string valueSeparator, Span destination, out int bytesWritten) + public static bool EncodeLiteralHeaderFieldWithoutNameReference(string name, ReadOnlySpan values, byte[] separator, Encoding? valueEncoding, Span destination, out int bytesWritten) { - return EncodeLiteralHeaderFieldWithoutNameReference(name, values, valueSeparator, valueEncoding: null, destination, out bytesWritten); - } - - public static bool EncodeLiteralHeaderFieldWithoutNameReference(string name, ReadOnlySpan values, string valueSeparator, Encoding? valueEncoding, Span destination, out int bytesWritten) - { - if (EncodeNameString(name, destination, out int nameLength) && EncodeValueString(values, valueSeparator, valueEncoding, destination.Slice(nameLength), out int valueLength)) + if (EncodeNameString(name, destination, out int nameLength) && EncodeValueString(values, separator, valueEncoding, destination.Slice(nameLength), out int valueLength)) { bytesWritten = nameLength + valueLength; return true; @@ -222,12 +217,7 @@ private static bool EncodeValueString(string s, Encoding? valueEncoding, Span /// Encodes a value by concatenating a collection of strings, separated by a separator string. /// - public static bool EncodeValueString(ReadOnlySpan values, string? separator, Span buffer, out int length) - { - return EncodeValueString(values, separator, valueEncoding: null, buffer, out length); - } - - public static bool EncodeValueString(ReadOnlySpan values, string? separator, Encoding? valueEncoding, Span buffer, out int length) + public static bool EncodeValueString(ReadOnlySpan values, byte[]? separator, Encoding? valueEncoding, Span buffer, out int length) { if (values.Length == 1) { @@ -243,10 +233,11 @@ public static bool EncodeValueString(ReadOnlySpan values, string? separa if (buffer.Length > 0) { Debug.Assert(separator != null); - int valueLength; + Debug.Assert(Ascii.IsValid(separator)); + int valueLength = separator.Length * (values.Length - 1); + if (valueEncoding is null || ReferenceEquals(valueEncoding, Encoding.Latin1)) { - valueLength = separator.Length * (values.Length - 1); foreach (string part in values) { valueLength += part.Length; @@ -254,7 +245,6 @@ public static bool EncodeValueString(ReadOnlySpan values, string? separa } else { - valueLength = valueEncoding.GetByteCount(separator) * (values.Length - 1); foreach (string part in values) { valueLength += valueEncoding.GetByteCount(part); @@ -275,7 +265,7 @@ public static bool EncodeValueString(ReadOnlySpan values, string? separa for (int i = 1; i < values.Length; i++) { - EncodeValueStringPart(separator, buffer); + separator.CopyTo(buffer); buffer = buffer.Slice(separator.Length); value = values[i]; @@ -290,8 +280,8 @@ public static bool EncodeValueString(ReadOnlySpan values, string? separa for (int i = 1; i < values.Length; i++) { - written = valueEncoding.GetBytes(separator, buffer); - buffer = buffer.Slice(written); + separator.CopyTo(buffer); + buffer = buffer.Slice(separator.Length); written = valueEncoding.GetBytes(values[i], buffer); buffer = buffer.Slice(written);