Implement Stream and TextReader argument handling in HttpEndpointController.cs

master
Harald Wolff 2022-04-06 21:48:51 +02:00
parent a26c4e33b5
commit 7e1291815c
2 changed files with 37 additions and 8 deletions

View File

@ -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();
}
}
}
}

View File

@ -10,7 +10,7 @@
<Copyright>(c) 2020 Harald Wolff-Thobaben</Copyright>
<PackageTags>http server</PackageTags>
<LangVersion>9</LangVersion>
<PackageVersion>0.6.0</PackageVersion>
<PackageVersion>0.5.3</PackageVersion>
</PropertyGroup>
<ItemGroup>