Exemplo n.º 1
0
        /// <summary>
        /// Parse the HTTP payload to MAPI message.
        /// </summary>
        /// <param name="headers">The HTTP header.</param>
        /// <param name="bytesFromHTTP">The raw data from HTTP layer.</param>
        /// <param name="direction">The direction of the traffic.</param>
        public void ParseHTTPPayload(HTTPHeaders headers, byte[] bytesFromHTTP, TrafficDirection direction)
        {
            if (bytesFromHTTP.Length == 0 || headers == null || !headers.Exists("X-RequestType"))
            {
                return;
            }

            string requestType = headers["X-RequestType"];

            if (requestType == null)
            {
                return;
            }
            try
            {
                if (direction == TrafficDirection.Out && headers.Exists("Transfer-Encoding") && headers["Transfer-Encoding"] == "chunked")
                {
                    bytesFromHTTP = Utilities.GetPaylodFromChunkedBody(bytesFromHTTP);
                    this.oMAPIControl.MAPIHexBox.ByteProvider = new StaticByteProvider(bytesFromHTTP);
                }
                else
                {
                    this.oMAPIControl.MAPIHexBox.ByteProvider = new StaticByteProvider(bytesFromHTTP);
                }

                this.oMAPIControl.MAPIHexBox.ByteProvider.ApplyChanges();
                Stream stream = new MemoryStream(bytesFromHTTP);
                int result = 0;
                if (direction == TrafficDirection.In)
                {
                    this.oMAPIViewControl.BeginUpdate();
                    TreeNode topNode = new TreeNode(requestType + "Request:");

                switch (requestType)
                {
                    case "Connect":
                        {
                            ConnectRequestBody ConnectRequest = new ConnectRequestBody();
                            ConnectRequest.Parse(stream);
                            topNode = ConnectRequest.AddNodesForTree(ConnectRequest, 0, out result);
                            break;
                        }
                    case "Execute":
                        {
                            ExecuteRequestBody ExecuteRequest = new ExecuteRequestBody();
                            ExecuteRequest.Parse(stream);
                            topNode = ExecuteRequest.AddNodesForTree(ExecuteRequest, 0, out result);
                            break;
                        }
                    case "Disconnect":
                        {
                            DisconnectRequestBody DisconnectRequest = new DisconnectRequestBody();
                            DisconnectRequest.Parse(stream);
                            topNode = DisconnectRequest.AddNodesForTree(DisconnectRequest, 0, out result);
                            break;
                        }
                    case "NotificationWait":
                        {
                            NotificationWaitRequestBody NotificationWaitRequest = new NotificationWaitRequestBody();
                            NotificationWaitRequest.Parse(stream);
                            topNode = NotificationWaitRequest.AddNodesForTree(NotificationWaitRequest, 0, out result);
                            break;
                        }
                    case "Bind":
                        {
                            BindRequest bindRequest = new BindRequest();
                            bindRequest.Parse(stream);
                            topNode = bindRequest.AddNodesForTree(bindRequest, 0, out result);
                            break;
                        }
                    default:
                        {
                            this.oMAPIControl.MAPIRichTextBox.Visible = true;
                            this.oMAPIControl.MAPIRichTextBox.Text = "Unavailable Request Type.";
                            break;
                        }
                }

                this.oMAPIViewControl.Nodes.Add(topNode);
                topNode.Expand();
                this.oMAPIViewControl.EndUpdate();

            }
            else
            {
                this.oMAPIViewControl.BeginUpdate();
                TreeNode topNode = new TreeNode(requestType + "Response:");

                switch (requestType)
                {
                    case "Connect":
                        {
                            ConnectResponseBody ConnectResponse = new ConnectResponseBody();
                            ConnectResponse.Parse(stream);
                            topNode = ConnectResponse.AddNodesForTree(ConnectResponse, 0, out result);
                            if (ConnectResponse.StatusCode == 0)
                            {
                                string text = topNode.Text.Replace("Response", "SuccessResponse");
                                topNode.Text = text;
                            }
                            else
                            {
                                string text = topNode.Text.Replace("Response", "FailureResponse");
                                topNode.Text = text;
                            }
                            break;
                        }
                    case "Execute":
                        {
                            ExecuteResponseBody ExecuteResponse = new ExecuteResponseBody();
                            ExecuteResponse.Parse(stream);
                            topNode = ExecuteResponse.AddNodesForTree(ExecuteResponse, 0, out result);
                            if (ExecuteResponse.StatusCode == 0)
                            {
                                string text = topNode.Text.Replace("Response", "SuccessResponse");
                                topNode.Text = text;
                            }
                            else
                            {
                                string text = topNode.Text.Replace("Response", "FailureResponse");
                                topNode.Text = text;
                            }
                            break;
                        }
                    case "Disconnect":
                        {

                            DisconnectResponseBody DisconnectResponse = new DisconnectResponseBody();
                            DisconnectResponse.Parse(stream);
                            topNode = DisconnectResponse.AddNodesForTree(DisconnectResponse, 0, out result);
                            if (DisconnectResponse.StatusCode == 0)
                            {
                                string text = topNode.Text.Replace("Response", "SuccessResponse");
                                topNode.Text = text;
                            }
                            else
                            {
                                string text = topNode.Text.Replace("Response", "FailureResponse");
                                topNode.Text = text;
                            }
                            break;
                        }
                    case "NotificationWait":
                        {

                            NotificationWaitResponseBody NotificationWaitResponse = new NotificationWaitResponseBody();
                            NotificationWaitResponse.Parse(stream);
                            topNode = NotificationWaitResponse.AddNodesForTree(NotificationWaitResponse, 0, out result);
                            if (NotificationWaitResponse.StatusCode == 0)
                            {
                                string text = topNode.Text.Replace("Response", "SuccessResponse");
                                topNode.Text = text;
                            }
                            else
                            {
                                string text = topNode.Text.Replace("Response", "FailureResponse");
                                topNode.Text = text;
                            }
                            break;
                        }
                    case "Bind":
                        {
                            BindResponse bindResponse = new BindResponse();
                            bindResponse.Parse(stream);
                            topNode = bindResponse.AddNodesForTree(bindResponse, 0, out result);
                            if (bindResponse.StatusCode == 0)
                            {
                                string text = topNode.Text.Replace("Response", "SuccessResponse");
                                topNode.Text = text;
                            }
                            else
                            {
                                string text = topNode.Text.Replace("Response", "FailureResponse");
                                topNode.Text = text;
                            }
                            break;
                        }
                    default:
                        {
                            this.oMAPIControl.MAPIRichTextBox.Visible = true;
                            this.oMAPIControl.MAPIRichTextBox.Text = "Unavailable Response Type.";
                            break;
                        }
                }

                    this.oMAPIViewControl.Nodes.Add(topNode);
                    topNode.Expand();
                    this.oMAPIViewControl.EndUpdate();
                }
            }
            catch (Exception ex)
            {
                this.oMAPIControl.MAPIRichTextBox.Visible = true;
                this.oMAPIControl.MAPIRichTextBox.Text = ex.ToString();
                this.oMAPIViewControl.EndUpdate();
            }
        }