diff --git a/Api/Api.csproj b/Api/Api.csproj index 74605603c0ed6ca8ec648feb9e3a6b2bf5c14408..0a4573764af08a3b16e3197e5f9940577fe567b4 100644 --- a/Api/Api.csproj +++ b/Api/Api.csproj @@ -13,6 +13,7 @@ <PrivateAssets>all</PrivateAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> </PackageReference> + <PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" /> </ItemGroup> diff --git a/Api/Middleware/ResponseFormatMiddleware.cs b/Api/Middleware/ResponseFormatMiddleware.cs new file mode 100644 index 0000000000000000000000000000000000000000..6e72ae3df40278294952025b53288a6d1f7c0366 --- /dev/null +++ b/Api/Middleware/ResponseFormatMiddleware.cs @@ -0,0 +1,57 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System.Xml; + +public class ResponseFormatMiddleware +{ + private readonly RequestDelegate _next; + + public ResponseFormatMiddleware(RequestDelegate next) => _next = next; + + public async Task InvokeAsync(HttpContext context) + { + var originalBodyStream = context.Response.Body; + using var responseBody = new MemoryStream(); + context.Response.Body = responseBody; + + await _next(context); + + context.Response.Body.Seek(0, SeekOrigin.Begin); + var responseText = await new StreamReader(context.Response.Body).ReadToEndAsync(); + + context.Response.Body.Seek(0, SeekOrigin.Begin); + context.Response.Body = originalBodyStream; + + if (context.Request.Query.TryGetValue("format", out var formatValue) && formatValue.ToString().Equals("xml", StringComparison.OrdinalIgnoreCase)) + { + context.Response.ContentType = "application/xml"; + await context.Response.WriteAsync(ConvertJsonToXml(responseText)); + } + else + { + context.Response.ContentType = "application/json"; + await context.Response.WriteAsync(responseText); + } + } + + private string ConvertJsonToXml(string json) + { + try + { + JToken parsedJson = JToken.Parse(json); + if (parsedJson is JArray) json = $"{{\"Root\": {json}}}"; + + var doc = JsonConvert.DeserializeXmlNode(json, "Root"); + if (doc == null) return "<error>Unable to convert JSON to XML; null document</error>"; + + using var stringWriter = new StringWriter(); + using var xmlTextWriter = new XmlTextWriter(stringWriter); + doc.WriteTo(xmlTextWriter); + return stringWriter.ToString(); + } + catch + { + return "<error>Unable to convert JSON to XML</error>"; + } + } +} diff --git a/Api/Program.cs b/Api/Program.cs index 8866be6498afd6acc0485e1a56e8cffb418aeb12..a5757e372827a229dab88a48b4991bdfa9f7a39c 100644 --- a/Api/Program.cs +++ b/Api/Program.cs @@ -102,8 +102,8 @@ app.UseHttpsRedirection(); app.UseAuthorization(); app.UseMiddleware<AuthenticationMiddleware>(); - app.UseMiddleware<RequestLoggingMiddleware>(); +app.UseMiddleware<ResponseFormatMiddleware>(); app.MapControllers();