/// <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(); } }