Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/aspnetcore.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBrennan <brecon@microsoft.com>2022-10-24 23:17:53 +0300
committerGitHub <noreply@github.com>2022-10-24 23:17:53 +0300
commit8fa956fec929cccabda11a051cfcbac94bc94944 (patch)
tree3623fb5e87973a5d7daba46127ba3a33f32fdf70 /src
parentb35b7ac8b7196a53814b3b7766de6bb8fb07a256 (diff)
Improve StringBuilder usage (#44691)
Diffstat (limited to 'src')
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ResourceInvoker.Log.cs15
-rw-r--r--src/Security/Authentication/Facebook/src/FacebookHandler.cs2
-rw-r--r--src/Security/Authentication/Twitter/src/TwitterHandler.cs48
-rw-r--r--src/Servers/Kestrel/Core/src/Middleware/Internal/LoggingStream.cs18
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());