diff --git a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/WebPageResponseFilter.cs b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/WebPageResponseFilter.cs index cd97a01d..935d2282 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/WebPageResponseFilter.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Browsing/Models/WebPageResponseFilter.cs @@ -4,4 +4,14 @@ public class WebPageResponseFilter { public string Url { get; set; } = null!; public string[]? QueryParameters { get; set; } + + /// + /// contains, starts, ends, equals + /// + public string UrlMatchPattern { get; set; } = "contains"; + + /// + /// Handle Content-Type: text/x-component + /// + public int PartIndex { get; set; } = -1; } diff --git a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs index 4a67ffeb..2bbb0acf 100644 --- a/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs +++ b/src/Plugins/BotSharp.Plugin.WebDriver/Drivers/PlaywrightDriver/PlaywrightInstance.cs @@ -146,37 +146,41 @@ public class PlaywrightInstance : IDisposable { if (e.Status != 204 && e.Headers.ContainsKey("content-type") && - e.Headers["content-type"].Contains("application/json") && (e.Request.ResourceType == "fetch" || e.Request.ResourceType == "xhr") && (excludeResponseUrls == null || !excludeResponseUrls.Any(url => e.Url.ToLower().Contains(url))) && (includeResponseUrls == null || includeResponseUrls.Any(url => e.Url.ToLower().Contains(url)))) { Serilog.Log.Information($"{e.Request.Method}: {e.Url}"); - JsonElement? json = null; + try { - if (e.Status == 200 && e.Ok) - { - json = await e.JsonAsync(); - } - else - { - Serilog.Log.Warning($"Response status: {e.Status} {e.StatusText}, OK: {e.Ok}"); - } - var result = new WebPageResponseData { Url = e.Url.ToLower(), PostData = e.Request?.PostData ?? string.Empty, - ResponseData = JsonSerializer.Serialize(json), ResponseInMemory = responseInMemory }; + if (e.Headers["content-type"].Contains("application/json")) + { + if (e.Status == 200 && e.Ok) + { + var json = await e.JsonAsync(); + result.ResponseData = JsonSerializer.Serialize(json); + } + } + else + { + var html = await e.TextAsync(); + result.ResponseData = html; + } + if (responseContainer != null && responseInMemory) { responseContainer.Add(result); } + Serilog.Log.Warning($"Response status: {e.Status} {e.StatusText}, OK: {e.Ok}"); var webPageResponseHooks = _services.GetServices(); foreach (var hook in webPageResponseHooks) {