public static void WriteErrorDetailsResponseJson(this HttpContext Context, ErrorDetails errorDetails) { Context.Response.ContentType = "application/json"; using Utf8JsonWriter writer = new System.Text.Json.Utf8JsonWriter(Context.Response.BodyWriter); writer.WriteStartObject(); foreach (var item in errorDetails.GetType().GetProperties()) { writer.WritePropertyName(item.Name); if (item.PropertyType == typeof(int)) { writer.WriteNumberValue((int)item.GetValue(errorDetails)); } else if (item.PropertyType == typeof(string)) { writer.WriteStringValue(item.GetValue(errorDetails).ToString()); } } writer.WriteEndObject(); writer.Flush(); }
private static async Task Execute(string sql, HttpContext context) { context.Response.Headers.Add("Content-Type", "application/json"); var koraliumService = context.RequestServices.GetService <IKoraliumTransportService>(); var logger = context.RequestServices.GetService <ILogger <IKoraliumTransportService> >(); QueryResult result = null; try { result = await koraliumService.Execute(sql, new Shared.SqlParameters(), context); } catch (SqlErrorException error) { logger.LogWarning(error.Message); await WriteError(context, 400, error.Message); return; } catch (AuthorizationFailedException authFailed) { logger.LogWarning(authFailed.Message, authFailed); await WriteError(context, 401, authFailed.Message); return; } catch (Exception e) { logger.LogError(e, "Unexpected exception thrown"); await WriteError(context, 500, "Internal error"); return; } var responseStream = new System.Text.Json.Utf8JsonWriter(context.Response.Body); IJsonEncoder[] encoders = new IJsonEncoder[result.Columns.Count]; JsonEncodedText[] names = new JsonEncodedText[result.Columns.Count]; for (int i = 0; i < encoders.Length; i++) { encoders[i] = EncoderHelper.GetEncoder(result.Columns[i]); names[i] = JsonEncodedText.Encode(result.Columns[i].Name); } System.Diagnostics.Stopwatch encodingWatch = new System.Diagnostics.Stopwatch(); encodingWatch.Start(); responseStream.WriteStartObject(); responseStream.WriteStartArray(_valuesText); foreach (var row in result.Result) { responseStream.WriteStartObject(); for (int i = 0; i < encoders.Length; i++) { responseStream.WritePropertyName(names[i]); encoders[i].Encode(in responseStream, in row); } responseStream.WriteEndObject(); } responseStream.WriteEndArray(); responseStream.WriteEndObject(); encodingWatch.Stop(); await responseStream.FlushAsync(); }