From e1d7374f1eb1184b8feca405cd0eae23014db098 Mon Sep 17 00:00:00 2001 From: jdevito Date: Wed, 1 Feb 2023 13:22:12 -0600 Subject: [PATCH] fix: resolved issues with setDeviceStreamDebug; refactor: added static method GetRequestBody --- .../Web/EssentialsWebApiHelpers.cs | 14 ++- .../RequestHandlers/AppDebugRequestHandler.cs | 12 +- .../RequestHandlers/DevJsonRequestHandler.cs | 14 ++- .../RequestHandlers/DevPropsRequestHandler.cs | 12 +- .../GetFeedbacksForDeviceRequestHandler.cs | 7 +- .../SetDeviceStreamDebugRequestHandler.cs | 105 ++++++++++++++---- 6 files changed, 129 insertions(+), 35 deletions(-) diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/EssentialsWebApiHelpers.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/EssentialsWebApiHelpers.cs index 37a749f9..4830edb4 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/EssentialsWebApiHelpers.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/EssentialsWebApiHelpers.cs @@ -1,11 +1,23 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; +using System.Text; +using Crestron.SimplSharp.WebScripting; using PepperDash.Core; namespace PepperDash.Essentials.Core.Web { public class EssentialsWebApiHelpers { + public static string GetRequestBody(HttpCwsRequest request) + { + var bytes = new Byte[request.ContentLength]; + + request.InputStream.Read(bytes, 0, request.ContentLength); + + return Encoding.UTF8.GetString(bytes, 0, bytes.Length); + } + public static object MapToAssemblyObject(LoadedAssembly assembly) { return new diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/AppDebugRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/AppDebugRequestHandler.cs index 4d6ff236..f80f9f7f 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/AppDebugRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/AppDebugRequestHandler.cs @@ -95,9 +95,15 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers return; } - var bytes = new Byte[context.Request.ContentLength]; - context.Request.InputStream.Read(bytes, 0, context.Request.ContentLength); - var data = Encoding.UTF8.GetString(bytes, 0, bytes.Length); + var data = EssentialsWebApiHelpers.GetRequestBody(context.Request); + if (string.IsNullOrEmpty(data)) + { + context.Response.StatusCode = 400; + context.Response.StatusDescription = "Bad Request"; + context.Response.End(); + + return; + } var appDebug = new AppDebug(); var requestBody = JsonConvert.DeserializeAnonymousType(data, appDebug); diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevJsonRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevJsonRequestHandler.cs index 7806095e..6080465b 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevJsonRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevJsonRequestHandler.cs @@ -88,12 +88,16 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers return; } - var bytes = new Byte[context.Request.ContentLength]; - context.Request.InputStream.Read(bytes, 0, context.Request.ContentLength); - var data = Encoding.UTF8.GetString(bytes, 0, bytes.Length); - - //Debug.Console(0, "Request data:\n{0}", data); + var data = EssentialsWebApiHelpers.GetRequestBody(context.Request); + if (string.IsNullOrEmpty(data)) + { + context.Response.StatusCode = 400; + context.Response.StatusDescription = "Bad Request"; + context.Response.End(); + return; + } + try { DeviceJsonApi.DoDeviceActionWithJson(data); diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevPropsRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevPropsRequestHandler.cs index 4ff70aad..b7dcc511 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevPropsRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/DevPropsRequestHandler.cs @@ -89,9 +89,15 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers return; } - var bytes = new Byte[context.Request.ContentLength]; - context.Request.InputStream.Read(bytes, 0, context.Request.ContentLength); - var data = Encoding.UTF8.GetString(bytes, 0, bytes.Length); + var data = EssentialsWebApiHelpers.GetRequestBody(context.Request); + if (string.IsNullOrEmpty(data)) + { + context.Response.StatusCode = 400; + context.Response.StatusDescription = "Bad Request"; + context.Response.End(); + + return; + } var o = new DeviceActionWrapper(); var body = JsonConvert.DeserializeAnonymousType(data, o); diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetFeedbacksForDeviceRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetFeedbacksForDeviceRequestHandler.cs index 7e5c7be2..2f892f2b 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetFeedbacksForDeviceRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/GetFeedbacksForDeviceRequestHandler.cs @@ -93,19 +93,20 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers Value = feedback.StringValue ?? string.Empty }; - var respnse = new + var responseObj = new { BoolValues = boolFeedback, IntValues = intFeedback, SerialValues = stringFeedback }; - var final = JsonConvert.SerializeObject(respnse, Formatting.Indented); + var js = JsonConvert.SerializeObject(responseObj, Formatting.Indented); + context.Response.StatusCode = 200; context.Response.StatusDescription = "OK"; context.Response.ContentType = "application/json"; context.Response.ContentEncoding = System.Text.Encoding.UTF8; - context.Response.Write(final, false); + context.Response.Write(js, false); context.Response.End(); } diff --git a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/SetDeviceStreamDebugRequestHandler.cs b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/SetDeviceStreamDebugRequestHandler.cs index 3625fcdd..bb7cc12f 100644 --- a/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/SetDeviceStreamDebugRequestHandler.cs +++ b/essentials-framework/Essentials Core/PepperDashEssentialsBase/Web/RequestHandlers/SetDeviceStreamDebugRequestHandler.cs @@ -1,7 +1,7 @@ using System; -using System.Text; using Crestron.SimplSharp.WebScripting; using Newtonsoft.Json; +using PepperDash.Core; using PepperDash.Core.Web.RequestHandlers; namespace PepperDash.Essentials.Core.Web.RequestHandlers @@ -89,24 +89,28 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers return; } - var bytes = new Byte[context.Request.ContentLength]; - context.Request.InputStream.Read(bytes, 0, context.Request.ContentLength); - var data = Encoding.UTF8.GetString(bytes, 0, bytes.Length); - - var o = new + var data = EssentialsWebApiHelpers.GetRequestBody(context.Request); + if (data == null) { - DeviceKey = "", - Type = "", - Timeout = 15 - }; + context.Response.StatusCode = 500; + context.Response.StatusDescription = "Internal Server Error"; + context.Response.End(); - var body = JsonConvert.DeserializeAnonymousType(data, o); + return; + } - if (string.IsNullOrEmpty(body.DeviceKey) || string.IsNullOrEmpty(body.Type) - || !body.Type.ToLower().Contains("off") - || !body.Type.ToLower().Contains("tx") - || !body.Type.ToLower().Contains("rx") - || !body.Type.ToLower().Contains("both")) + var config = new SetDeviceStreamDebugConfig(); + var body = JsonConvert.DeserializeAnonymousType(data, config); + if (body == null) + { + context.Response.StatusCode = 500; + context.Response.StatusDescription = "Internal Server Error"; + context.Response.End(); + + return; + } + + if (string.IsNullOrEmpty(body.DeviceKey) || string.IsNullOrEmpty(body.Setting)) { context.Response.StatusCode = 400; context.Response.StatusDescription = "Bad Request"; @@ -115,11 +119,52 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers return; } - DeviceManager.SetDeviceStreamDebugging(string.Format("setdevicestreamdebug {0} {1} {2}", body.DeviceKey, body.Type, body.Timeout)); + var device = DeviceManager.GetDeviceForKey(body.DeviceKey) as IStreamDebugging; + if (device == null) + { + context.Response.StatusCode = 404; + context.Response.StatusDescription = "Not Found"; + context.Response.End(); - context.Response.StatusCode = 200; - context.Response.StatusDescription = "OK"; - context.Response.End(); + return; + } + + eStreamDebuggingSetting debugSetting; + try + { + debugSetting = (eStreamDebuggingSetting) Enum.Parse(typeof (eStreamDebuggingSetting), body.Setting, true); + } + catch (Exception ex) + { + context.Response.StatusCode = 500; + context.Response.StatusDescription = "Internal Server Error"; + context.Response.End(); + + return; + } + + try + { + var mins = Convert.ToUInt32(body.Timeout); + if (mins > 0) + { + device.StreamDebugging.SetDebuggingWithSpecificTimeout(debugSetting, mins); + } + else + { + device.StreamDebugging.SetDebuggingWithDefaultTimeout(debugSetting); + } + + context.Response.StatusCode = 200; + context.Response.StatusDescription = "OK"; + context.Response.End(); + } + catch (Exception ex) + { + context.Response.StatusCode = 500; + context.Response.StatusDescription = "Internal Server Error"; + context.Response.End(); + } } /// @@ -144,4 +189,24 @@ namespace PepperDash.Essentials.Core.Web.RequestHandlers context.Response.End(); } } + + + public class SetDeviceStreamDebugConfig + { + [JsonProperty("deviceKey", NullValueHandling = NullValueHandling.Include)] + public string DeviceKey { get; set; } + + [JsonProperty("setting", NullValueHandling = NullValueHandling.Include)] + public string Setting { get; set; } + + [JsonProperty("timeout")] + public int Timeout { get; set; } + + public SetDeviceStreamDebugConfig() + { + DeviceKey = null; + Setting = null; + Timeout = 15; + } + } } \ No newline at end of file