From ef71a2f5a72ab91dd906451fefe7ec01c18bc58f Mon Sep 17 00:00:00 2001 From: Arvi Saluste Date: Sun, 8 Dec 2024 10:45:41 +0200 Subject: [PATCH] Support .net 9 System.InvalidOperationException: The PipeWriter 'CapturePipeWriter' does not implement PipeWriter.UnflushedBytes. --- .github/workflows/build.yml | 2 +- .github/workflows/release.yml | 2 +- .../Rin.Extensions.EntityFrameworkCore.csproj | 2 +- .../Rin.Extensions.Log4NetAppender.csproj | 2 +- .../Rin.Extensions.MagicOnion.csproj | 2 +- src/Rin.Mvc/Rin.Mvc.csproj | 2 +- .../Rin.Storage.Redis.csproj | 2 +- .../RinRedisRecordStorageServiceExtensions.cs | 6 ++--- .../Resource/EmbeddedZipResourceProvider.cs | 6 ++--- src/Rin/Hubs/Payloads/BodyDataPayload.cs | 5 ++-- src/Rin/IO/CapturePipeWriter.cs | 12 +++++++-- .../Api/GetDetailByIdMiddleware.cs | 4 +-- src/Rin/Middlewares/DownloadMiddleware.cs | 26 +++++++++++++++---- .../Middlewares/RequestRecorderMiddleware.cs | 2 +- src/Rin/Rin.csproj | 2 +- 15 files changed, 50 insertions(+), 27 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fc10501..bccfe09 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,7 @@ jobs: - uses: actions/setup-dotnet@v1 with: - dotnet-version: '6.0.x' + dotnet-version: '9.0.x' - name: "Set VersionSuffix" run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3c4237c..d6b0da6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/setup-dotnet@v1 with: - dotnet-version: '6.0.x' + dotnet-version: '9.0.x' - name: "Set VersionSuffix for Preview" if: "contains(github.ref, 'refs/tags') && contains(github.ref, 'preview')" diff --git a/src/Rin.Extensions.EntityFrameworkCore/Rin.Extensions.EntityFrameworkCore.csproj b/src/Rin.Extensions.EntityFrameworkCore/Rin.Extensions.EntityFrameworkCore.csproj index a16a742..f23c29c 100644 --- a/src/Rin.Extensions.EntityFrameworkCore/Rin.Extensions.EntityFrameworkCore.csproj +++ b/src/Rin.Extensions.EntityFrameworkCore/Rin.Extensions.EntityFrameworkCore.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1;net5.0;net6.0 + netcoreapp3.1;net5.0;net6.0;net9.0 This package adds support for Entity Framwork Core to Rin Rin EntityFrameworkCore diff --git a/src/Rin.Extensions.Log4NetAppender/Rin.Extensions.Log4NetAppender.csproj b/src/Rin.Extensions.Log4NetAppender/Rin.Extensions.Log4NetAppender.csproj index 157aad4..3459e8e 100644 --- a/src/Rin.Extensions.Log4NetAppender/Rin.Extensions.Log4NetAppender.csproj +++ b/src/Rin.Extensions.Log4NetAppender/Rin.Extensions.Log4NetAppender.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1;net5.0;net6.0 + netcoreapp3.1;net5.0;net6.0;net9.0 This package adds support for tracing with log4net to Rin diff --git a/src/Rin.Extensions.MagicOnion/Rin.Extensions.MagicOnion.csproj b/src/Rin.Extensions.MagicOnion/Rin.Extensions.MagicOnion.csproj index 275bf8d..085af9d 100644 --- a/src/Rin.Extensions.MagicOnion/Rin.Extensions.MagicOnion.csproj +++ b/src/Rin.Extensions.MagicOnion/Rin.Extensions.MagicOnion.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1;net5.0;net6.0 + netcoreapp3.1;net5.0;net6.0;net9.0 This package adds support for MagicOnion to Rin Rin MagicOnion diff --git a/src/Rin.Mvc/Rin.Mvc.csproj b/src/Rin.Mvc/Rin.Mvc.csproj index aafd598..999e8db 100644 --- a/src/Rin.Mvc/Rin.Mvc.csproj +++ b/src/Rin.Mvc/Rin.Mvc.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1;net5.0;net6.0 + netcoreapp3.1;net5.0;net6.0;net9.0 This package adds support for ASP.NET Core MVC to Rin diff --git a/src/Rin.Storage.Redis/Rin.Storage.Redis.csproj b/src/Rin.Storage.Redis/Rin.Storage.Redis.csproj index 34bb69d..d6c75a7 100644 --- a/src/Rin.Storage.Redis/Rin.Storage.Redis.csproj +++ b/src/Rin.Storage.Redis/Rin.Storage.Redis.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1;net5.0 + netcoreapp3.1;net5.0;net9.0 This package adds support for Redis storage to Rin diff --git a/src/Rin.Storage.Redis/RinRedisRecordStorageServiceExtensions.cs b/src/Rin.Storage.Redis/RinRedisRecordStorageServiceExtensions.cs index 279f2d2..f5775b0 100644 --- a/src/Rin.Storage.Redis/RinRedisRecordStorageServiceExtensions.cs +++ b/src/Rin.Storage.Redis/RinRedisRecordStorageServiceExtensions.cs @@ -1,8 +1,5 @@ #nullable enable using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Text; using Microsoft.Extensions.DependencyInjection.Extensions; using Rin.Core.Record; using Rin.Extensions; @@ -21,7 +18,8 @@ public static class RinRedisRecordStorageServiceExtensions public static IRinBuilder UseRedisStorage(this IRinBuilder builder, Action? configure = null) { builder.Services.AddOptions(); - builder.Services.Configure(configure); + + if (configure != null) builder.Services.Configure(configure); builder.Services.Replace(new ServiceDescriptor(typeof(IRecordStorage), typeof(RedisRecordStorage), ServiceLifetime.Singleton)); diff --git a/src/Rin/Core/Resource/EmbeddedZipResourceProvider.cs b/src/Rin/Core/Resource/EmbeddedZipResourceProvider.cs index 2e9795c..1538780 100644 --- a/src/Rin/Core/Resource/EmbeddedZipResourceProvider.cs +++ b/src/Rin/Core/Resource/EmbeddedZipResourceProvider.cs @@ -1,4 +1,4 @@ -using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.IO; @@ -39,7 +39,7 @@ public async Task TryProcessAsync(HttpContext context) // for SPA (+ rewrite paths in HTML) else if ( context.Request.Headers.TryGetValue("Accept", out var acceptHeaders) && - acceptHeaders.Any(x => x.Contains("text/html")) && + acceptHeaders.Any(x => x != null && x.Contains("text/html")) && Resources.TryOpen("index.html", out resourceStream, out contentType) ) { @@ -63,7 +63,7 @@ private async Task WriteStreamToClientAsync(HttpContext context, Stream stream, context.Response.StatusCode = 200; context.Response.ContentType = contentType; - if (context.Request.Headers.TryGetValue("accept-encoding", out var headerValues) && headerValues.Any(x => x.Contains("gzip"))) + if (context.Request.Headers.TryGetValue("accept-encoding", out var headerValues) && headerValues.Any(x => x != null && x.Contains("gzip"))) { context.Response.Headers["Content-Encoding"] = "gzip"; using (var outputStream = new GZipStream(new ForceAsyncStreamWrapper(context.Response.Body), CompressionLevel.Fastest, true)) diff --git a/src/Rin/Hubs/Payloads/BodyDataPayload.cs b/src/Rin/Hubs/Payloads/BodyDataPayload.cs index 7aeedf6..aebd246 100644 --- a/src/Rin/Hubs/Payloads/BodyDataPayload.cs +++ b/src/Rin/Hubs/Payloads/BodyDataPayload.cs @@ -44,9 +44,10 @@ public static BodyDataPayload CreateFromRecord(HttpRequestRecord record, IDictio } } - if (payloadBodyContentType.StartsWith("text/") || + if (payloadBodyContentType != null && ( + payloadBodyContentType.StartsWith("text/") || payloadBodyContentType.StartsWith("application/json") || - payloadBodyContentType.StartsWith("application/x-www-form-urlencoded")) + payloadBodyContentType.StartsWith("application/x-www-form-urlencoded"))) { return new BodyDataPayload(Encoding.UTF8.GetString(payloadBody), false, transformedBodyContentType); } diff --git a/src/Rin/IO/CapturePipeWriter.cs b/src/Rin/IO/CapturePipeWriter.cs index ca29578..1234ca9 100644 --- a/src/Rin/IO/CapturePipeWriter.cs +++ b/src/Rin/IO/CapturePipeWriter.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.IO.Pipelines; using System.Threading; @@ -48,5 +48,13 @@ public override void Complete(Exception? exception = null) { return _pipeWriter.FlushAsync(cancellationToken); } + +#if NET9_0 + + public override bool CanGetUnflushedBytes => _pipeWriter.CanGetUnflushedBytes; + + public override long UnflushedBytes => _pipeWriter.UnflushedBytes; + +#endif } -} \ No newline at end of file +} diff --git a/src/Rin/Middlewares/Api/GetDetailByIdMiddleware.cs b/src/Rin/Middlewares/Api/GetDetailByIdMiddleware.cs index 8227439..234d44c 100644 --- a/src/Rin/Middlewares/Api/GetDetailByIdMiddleware.cs +++ b/src/Rin/Middlewares/Api/GetDetailByIdMiddleware.cs @@ -26,8 +26,8 @@ public async Task InvokeAsync(HttpContext context) await context.Response.WriteAsync("Missing required parameter: id"); return; } - - var result = await _storage.TryGetDetailByIdAsync(id); + + var result = await _storage.TryGetDetailByIdAsync(id!); if (!result.Succeed || result.Value == null) { context.Response.StatusCode = 404; diff --git a/src/Rin/Middlewares/DownloadMiddleware.cs b/src/Rin/Middlewares/DownloadMiddleware.cs index c9c5e37..626121a 100644 --- a/src/Rin/Middlewares/DownloadMiddleware.cs +++ b/src/Rin/Middlewares/DownloadMiddleware.cs @@ -1,4 +1,4 @@ -using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.FileProviders; using Microsoft.Net.Http.Headers; using Rin.Core; @@ -25,8 +25,16 @@ public DownloadRequestBodyMiddleware(RequestDelegate next, IRecordStorage storag public async Task InvokeAsync(HttpContext context) { - var result = await _storage.TryGetDetailByIdAsync(context.Request.Query["id"]); - var resultBody = await _storage.TryGetRequestBodyByIdAsync(context.Request.Query["id"]); + string? queryId = context.Request.Query["id"]; + + if (queryId == null) + { + context.Response.StatusCode = 404; + return; + } + + var result = await _storage.TryGetDetailByIdAsync(queryId); + var resultBody = await _storage.TryGetRequestBodyByIdAsync(queryId); var entry = result.Value; if (!result.Succeed || !resultBody.Succeed || entry == null) @@ -58,8 +66,16 @@ public DownloadResponseBodyMiddleware(RequestDelegate next, IRecordStorage stora public async Task InvokeAsync(HttpContext context) { - var result = await _storage.TryGetDetailByIdAsync(context.Request.Query["id"]); - var resultBody = await _storage.TryGetResponseBodyByIdAsync(context.Request.Query["id"]); + string? queryId = context.Request.Query["id"]; + + if (queryId == null) + { + context.Response.StatusCode = 404; + return; + } + + var result = await _storage.TryGetDetailByIdAsync(queryId); + var resultBody = await _storage.TryGetResponseBodyByIdAsync(queryId); var entry = result.Value; if (!result.Succeed || !resultBody.Succeed || entry == null) diff --git a/src/Rin/Middlewares/RequestRecorderMiddleware.cs b/src/Rin/Middlewares/RequestRecorderMiddleware.cs index f5bbac9..99ad560 100644 --- a/src/Rin/Middlewares/RequestRecorderMiddleware.cs +++ b/src/Rin/Middlewares/RequestRecorderMiddleware.cs @@ -112,7 +112,7 @@ private async Task PreprocessAsync(HttpContext context, RinOp { Id = Guid.NewGuid().ToString(), IsHttps = request.IsHttps, - Host = request.Host.Value, + Host = request.Host.Value!, QueryString = request.QueryString.Value, Path = request.Path, Method = request.Method, diff --git a/src/Rin/Rin.csproj b/src/Rin/Rin.csproj index 922820e..b558c59 100644 --- a/src/Rin/Rin.csproj +++ b/src/Rin/Rin.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1;net5.0;net6.0 + netcoreapp3.1;net5.0;net6.0;net9.0 enable