From 7e1291815cdfc7c561ef519376b56d0282bce8a8 Mon Sep 17 00:00:00 2001 From: Harald Wolff-Thobaben Date: Wed, 6 Apr 2022 21:48:51 +0200 Subject: [PATCH] Implement Stream and TextReader argument handling in HttpEndpointController.cs --- ln.http/HttpEndpointController.cs | 43 ++++++++++++++++++++++++++----- ln.http/ln.http.csproj | 2 +- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/ln.http/HttpEndpointController.cs b/ln.http/HttpEndpointController.cs index b251f43..c31742a 100644 --- a/ln.http/HttpEndpointController.cs +++ b/ln.http/HttpEndpointController.cs @@ -92,8 +92,14 @@ namespace ln.http } else if (_argumentSourceAttributes[n].ArgumentSource == HttpArgumentSource.CONTENT) { - if (httpContext.Request.Headers.TryGetValue("Content-Type", out string contentType) && - contentType.Equals("application/json")) + if (_parameterInfos[n].ParameterType.Equals(typeof(Stream))) + { + parameters[n] = httpContext.Request.ContentStream; + } else if (_parameterInfos[n].ParameterType.Equals(typeof(TextReader))) + { + parameters[n] = new StreamReader(httpContext.Request.ContentStream); + } else if (httpContext.Request.Headers.TryGetValue("Content-Type", out string contentType) && + contentType.Equals("application/json")) { using (TextReader reader = httpContext.Request.ContentStream.TextReader()) { @@ -135,11 +141,23 @@ namespace ln.http private object InvokeMethod(HttpContext httpContext) { - if (!TryApplyParameters(httpContext, out object[] parameters)) - return HttpResponse.InternalServerError().Content("could not apply parameters"); - else - return MethodInfo.Invoke(EndpointController, parameters); + object[] parameters = null; + try + { + if (!TryApplyParameters(httpContext, out parameters)) + return HttpResponse.InternalServerError().Content("could not apply parameters"); + else + { + return MethodInfo.Invoke(EndpointController, parameters); + } + } + finally + { + DisposeParameters(parameters); + } } + + public class NonVoidEndpoint : MappedEndpoint { @@ -182,7 +200,18 @@ namespace ln.http return true; } } - + + private void DisposeParameters(object[] parameters) + { + if (parameters is null) + return; + + foreach (var o in parameters) + { + if (o is IDisposable disposable) + disposable.Dispose(); + } + } } } diff --git a/ln.http/ln.http.csproj b/ln.http/ln.http.csproj index 60ef035..7936a67 100644 --- a/ln.http/ln.http.csproj +++ b/ln.http/ln.http.csproj @@ -10,7 +10,7 @@ (c) 2020 Harald Wolff-Thobaben http server 9 - 0.6.0 + 0.5.3