using System.Reflection; using System.Text; using System.Text.Json.Nodes; using Connected.Interop; using Connected.Net; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.WebUtilities; namespace Connected.Rest; internal class FormFormatter : ApiFormatter { public const string ContentType = "application/x-www-form-urlencoded"; protected override async Task OnParseArguments() { using var reader = new StreamReader(Context.Request.Body, Encoding.UTF8); var body = await reader.ReadToEndAsync(); var qs = QueryHelpers.ParseNullableQuery(body); var result = new JsonObject(); foreach (var q in qs) result.Add(q.Key, JsonValue.Create(q.Value)); Context.SetRequestArguments(result); return result; } protected override async Task OnRenderResult(object content) { if (Context.Response.HasStarted) { var qs = new QueryString(); if (content is not null) { foreach (var property in content.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)) { if (!property.PropertyType.IsTypePrimitive()) continue; qs.Add(property.Name.ToCamelCase(), property.GetValue(content) as string); } } var buffer = Encoding.UTF8.GetBytes(qs.ToUriComponent()); Context.Response.Clear(); Context.Response.ContentLength = buffer.Length; Context.Response.ContentType = ContentType; Context.Response.StatusCode = StatusCodes.Status200OK; await Context.Response.Body.WriteAsync(buffer); } await Context.Response.CompleteAsync(); } protected override async Task OnRenderError(int statusCode, string message) { Context.Response.ContentType = ContentType; Context.Response.StatusCode = statusCode; var qs = new QueryString(); qs.Add("message", message); var buffer = Encoding.UTF8.GetBytes(qs.ToUriComponent()); Context.Response.ContentLength = buffer.Length; await Context.Response.Body.WriteAsync(buffer); await Context.Response.CompleteAsync(); } }