diff --git a/ContentScanningService/HashScanner.cs b/ContentScanningService/HashScanner.cs index 8ad6c47..6a81489 100644 --- a/ContentScanningService/HashScanner.cs +++ b/ContentScanningService/HashScanner.cs @@ -14,6 +14,7 @@ namespace Teknik.ContentScanningService public class HashScanner : ContentScanner { private static readonly HttpClient _client = new HttpClient(); + public HashScanner(Config config) : base(config) { } diff --git a/Teknik/Areas/User/Utility/IdentityHelper.cs b/Teknik/Areas/User/Utility/IdentityHelper.cs index 6846886..7a67f11 100644 --- a/Teknik/Areas/User/Utility/IdentityHelper.cs +++ b/Teknik/Areas/User/Utility/IdentityHelper.cs @@ -16,6 +16,8 @@ namespace Teknik.Areas.Users.Utility { public static class IdentityHelper { + private static HttpClient _httpClient = new HttpClient(); + public static async Task GetAccessToken(this HttpClient client, Config config) { var token = await client.GetAccessToken(config.UserConfig.IdentityServerConfig.Authority, config.UserConfig.IdentityServerConfig.ClientId, config.UserConfig.IdentityServerConfig.ClientSecret, "auth-api"); @@ -48,10 +50,9 @@ namespace Teknik.Areas.Users.Utility public static async Task Get(Config config, Uri url) { - var client = new HttpClient(); - await client.GetAccessToken(config); + await _httpClient.GetAccessToken(config); - var content = await client.GetStringAsync(url); + var content = await _httpClient.GetStringAsync(url); if (!string.IsNullOrEmpty(content)) { return JsonConvert.DeserializeObject(content); @@ -62,11 +63,10 @@ namespace Teknik.Areas.Users.Utility public static async Task Post(Config config, Uri url, object data) { - var client = new HttpClient(); - await client.GetAccessToken(config); + await _httpClient.GetAccessToken(config); - var response = await client.PostAsJsonAsync(url, data); + var response = await _httpClient.PostAsJsonAsync(url, data); if (response.IsSuccessStatusCode) { string content = await response.Content.ReadAsStringAsync(); diff --git a/Utilities/Cryptography/AesCounterStream.cs b/Utilities/Cryptography/AesCounterStream.cs index b0e7182..17763c0 100644 --- a/Utilities/Cryptography/AesCounterStream.cs +++ b/Utilities/Cryptography/AesCounterStream.cs @@ -248,8 +248,8 @@ namespace Teknik.Utilities.Cryptography protected override void Dispose(bool disposing) { - _Cipher.Dispose(); _Inner.Dispose(); + _Cipher.Dispose(); base.Dispose(disposing); } diff --git a/Utilities/PooledArray.cs b/Utilities/PooledArray.cs new file mode 100644 index 0000000..da81132 --- /dev/null +++ b/Utilities/PooledArray.cs @@ -0,0 +1,26 @@ +using System; +using System.Buffers; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Teknik.Utilities +{ + public class PooledArray : IDisposable + { + private static ArrayPool _arrayPool = ArrayPool.Create(); + + public byte[] Array { get; private set; } + + public PooledArray(int size) + { + Array = _arrayPool.Rent(size); + } + + public void Dispose() + { + _arrayPool.Return(Array); + } + } +} diff --git a/Utilities/ResponseHelper.cs b/Utilities/ResponseHelper.cs index 6338c3a..fad4406 100644 --- a/Utilities/ResponseHelper.cs +++ b/Utilities/ResponseHelper.cs @@ -13,20 +13,22 @@ namespace Teknik.Utilities { public async static Task StreamToOutput(HttpResponse response, Stream stream, int length, int chunkSize) { - response.RegisterForDisposeAsync(stream); var bufferSize = chunkSize; if (length < chunkSize) bufferSize = length; - Memory buffer = new byte[bufferSize]; + var pooledArray = new PooledArray(bufferSize); + + response.RegisterForDispose(stream); + response.RegisterForDispose(pooledArray); try { int processedBytes; do { - processedBytes = await stream.ReadAsync(buffer); + processedBytes = await stream.ReadAsync(pooledArray.Array); if (processedBytes > 0) { - await response.Body.WriteAsync(buffer.Slice(0, processedBytes)); + await response.Body.WriteAsync(pooledArray.Array, 0, processedBytes); await response.Body.FlushAsync(); }