From 6e4bc557ba09dc46e5475bb09780de2f43c9ff1b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 5 Jan 2026 17:15:33 +0000 Subject: [PATCH 1/2] Initial plan From ab84cd08088f7c01af2571a717714bd1f66b3887 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 5 Jan 2026 17:24:35 +0000 Subject: [PATCH 2/2] Fix bot config error by avoiding DrapoComponentFile deserialization Co-authored-by: silvath <2657156+silvath@users.noreply.github.com> --- src/Middleware/Drapo/DrapoMiddleware.cs | 37 +++++++++++++++++-------- 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/src/Middleware/Drapo/DrapoMiddleware.cs b/src/Middleware/Drapo/DrapoMiddleware.cs index 3ad80bc12..1c601792a 100644 --- a/src/Middleware/Drapo/DrapoMiddleware.cs +++ b/src/Middleware/Drapo/DrapoMiddleware.cs @@ -1,6 +1,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -352,17 +353,27 @@ private async Task GetConfigContentForRequestAsync(HttpContext context) if (dynamicRoutes == null || dynamicRoutes.Count == 0) return baseContent; - // Deserialize the base config, add dynamic routes, and serialize back - DrapoConfig config = JsonConvert.DeserializeObject(baseContent); + // Parse JSON and add dynamic routes without full deserialization to avoid + // instantiation issues with abstract DrapoComponentFile class + JObject configJson = JObject.Parse(baseContent); - // Combine static routes with dynamic routes (dynamic routes take precedence) - // Pre-size the list for better performance - List combinedRoutes = new List(dynamicRoutes.Count + config.Routes.Count); - combinedRoutes.AddRange(dynamicRoutes); - combinedRoutes.AddRange(config.Routes); - config.Routes = combinedRoutes; + // Get existing routes array or create new one + JArray routesArray = configJson["Routes"] as JArray ?? new JArray(); - return JsonConvert.SerializeObject(config); + // Add dynamic routes at the beginning (they take precedence) + JArray newRoutesArray = new JArray(); + foreach (DrapoRoute route in dynamicRoutes) + { + newRoutesArray.Add(JObject.FromObject(route)); + } + foreach (JToken existingRoute in routesArray) + { + newRoutesArray.Add(existingRoute); + } + + configJson["Routes"] = newRoutesArray; + + return configJson.ToString(Formatting.None); } private bool IsBotRequest(HttpContext context) @@ -386,9 +397,11 @@ private bool IsBotRequest(HttpContext context) private string GetConfigContentForBot() { string configContent = GetConfigContent(); - DrapoConfig configBot = JsonConvert.DeserializeObject(configContent); - configBot.CanUseWebSocket = false; - return (JsonConvert.SerializeObject(configBot)); + // Parse JSON and modify CanUseWebSocket property without deserializing to avoid + // instantiation issues with abstract DrapoComponentFile class + JObject configJson = JObject.Parse(configContent); + configJson["CanUseWebSocket"] = false; + return configJson.ToString(Formatting.None); } private bool HasDynamicRoutes()