diff options
author | Brennan <brecon@microsoft.com> | 2022-10-24 23:17:53 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-24 23:17:53 +0300 |
commit | 8fa956fec929cccabda11a051cfcbac94bc94944 (patch) | |
tree | 3623fb5e87973a5d7daba46127ba3a33f32fdf70 /src | |
parent | b35b7ac8b7196a53814b3b7766de6bb8fb07a256 (diff) |
Improve StringBuilder usage (#44691)
Diffstat (limited to 'src')
4 files changed, 45 insertions, 38 deletions
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ResourceInvoker.Log.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ResourceInvoker.Log.cs index f34b1e5e53..5e997ba924 100644 --- a/src/Mvc/Mvc.Core/src/Infrastructure/ResourceInvoker.Log.cs +++ b/src/Mvc/Mvc.Core/src/Infrastructure/ResourceInvoker.Log.cs @@ -1,7 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Linq; +using System.Globalization; using System.Reflection; using System.Text; using Microsoft.AspNetCore.Mvc.Abstractions; @@ -21,20 +21,21 @@ internal partial class ResourceInvoker { if (logger.IsEnabled(LogLevel.Information)) { - var routeKeys = action.RouteValues.Keys.ToArray(); - var routeValues = action.RouteValues.Values.ToArray(); var stringBuilder = new StringBuilder(); stringBuilder.Append('{'); - for (var i = 0; i < routeValues.Length; i++) + var index = 0; + var count = action.RouteValues.Count; + foreach (var (key, value) in action.RouteValues) { - if (i == routeValues.Length - 1) + if (index == count - 1) { - stringBuilder.Append(FormattableString.Invariant($"{routeKeys[i]} = \"{routeValues[i]}\"")); + stringBuilder.Append(CultureInfo.InvariantCulture, $"{key} = \"{value}\""); } else { - stringBuilder.Append(FormattableString.Invariant($"{routeKeys[i]} = \"{routeValues[i]}\", ")); + stringBuilder.Append(CultureInfo.InvariantCulture, $"{key} = \"{value}\", "); } + index++; } stringBuilder.Append('}'); diff --git a/src/Security/Authentication/Facebook/src/FacebookHandler.cs b/src/Security/Authentication/Facebook/src/FacebookHandler.cs index 0c91dfc664..c2e65e59fc 100644 --- a/src/Security/Authentication/Facebook/src/FacebookHandler.cs +++ b/src/Security/Authentication/Facebook/src/FacebookHandler.cs @@ -64,7 +64,7 @@ public class FacebookHandler : OAuthHandler<FacebookOptions> var builder = new StringBuilder(); for (int i = 0; i < hash.Length; i++) { - builder.Append(hash[i].ToString("x2", CultureInfo.InvariantCulture)); + builder.Append(CultureInfo.InvariantCulture, $"{hash[i]:x2}"); } return builder.ToString(); } diff --git a/src/Security/Authentication/Twitter/src/TwitterHandler.cs b/src/Security/Authentication/Twitter/src/TwitterHandler.cs index 6c91b2d9f2..00147aa4cc 100644 --- a/src/Security/Authentication/Twitter/src/TwitterHandler.cs +++ b/src/Security/Authentication/Twitter/src/TwitterHandler.cs @@ -203,46 +203,48 @@ public partial class TwitterHandler : RemoteAuthenticationHandler<TwitterOptions } } - var parameterBuilder = new StringBuilder(); + var stringBuilder = new StringBuilder(); foreach (var signaturePart in signatureParts) { - parameterBuilder.AppendFormat(CultureInfo.InvariantCulture, "{0}={1}&", Uri.EscapeDataString(signaturePart.Key), Uri.EscapeDataString(signaturePart.Value)); + stringBuilder.AppendFormat(CultureInfo.InvariantCulture, "{0}={1}&", Uri.EscapeDataString(signaturePart.Key), Uri.EscapeDataString(signaturePart.Value)); } - parameterBuilder.Length--; - var parameterString = parameterBuilder.ToString(); - - var canonicalizedRequestBuilder = new StringBuilder(); - canonicalizedRequestBuilder.Append(httpMethod.Method); - canonicalizedRequestBuilder.Append('&'); - canonicalizedRequestBuilder.Append(Uri.EscapeDataString(url)); - canonicalizedRequestBuilder.Append('&'); - canonicalizedRequestBuilder.Append(Uri.EscapeDataString(parameterString)); - - var signature = ComputeSignature(Options.ConsumerSecret!, accessToken?.TokenSecret, canonicalizedRequestBuilder.ToString()); + stringBuilder.Length--; + var parameterString = stringBuilder.ToString(); + stringBuilder.Clear(); + + stringBuilder.Append(httpMethod.Method); + stringBuilder.Append('&'); + stringBuilder.Append(Uri.EscapeDataString(url)); + stringBuilder.Append('&'); + stringBuilder.Append(Uri.EscapeDataString(parameterString)); + + var signature = ComputeSignature(Options.ConsumerSecret!, accessToken?.TokenSecret, stringBuilder.ToString()); + stringBuilder.Clear(); authorizationParts.Add("oauth_signature", signature); var queryString = ""; if (queryParameters != null) { - var queryStringBuilder = new StringBuilder("?"); + stringBuilder.Append('?'); foreach (var queryParam in queryParameters) { - queryStringBuilder.AppendFormat(CultureInfo.InvariantCulture, "{0}={1}&", queryParam.Key, queryParam.Value); + stringBuilder.AppendFormat(CultureInfo.InvariantCulture, "{0}={1}&", queryParam.Key, queryParam.Value); } - queryStringBuilder.Length--; - queryString = queryStringBuilder.ToString(); + stringBuilder.Length--; + queryString = stringBuilder.ToString(); + stringBuilder.Clear(); } - var authorizationHeaderBuilder = new StringBuilder(); - authorizationHeaderBuilder.Append("OAuth "); + stringBuilder.Append("OAuth "); foreach (var authorizationPart in authorizationParts) { - authorizationHeaderBuilder.AppendFormat(CultureInfo.InvariantCulture, "{0}=\"{1}\",", authorizationPart.Key, Uri.EscapeDataString(authorizationPart.Value)); + stringBuilder.AppendFormat(CultureInfo.InvariantCulture, "{0}=\"{1}\",", authorizationPart.Key, Uri.EscapeDataString(authorizationPart.Value)); } - authorizationHeaderBuilder.Length--; + stringBuilder.Length--; var request = new HttpRequestMessage(httpMethod, url + queryString); - request.Headers.Add("Authorization", authorizationHeaderBuilder.ToString()); + request.Headers.Add("Authorization", stringBuilder.ToString()); + stringBuilder.Clear(); // This header is so that the error response is also JSON - without it the success response is already JSON request.Headers.Add("Accept", "application/json"); @@ -380,7 +382,7 @@ public partial class TwitterHandler : RemoteAuthenticationHandler<TwitterOptions foreach (var error in errorResponse.Errors) { errorMessageStringBuilder.Append(Environment.NewLine); - errorMessageStringBuilder.Append(FormattableString.Invariant($"Code: {error.Code}, Message: '{error.Message}'")); + errorMessageStringBuilder.Append(CultureInfo.InvariantCulture, $"Code: {error.Code}, Message: '{error.Message}'"); } } diff --git a/src/Servers/Kestrel/Core/src/Middleware/Internal/LoggingStream.cs b/src/Servers/Kestrel/Core/src/Middleware/Internal/LoggingStream.cs index af3164df75..924398acbc 100644 --- a/src/Servers/Kestrel/Core/src/Middleware/Internal/LoggingStream.cs +++ b/src/Servers/Kestrel/Core/src/Middleware/Internal/LoggingStream.cs @@ -165,22 +165,25 @@ internal sealed class LoggingStream : Stream builder.AppendLine(); } - var charBuilder = new StringBuilder(); + // A maximum of 2 8 byte segments are written at once with a space between them, meaning 17 characters can be written + // ........ ........ + Span<char> charBuilder = stackalloc char[17]; + var charBuilderIndex = 0; // Write the hex for (int i = 0; i < buffer.Length; i++) { - builder.Append(buffer[i].ToString("X2", CultureInfo.InvariantCulture)); + builder.Append(CultureInfo.InvariantCulture, $"{buffer[i]:X2}"); builder.Append(' '); var bufferChar = (char)buffer[i]; if (char.IsControl(bufferChar)) { - charBuilder.Append('.'); + charBuilder[charBuilderIndex++] = '.'; } else { - charBuilder.Append(bufferChar); + charBuilder[charBuilderIndex++] = bufferChar; } if ((i + 1) % 16 == 0) @@ -192,11 +195,12 @@ internal sealed class LoggingStream : Stream builder.AppendLine(); } charBuilder.Clear(); + charBuilderIndex = 0; } else if ((i + 1) % 8 == 0) { builder.Append(' '); - charBuilder.Append(' '); + charBuilder[charBuilderIndex++] = ' '; } } @@ -213,8 +217,8 @@ internal sealed class LoggingStream : Stream padLength++; } - builder.Append(new string(' ', padLength)); - builder.Append(charBuilder); + builder.Append(' ', padLength); + builder.Append(charBuilder.Slice(0, charBuilderIndex)); } _logger.LogDebug(builder.ToString()); |