|
4 | 4 | using System.Buffers; |
5 | 5 | using System.Diagnostics.CodeAnalysis; |
6 | 6 | using System.Runtime.CompilerServices; |
7 | | -using System.Text; |
8 | 7 |
|
9 | 8 | namespace Microsoft.AspNetCore.Http.Extensions; |
10 | 9 |
|
@@ -210,18 +209,48 @@ public static string GetDisplayUrl(this HttpRequest request) |
210 | 209 | var path = request.Path.Value ?? string.Empty; |
211 | 210 | var queryString = request.QueryString.Value ?? string.Empty; |
212 | 211 |
|
213 | | - // PERF: Calculate string length to allocate correct buffer size for StringBuilder. |
214 | 212 | var length = scheme.Length + SchemeDelimiter.Length + host.Length |
215 | 213 | + pathBase.Length + path.Length + queryString.Length; |
216 | 214 |
|
217 | | - return new StringBuilder(length) |
218 | | - .Append(scheme) |
219 | | - .Append(SchemeDelimiter) |
220 | | - .Append(host) |
221 | | - .Append(pathBase) |
222 | | - .Append(path) |
223 | | - .Append(queryString) |
224 | | - .ToString(); |
| 215 | + return string.Create( |
| 216 | + length, |
| 217 | + (scheme, host, pathBase, path, queryString), |
| 218 | + static (buffer, uriParts) => |
| 219 | + { |
| 220 | + var (scheme, host, pathBase, path, queryString) = uriParts; |
| 221 | + |
| 222 | + if (scheme.Length > 0) |
| 223 | + { |
| 224 | + scheme.CopyTo(buffer); |
| 225 | + buffer = buffer.Slice(scheme.Length); |
| 226 | + } |
| 227 | + |
| 228 | + SchemeDelimiter.CopyTo(buffer); |
| 229 | + buffer = buffer.Slice(SchemeDelimiter.Length); |
| 230 | + |
| 231 | + if (host.Length > 0) |
| 232 | + { |
| 233 | + host.CopyTo(buffer); |
| 234 | + buffer = buffer.Slice(host.Length); |
| 235 | + } |
| 236 | + |
| 237 | + if (pathBase.Length > 0) |
| 238 | + { |
| 239 | + pathBase.CopyTo(buffer); |
| 240 | + buffer = buffer.Slice(pathBase.Length); |
| 241 | + } |
| 242 | + |
| 243 | + if (path.Length > 0) |
| 244 | + { |
| 245 | + path.CopyTo(buffer); |
| 246 | + buffer = buffer.Slice(path.Length); |
| 247 | + } |
| 248 | + |
| 249 | + if (queryString.Length > 0) |
| 250 | + { |
| 251 | + queryString.CopyTo(buffer); |
| 252 | + } |
| 253 | + }); |
225 | 254 | } |
226 | 255 |
|
227 | 256 | /// <summary> |
|
0 commit comments