コード例 #1
0
 void sinkUploadDataCompleted(TheRequestData eResult)
 {
     if (eResult != null && eResult.ResponseBuffer != null && eResult.ResponseBuffer.Length > 0)
     {
         try
         {
             TheCDEKPIs.IncrementKPI(eKPINames.QSReceivedTSM);
             TheCDEKPIs.IncrementKPI(eKPINames.QKBReceived, eResult.ResponseBuffer.Length);
             if (eResult.StatusCode != 200)
             {
                 TheBaseAssets.MySYSLOG.WriteToLog(243, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("QueuedSender", $"Server responded with not-ok ...Code: {eResult.StatusCode} error: {TheCommonUtils.CArray2UTF8String(eResult.ResponseBuffer)}", eMsgLevel.l2_Warning), true);
                 FireSenderProblem(new TheRequestData()
                 {
                     ErrorDescription = $"{eResult.StatusCode}:Server responded with not-ok ...Code: {eResult.StatusCode}"
                 });
                 return;
             }
             List <TheDeviceMessage> tDevList = null;
             if (eResult.ResponseMimeType.Contains("zip"))
             {
                 tDevList = TheDeviceMessage.DeserializeJSONToObject(TheCommonUtils.cdeDecompressToString(eResult.ResponseBuffer));
             }
             else
             {
                 tDevList = TheDeviceMessage.DeserializeJSONToObject(TheCommonUtils.CArray2UTF8String(eResult.ResponseBuffer));
             }
             if (tDevList != null && tDevList.Count > 0)
             {
                 eResult.StatusCode = 0;
                 TheCorePubSub.ProcessClientDeviceMessage(this, eResult, tDevList);
             }
         }
         catch (Exception ee)
         {
             TheBaseAssets.MySYSLOG.WriteToLog(243, TSM.L(eDEBUG_LEVELS.ESSENTIALS) ? null : new TSM("QueuedSender", $"Error in {MyTargetNodeChannel?.ToMLString()}", eMsgLevel.l1_Error, ee.ToString()));
         }
     }
     else
     {
         if (MyTargetNodeChannel.SenderType != cdeSenderType.CDE_SERVICE)
         {
             TheBaseAssets.MySYSLOG.WriteToLog(243, TSM.L(eDEBUG_LEVELS.VERBOSE) ? null : new TSM("QueuedSender", $"Did not receive any data from {MyTargetNodeChannel?.ToMLString()}", eMsgLevel.l6_Debug));
         }
     }
 }
コード例 #2
0
        internal void ProcessIncomingData(string pPostString, byte[] pPostData, int pPostDataLength)
        {
            if (!IsActive)
            {
                return;
            }

            if (MySessionRequestData == null || MySessionRequestData?.SessionState?.HasExpired == true)
            {
                TheBaseAssets.MySYSLOG.WriteToLog(4360, TSM.L(eDEBUG_LEVELS.ESSENTIALS) ? null : new TSM("TheWSProcessor", $"Incoming Data on expired session ({MySessionRequestData?.SessionState?.HasExpired}) detected - shutting down websockets", eMsgLevel.l6_Debug));
                Shutdown(false, "1600:Incoming Data on expired session detected - shutting down websockets");
                return;
            }
            TheRequestData tRequestData = TheRequestData.CloneForWS(MySessionRequestData);

            TheCDEKPIs.IncrementKPI(eKPINames.QSReceivedTSM);
            tRequestData.PostData    = pPostData;
            tRequestData.PostDataIdx = 0;
            if (pPostData == null)
            {
                tRequestData.PostDataLength = 0;
            }
            else
            {
                tRequestData.PostDataLength = pPostDataLength > 0 ? pPostDataLength : pPostData.Length;
                TheCDEKPIs.IncrementKPI(eKPINames.QKBReceived, tRequestData.PostDataLength);
            }

            if (IsClient)
            {
                string cmdString = "";
                try
                {
                    List <TheDeviceMessage> tDevList;
                    if (tRequestData.PostData == null && !string.IsNullOrEmpty(pPostString))
                    {
                        if (pPostString[0] != '[')
                        {
                            return;
                        }
                        tDevList = TheDeviceMessage.DeserializeJSONToObject(pPostString);
                    }
                    else
                    {
                        if (tRequestData.PostData == null)
                        {
                            return;                              //Edge Case but could happen - all what follows required ProcessClientDeviceMsg
                        }
                        cmdString = tRequestData.PostData[0] == (byte)'[' ? TheCommonUtils.CArray2UTF8String(tRequestData.PostData, 0, tRequestData.PostDataLength) : TheCommonUtils.cdeDecompressToString(tRequestData.PostData, 0, tRequestData.PostDataLength);
                        tDevList  = TheDeviceMessage.DeserializeJSONToObject(cmdString);
                    }

                    TheCorePubSub.ProcessClientDeviceMessage(MyQSender, tRequestData, tDevList);
                }
                catch (Exception e)
                {
                    TheBaseAssets.MySYSLOG.WriteToLog(4361, new TSM("WSClient", "Message-Received Processing Error", eMsgLevel.l1_Error, e.ToString()));
                }
            }
            else
            {
                try
                {
                    if (tRequestData.PostData == null && !string.IsNullOrEmpty(pPostString))
                    {
                        tRequestData.PostData       = TheCommonUtils.CUTF8String2Array(pPostString);
                        tRequestData.PostDataLength = tRequestData.PostData.Length;
                    }
                    if (TheCommCore.MyHttpService != null)
                    {
                        TheCommCore.MyHttpService.cdeProcessPost(tRequestData);
                    }
                }
                catch (Exception e)
                {
                    TheBaseAssets.MySYSLOG.WriteToLog(4362, TSM.L(eDEBUG_LEVELS.ESSENTIALS) ? null : new TSM("TheWSServer", "WebSocketServer-ProcessRequest Error", eMsgLevel.l1_Error, e.ToString()));
                }
            }
            if (MySessionRequestData.SessionState == null)
            {
                MySessionRequestData.SessionState = tRequestData.SessionState;
            }
            if (MySessionRequestData.DeviceID == Guid.Empty)
            {
                MySessionRequestData.DeviceID = tRequestData.DeviceID;
            }
            if (tRequestData.SessionState != null && MyQSender != null)
            {
                if (MyQSender.IsConnecting)
                {
                    MyQSender.IsConnected = true;
                    if (MyQSender.eventConnected != null)
                    {
                        TheCommonUtils.cdeRunAsync("QueueConnected", true, (p) =>
                        {
                            MyQSender?.eventConnected?.Invoke(MyQSender, MyQSender.MyTargetNodeChannel);
                        });
                    }
                    MyQSender.MyISBlock?.FireEvent("Connected");
                }
                //NEW3.124: Reset Heartbeat on Ws Post
                MyQSender.ResetHeartbeatTimer(false, tRequestData.SessionState);
            }
            else
            {
                TheBaseAssets.MySYSLOG.WriteToLog(4361, TSM.L(eDEBUG_LEVELS.ESSENTIALS)?null: new TSM("WSClient", $"No Request Session {tRequestData.SessionState!=null} or no QSender Found {MyQSender!=null}) IsClient={IsClient}", eMsgLevel.l2_Warning));
            }


            try
            {
                if (tRequestData.ResponseBuffer != null)
                {
                    PostToSocket(null, tRequestData.ResponseBuffer, IsClient, false);
                }
            }
            catch (Exception ex) // For debugging
            {
                //if (eventClosed != null)
                //  eventClosed("Connection Error: " + ex.ToString());
                Shutdown(true, "1601:PostToSocket Error: " + ex);
            }
        }
コード例 #3
0
        internal static void ExecuteCommand(string pInTopic, TheQueuedSender pQSender, bool DoSendBackBuffer, TheRequestData pRequestData, List <TheDeviceMessage> pDevMessageList)
        {
            if (pRequestData == null)
            {
                return;
            }

            #region Precheck on Execute Conditions
            if (pQSender?.MyTargetNodeChannel == null)
            {
                TheBaseAssets.MySYSLOG.WriteToLog(285, TSM.L(eDEBUG_LEVELS.ESSENTIALS) ? null : new TSM("CoreComm", "Enter Execute Command: OrgChannel is Null - not allowed ", eMsgLevel.l2_Warning));
                pRequestData.ResponseBufferStr = "ERR: Illegal Request";
                pRequestData.StatusCode        = 400;// (int)nsCDEngine.Communication.HttpService.eHttpStatusCode.NotAcceptable;
                return;
            }
            if (!TheBaseAssets.MasterSwitch)
            {
                pRequestData.ResponseBufferStr = "ERR: Service is shutting Down..."; return;
            }
            if (pRequestData.SessionState == null && TheBaseAssets.MySession != null)
            {
                TheBaseAssets.MySYSLOG.WriteToLog(285, TSM.L(eDEBUG_LEVELS.ESSENTIALS) ? null : new TSM("CoreComm", "Enter Execute Command: Session no longer alive - Topic:" + pInTopic, eMsgLevel.l2_Warning));
                pRequestData.ResponseBufferStr = "ERR: Session no longer alive";
                pRequestData.StatusCode        = 401; //(int)nsCDEngine.Communication.HttpService.eHttpStatusCode.NotAcceptable;
                return;
            }
            #endregion

            try
            {
                if (pDevMessageList == null)
                {
                    #region Received BINARY Data in Post Data - Parsing
                    //REVIEW: This should no longer be used in the future...all telegrams should come in as HTTP Bodies
                    if (pRequestData.PostData != null && pRequestData.PostData.Length > 0 && pRequestData.PostDataIdx >= 0)
                    {
                        int tPostDataLength = pRequestData.PostData.Length;
                        if (pRequestData.PostDataLength > 0)
                        {
                            tPostDataLength = pRequestData.PostDataLength;
                        }
                        if ((tPostDataLength - pRequestData.PostDataIdx) == 1)
                        {
                            if (pQSender.MyTargetNodeChannel.SenderType == cdeSenderType.NOTSET)
                            {
                                pQSender.MyTargetNodeChannel.SenderType = (cdeSenderType)(pRequestData.PostData[0] - 0x30);
                                TheBaseAssets.MySYSLOG.WriteToLog(285, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("CoreComm", $"ChannelChange: Was NOTSET and now is now: {pQSender.MyTargetNodeChannel.SenderType}", eMsgLevel.l3_ImportantMessage));
                            }
                        }
                        else
                        {
                            try
                            {
                                string tStr  = null;
                                bool   isBin = false;
                                if (pRequestData.ResponseMimeType.ToLower().Contains("zip"))
                                {
                                    tStr  = TheCommonUtils.cdeDecompressToString(pRequestData.PostData, pRequestData.PostDataIdx, tPostDataLength - pRequestData.PostDataIdx);
                                    isBin = true;
                                }
                                else
                                {
                                    tStr = TheCommonUtils.CArray2UTF8String(pRequestData.PostData, pRequestData.PostDataIdx, tPostDataLength - pRequestData.PostDataIdx);
                                }

                                pDevMessageList = TheDeviceMessage.DeserializeJSONToObject(tStr);

                                if (pQSender.MyTargetNodeChannel.SenderType == cdeSenderType.NOTSET)
                                {
                                    pQSender.MyTargetNodeChannel.SenderType = isBin ? cdeSenderType.CDE_SERVICE : cdeSenderType.CDE_JAVAJASON;
                                    TheBaseAssets.MySYSLOG.WriteToLog(285, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("CoreComm", $"ChannelChange: Was NOTSET and now is now: {pQSender.MyTargetNodeChannel.SenderType}", eMsgLevel.l3_ImportantMessage));
                                }
                            }
                            catch (Exception eee)
                            {
                                string remot = "unkown";
                                if (pRequestData.SessionState != null && pRequestData.SessionState.MyDevice != Guid.Empty)
                                {
                                    remot = pRequestData.SessionState.MyDevice.ToString();
                                }
                                TheBaseAssets.MySYSLOG.WriteToLog(285, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("CoreComm", "Execute Command received JSON package failed", eMsgLevel.l2_Warning, $"{pRequestData.RequestUri} {remot} {eee}"));
                            }
                        }
                    }
                    #endregion
                }
                DoExecuteCommand(pInTopic, pQSender, DoSendBackBuffer, pRequestData, pDevMessageList);
            }
            catch (Exception eeee)
            {
                TheBaseAssets.MySYSLOG.WriteToLog(285, TSM.L(eDEBUG_LEVELS.OFF) ? null : new TSM("CoreComm", "Execute Command failed", eMsgLevel.l2_Warning, $"{pRequestData.RequestUri} {eeee}"));
            }
        }