From 15efed02a5332231eabdb69eec68d5a6d1375308 Mon Sep 17 00:00:00 2001 From: jdevito Date: Wed, 1 Feb 2023 09:43:52 -0600 Subject: [PATCH] fix: resolved issue with GetTypes request handlers causing a 500 error response; updated debug constants to default levels --- .../Factory/DeviceFactory.cs | 6 +- .../RequestHandlers/AppDebugRequestHandler.cs | 4 +- .../RequestHandlers/DefaultRequestHandler.cs | 36 +++++----- .../RequestHandlers/DevJsonRequestHandler.cs | 4 +- .../RequestHandlers/DevListRequestHandler.cs | 4 +- .../RequestHandlers/DevPropsRequestHandler.cs | 4 +- .../DisableAllStreamDebugRequestHandler.cs | 5 ++ .../GetJoinMapForBridgeKeyRequestHandler.cs | 4 +- .../GetJoinMapForDeviceKeyRequestHandler.cs | 4 +- .../GetTypesByFilterRequestHandler.cs | 57 ++++++++------- .../RequestHandlers/GetTypesRequestHandler.cs | 69 ++++++++++++------- .../ReportVersionsRequestHandler.cs | 4 +- .../SetDeviceStreamDebugRequestHandler.cs | 4 +- .../ShowConfigRequestHandler.cs | 4 +- 14 files changed, 122 insertions(+), 87 deletions(-) diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Factory/DeviceFactory.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Factory/DeviceFactory.cs index 9cbd8731..bad3e531 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Factory/DeviceFactory.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Factory/DeviceFactory.cs @@ -212,9 +212,9 @@ namespace PepperDash.Essentials.Core /// public static Dictionary GetDeviceFactoryDictionary(string filter) { - return !string.IsNullOrEmpty(filter) - ? FactoryMethods.Where(k => k.Key.Contains(filter)).ToDictionary(k => k.Key, k => k.Value) - : FactoryMethods; + return string.IsNullOrEmpty(filter) + ? FactoryMethods + : FactoryMethods.Where(k => k.Key.Contains(filter)).ToDictionary(k => k.Key, k => k.Value); } } } \ No newline at end of file diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/AppDebugRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/AppDebugRequestHandler.cs index f88ae849..ad413b7f 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/AppDebugRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/AppDebugRequestHandler.cs @@ -11,8 +11,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers { private const string Key = "AppDebugRequestHandler"; private const uint Trace = 0; - private const uint Info = 0; - private const uint Verbose = 0; + private const uint Info = 1; + private const uint Verbose = 2; /// /// Handles CONNECT method requests diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DefaultRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DefaultRequestHandler.cs index 2cd55d4d..19bc8cb3 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DefaultRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DefaultRequestHandler.cs @@ -16,8 +16,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers /// protected override void HandleConnect(HttpCwsContext context) { - context.Response.StatusCode = 501; - context.Response.StatusDescription = "Not Implemented"; + context.Response.StatusCode = 418; + context.Response.StatusDescription = "I'm a teapot"; context.Response.End(); } @@ -27,8 +27,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers /// protected override void HandleDelete(HttpCwsContext context) { - context.Response.StatusCode = 501; - context.Response.StatusDescription = "Not Implemented"; + context.Response.StatusCode = 418; + context.Response.StatusDescription = "I'm a teapot"; context.Response.End(); } @@ -38,8 +38,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers /// protected override void HandleGet(HttpCwsContext context) { - context.Response.StatusCode = 501; - context.Response.StatusDescription = "Not Implemented"; + context.Response.StatusCode = 418; + context.Response.StatusDescription = "I'm a teapot"; context.Response.End(); } @@ -49,8 +49,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers /// protected override void HandleHead(HttpCwsContext context) { - context.Response.StatusCode = 501; - context.Response.StatusDescription = "Not Implemented"; + context.Response.StatusCode = 418; + context.Response.StatusDescription = "I'm a teapot"; context.Response.End(); } @@ -60,8 +60,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers /// protected override void HandleOptions(HttpCwsContext context) { - context.Response.StatusCode = 501; - context.Response.StatusDescription = "Not Implemented"; + context.Response.StatusCode = 418; + context.Response.StatusDescription = "I'm a teapot"; context.Response.End(); } @@ -71,8 +71,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers /// protected override void HandlePatch(HttpCwsContext context) { - context.Response.StatusCode = 501; - context.Response.StatusDescription = "Not Implemented"; + context.Response.StatusCode = 418; + context.Response.StatusDescription = "I'm a teapot"; context.Response.End(); } @@ -82,8 +82,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers /// protected override void HandlePost(HttpCwsContext context) { - context.Response.StatusCode = 501; - context.Response.StatusDescription = "Not Implemented"; + context.Response.StatusCode = 418; + context.Response.StatusDescription = "I'm a teapot"; context.Response.End(); } @@ -93,8 +93,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers /// protected override void HandlePut(HttpCwsContext context) { - context.Response.StatusCode = 501; - context.Response.StatusDescription = "Not Implemented"; + context.Response.StatusCode = 418; + context.Response.StatusDescription = "I'm a teapot"; context.Response.End(); } @@ -104,8 +104,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers /// protected override void HandleTrace(HttpCwsContext context) { - context.Response.StatusCode = 501; - context.Response.StatusDescription = "Not Implemented"; + context.Response.StatusCode = 418; + context.Response.StatusDescription = "I'm a teapot"; context.Response.End(); } } diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevJsonRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevJsonRequestHandler.cs index d4cdac38..300b36f7 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevJsonRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevJsonRequestHandler.cs @@ -10,8 +10,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers { private const string Key = "DevJsonRequestHandler"; private const uint Trace = 0; - private const uint Info = 0; - private const uint Verbose = 0; + private const uint Info = 1; + private const uint Verbose = 2; /// /// Handles CONNECT method requests diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevListRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevListRequestHandler.cs index faa0fff3..a10e66fb 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevListRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevListRequestHandler.cs @@ -10,8 +10,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers { private const string Key = "DevListRequestHandler"; private const uint Trace = 0; - private const uint Info = 0; - private const uint Verbose = 0; + private const uint Info = 1; + private const uint Verbose = 2; /// /// Handles CONNECT method requests diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevPropsRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevPropsRequestHandler.cs index 34ab4f77..9f254ec5 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevPropsRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevPropsRequestHandler.cs @@ -11,8 +11,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers { private const string Key = "DevPropsRequestHandler"; private const uint Trace = 0; - private const uint Info = 0; - private const uint Verbose = 0; + private const uint Info = 1; + private const uint Verbose = 2; /// /// Handles CONNECT method requests diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DisableAllStreamDebugRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DisableAllStreamDebugRequestHandler.cs index 8cfc7315..cec258be 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DisableAllStreamDebugRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DisableAllStreamDebugRequestHandler.cs @@ -5,6 +5,11 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers { public class DisableAllStreamDebugRequestHandler : WebApiBaseRequestHandler { + private const string Key = "DisableAllStreamDebugRequestHandler"; + private const uint Trace = 0; + private const uint Info = 1; + private const uint Verbose = 2; + /// /// Handles CONNECT method requests /// diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetJoinMapForBridgeKeyRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetJoinMapForBridgeKeyRequestHandler.cs index 0421266f..766cda57 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetJoinMapForBridgeKeyRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetJoinMapForBridgeKeyRequestHandler.cs @@ -10,8 +10,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers { private const string Key = "GetJoinMapForBridgeKeyRequestHandler"; private const uint Trace = 0; - private const uint Info = 0; - private const uint Verbose = 0; + private const uint Info = 1; + private const uint Verbose = 2; /// /// Handles CONNECT method requests diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetJoinMapForDeviceKeyRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetJoinMapForDeviceKeyRequestHandler.cs index 863e3d29..fd7a11dd 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetJoinMapForDeviceKeyRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetJoinMapForDeviceKeyRequestHandler.cs @@ -11,8 +11,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers { private const string Key = "GetJoinMapForDeviceKeyRequestHandler"; private const uint Trace = 0; - private const uint Info = 0; - private const uint Verbose = 0; + private const uint Info = 1; + private const uint Verbose = 2; /// /// Handles CONNECT method requests diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetTypesByFilterRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetTypesByFilterRequestHandler.cs index 42cf84c0..ee839c06 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetTypesByFilterRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetTypesByFilterRequestHandler.cs @@ -1,8 +1,9 @@ -using Crestron.SimplSharp.WebScripting; +using System; +using System.Linq; +using Crestron.SimplSharp.WebScripting; using Newtonsoft.Json; using PepperDash.Core; using PepperDash.Core.Web.RequestHandlers; -using PepperDash.Essentials.Core.Bridges; namespace PepperDash.Essentials.Core.Web.RequestHandlers { @@ -10,8 +11,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers { private const string Key = "GetTypesByFilterRequestHandler"; private const uint Trace = 0; - private const uint Info = 0; - private const uint Verbose = 0; + private const uint Info = 1; + private const uint Verbose = 2; /// /// Handles CONNECT method requests @@ -51,10 +52,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers return; } - var routeDataJson = JsonConvert.SerializeObject(routeData, Formatting.Indented); - Debug.Console(Verbose, "routeData:\n{0}", routeDataJson); - + Debug.Console(Verbose, "[{0}] routeData:\n{1}", Key.ToLower(), routeDataJson); object filterObj; if (!routeData.Values.TryGetValue("filter", out filterObj)) @@ -68,11 +67,15 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers return; } - var types = DeviceFactory.GetDeviceFactoryDictionary(filterObj.ToString()); + var types = DeviceFactory.GetDeviceFactoryDictionary(filterObj.ToString()).Select(type => new + { + Type = type.Key, + Description = type.Value.Description, + CType = type.Value.CType == null ? "---" : type.Value.CType.ToString() + }).Cast().ToList(); + if (types == null) { - Debug.Console(Verbose, "Get device type from dictionary failed"); - context.Response.StatusCode = 400; context.Response.StatusDescription = "Bad Request"; context.Response.End(); @@ -80,22 +83,28 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers return; } - var js = JsonConvert.SerializeObject(types, Formatting.Indented, new JsonSerializerSettings + try { - ReferenceLoopHandling = ReferenceLoopHandling.Ignore, - NullValueHandling = NullValueHandling.Ignore, - MissingMemberHandling = MissingMemberHandling.Ignore, - DefaultValueHandling = DefaultValueHandling.Ignore, - TypeNameHandling = TypeNameHandling.None - }); - Debug.Console(Verbose, "[{0}] HandleGet: \x0d\x0a{1}", Key.ToLower(), js); + var js = JsonConvert.SerializeObject(types, Formatting.Indented); + //Debug.Console(Verbose, "[{0}] HandleGet: \x0d\x0a{1}", Key.ToLower(), js); - context.Response.StatusCode = 200; - context.Response.StatusDescription = "OK"; - context.Response.ContentType = "application/json"; - context.Response.ContentEncoding = System.Text.Encoding.UTF8; - context.Response.Write(js, false); - context.Response.End(); + context.Response.StatusCode = 200; + context.Response.StatusDescription = "OK"; + context.Response.ContentType = "application/json"; + context.Response.ContentEncoding = System.Text.Encoding.UTF8; + context.Response.Write(js, false); + context.Response.End(); + } + catch (Exception ex) + { + Debug.Console(Info, "[{0}] HandleGet Exception Message: {1}", Key.ToLower(), ex.Message); + Debug.Console(Verbose, "[{0}] HandleGet Exception StackTrace: {1}", Key.ToLower(), ex.StackTrace); + if (ex.InnerException != null) Debug.Console(Verbose, "[{0}] HandleGet Exception InnerException: {1}", Key.ToLower(), ex.InnerException); + + context.Response.StatusCode = 500; + context.Response.StatusDescription = "Internal Server Error"; + context.Response.End(); + } } /// diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetTypesRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetTypesRequestHandler.cs index bd1b967a..16f1f6b0 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetTypesRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetTypesRequestHandler.cs @@ -1,4 +1,6 @@ -using System.Linq; +using System; +using System.Collections.Generic; +using System.Linq; using Crestron.SimplSharp.WebScripting; using Newtonsoft.Json; using PepperDash.Core; @@ -10,8 +12,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers { private const string Key = "GetTypesRequestHandler"; private const uint Trace = 0; - private const uint Info = 0; - private const uint Verbose = 0; + private const uint Info = 1; + private const uint Verbose = 2; /// /// Handles CONNECT method requests @@ -41,13 +43,9 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers /// protected override void HandleGet(HttpCwsContext context) { - // TODO [ ] DeviceFactory.FactoryMethods dictionary is private and the method GetDeviceFactoryTypes has a return type void - // added new public method to return the DeviceFactory.FactoryMethod dictionary - var types = DeviceFactory.GetDeviceFactoryDictionary(null); - if (types == null) + var routeData = context.Request.RouteData; + if (routeData == null) { - Debug.Console(Verbose, "Get device factory dictionary failed"); - context.Response.StatusCode = 400; context.Response.StatusDescription = "Bad Request"; context.Response.End(); @@ -55,24 +53,47 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers return; } - types.OrderBy(t => t.Key); + var routeDataJson = JsonConvert.SerializeObject(routeData, Formatting.Indented); + Debug.Console(Verbose, "[{0}] routeData:\n{1}", Key.ToLower(), routeDataJson); - var js = JsonConvert.SerializeObject(types, Formatting.Indented, new JsonSerializerSettings + var types = DeviceFactory.GetDeviceFactoryDictionary(string.Empty).Select(type => new { - ReferenceLoopHandling = ReferenceLoopHandling.Ignore, - NullValueHandling = NullValueHandling.Ignore, - MissingMemberHandling = MissingMemberHandling.Ignore, - DefaultValueHandling = DefaultValueHandling.Ignore, - TypeNameHandling = TypeNameHandling.None - }); - //Debug.Console(Verbose, "[{0}] HandleGet: \x0d\x0a{1}", Key.ToLower(), js); + Type = type.Key, + Description = type.Value.Description, + CType = type.Value.CType == null ? "---" : type.Value.CType.ToString() + }).Cast().ToList(); - context.Response.StatusCode = 200; - context.Response.StatusDescription = "OK"; - context.Response.ContentType = "application/json"; - context.Response.ContentEncoding = System.Text.Encoding.UTF8; - context.Response.Write(js, false); - context.Response.End(); + if (types == null) + { + context.Response.StatusCode = 400; + context.Response.StatusDescription = "Bad Request"; + context.Response.End(); + + return; + } + + try + { + var js = JsonConvert.SerializeObject(types, Formatting.Indented); + //Debug.Console(Verbose, "[{0}] HandleGet: \x0d\x0a{1}", Key.ToLower(), js); + + context.Response.StatusCode = 200; + context.Response.StatusDescription = "OK"; + context.Response.ContentType = "application/json"; + context.Response.ContentEncoding = System.Text.Encoding.UTF8; + context.Response.Write(js, false); + context.Response.End(); + } + catch (Exception ex) + { + Debug.Console(Info, "[{0}] HandleGet Exception Message: {1}", Key.ToLower(), ex.Message); + Debug.Console(Verbose, "[{0}] HandleGet Exception StackTrace: {1}", Key.ToLower(), ex.StackTrace); + if (ex.InnerException != null) Debug.Console(Verbose, "[{0}] HandleGet Exception InnerException: {1}", Key.ToLower(), ex.InnerException); + + context.Response.StatusCode = 500; + context.Response.StatusDescription = "Internal Server Error"; + context.Response.End(); + } } /// diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/ReportVersionsRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/ReportVersionsRequestHandler.cs index ab0e4d8d..90960902 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/ReportVersionsRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/ReportVersionsRequestHandler.cs @@ -9,8 +9,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers { private const string Key = "ReportVersionsRequestHandler"; private const uint Trace = 0; - private const uint Info = 0; - private const uint Verbose = 0; + private const uint Info = 1; + private const uint Verbose = 2; /// /// Handles CONNECT method requests diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/SetDeviceStreamDebugRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/SetDeviceStreamDebugRequestHandler.cs index 989cb663..0874db11 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/SetDeviceStreamDebugRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/SetDeviceStreamDebugRequestHandler.cs @@ -11,8 +11,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers { private const string Key = "SetDeviceStreamDebugRequestHandler"; private const uint Trace = 0; - private const uint Info = 0; - private const uint Verbose = 0; + private const uint Info = 1; + private const uint Verbose = 2; /// /// Handles CONNECT method requests diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/ShowConfigRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/ShowConfigRequestHandler.cs index e8621e33..d3cbbe99 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/ShowConfigRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/ShowConfigRequestHandler.cs @@ -9,8 +9,8 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers { private const string Key = "ShowConfigRequestHandler"; private const uint Trace = 0; - private const uint Info = 0; - private const uint Verbose = 0; + private const uint Info = 1; + private const uint Verbose = 2; /// /// Handles CONNECT method requests