/// <summary> /// Parse the HTTP payload to MAPI message. /// </summary> /// <param name="headers">The HTTP header.</param> /// <param name="currentSessionID">the current session ID.</param> /// <param name="bytesFromHTTP">The raw data from HTTP layer.</param> /// <param name="direction">The direction of the traffic.</param> /// <param name="bytes">The bytes provided for MAPI view layer.</param> /// <returns>The object parsed result</returns> public object ParseHTTPPayload(HTTPHeaders headers, int currentSessionID, byte[] bytesFromHTTP, TrafficDirection direction, out byte[] bytes) { object objectOut = null; byte[] emptyByte = new byte[0]; bytes = emptyByte; if (bytesFromHTTP == null || bytesFromHTTP.Length == 0 || headers == null || !headers.Exists("X-RequestType")) { return null; } string requestType = headers["X-RequestType"]; if (requestType == null) { return null; } try { if (direction == TrafficDirection.Out && headers.Exists("Transfer-Encoding") && headers["Transfer-Encoding"] == "chunked") { bytesFromHTTP = Utilities.GetPaylodFromChunkedBody(bytesFromHTTP); bytes = bytesFromHTTP; } else { bytes = bytesFromHTTP; } Stream stream = new MemoryStream(bytesFromHTTP); MAPIInspector.currentSelectedSessionID = this.session.id; MAPIInspector.currentParsingSessionID = currentSessionID; if (direction == TrafficDirection.In) { switch (requestType) { case "Connect": { ConnectRequestBody ConnectRequest = new ConnectRequestBody(); ConnectRequest.Parse(stream); objectOut = ConnectRequest; break; } case "Execute": { ExecuteRequestBody ExecuteRequest = new ExecuteRequestBody(); ExecuteRequest.Parse(stream); objectOut = ExecuteRequest; break; } case "Disconnect": { DisconnectRequestBody DisconnectRequest = new DisconnectRequestBody(); DisconnectRequest.Parse(stream); objectOut = DisconnectRequest; break; } case "NotificationWait": { NotificationWaitRequestBody NotificationWaitRequest = new NotificationWaitRequestBody(); NotificationWaitRequest.Parse(stream); objectOut = NotificationWaitRequest; break; } case "Bind": { BindRequest bindRequest = new BindRequest(); bindRequest.Parse(stream); objectOut = bindRequest; break; } case "Unbind": { UnbindRequest unbindRequest = new UnbindRequest(); unbindRequest.Parse(stream); objectOut = unbindRequest; break; } case "CompareMIds": { CompareMinIdsRequest compareMinIdsRequest = new CompareMinIdsRequest(); compareMinIdsRequest.Parse(stream); objectOut = compareMinIdsRequest; break; } case "DNToMId": { DnToMinIdRequest dnToMinIdRequest = new DnToMinIdRequest(); dnToMinIdRequest.Parse(stream); objectOut = dnToMinIdRequest; break; } case "GetMatches": { GetMatchesRequest getMatchesRequest = new GetMatchesRequest(); getMatchesRequest.Parse(stream); objectOut = getMatchesRequest; break; } case "GetPropList": { GetPropListRequest getPropListRequest = new GetPropListRequest(); getPropListRequest.Parse(stream); objectOut = getPropListRequest; break; } case "GetProps": { GetPropsRequest getPropsRequest = new GetPropsRequest(); getPropsRequest.Parse(stream); objectOut = getPropsRequest; break; } case "GetSpecialTable": { GetSpecialTableRequest getSpecialTableRequest = new GetSpecialTableRequest(); getSpecialTableRequest.Parse(stream); objectOut = getSpecialTableRequest; break; } case "GetTemplateInfo": { GetTemplateInfoRequest getTemplateInfoRequest = new GetTemplateInfoRequest(); getTemplateInfoRequest.Parse(stream); objectOut = getTemplateInfoRequest; break; } case "ModLinkAtt": { ModLinkAttRequest modLinkAttRequest = new ModLinkAttRequest(); modLinkAttRequest.Parse(stream); objectOut = modLinkAttRequest; break; } case "ModProps": { ModPropsRequest modPropsRequest = new ModPropsRequest(); modPropsRequest.Parse(stream); objectOut = modPropsRequest; break; } case "QueryRows": { QueryRowsRequest queryRowsRequest = new QueryRowsRequest(); queryRowsRequest.Parse(stream); objectOut = queryRowsRequest; break; } case "QueryColumns": { QueryColumnsRequest queryColumnsRequest = new QueryColumnsRequest(); queryColumnsRequest.Parse(stream); objectOut = queryColumnsRequest; break; } case "ResolveNames": { ResolveNamesRequest resolveNamesRequest = new ResolveNamesRequest(); resolveNamesRequest.Parse(stream); objectOut = resolveNamesRequest; break; } case "ResortRestriction": { ResortRestrictionRequest resortRestrictionRequest = new ResortRestrictionRequest(); resortRestrictionRequest.Parse(stream); objectOut = resortRestrictionRequest; break; } case "SeekEntries": { SeekEntriesRequest seekEntriesRequest = new SeekEntriesRequest(); seekEntriesRequest.Parse(stream); objectOut = seekEntriesRequest; break; } case "UpdateStat": { UpdateStatRequest updateStatRequest = new UpdateStatRequest(); updateStatRequest.Parse(stream); objectOut = updateStatRequest; break; } case "GetMailboxUrl": { GetMailboxUrlRequest getMailboxUrlRequest = new GetMailboxUrlRequest(); getMailboxUrlRequest.Parse(stream); objectOut = getMailboxUrlRequest; break; } case "GetAddressBookUrl": { GetAddressBookUrlRequest getAddressBookUrlRequest = new GetAddressBookUrlRequest(); getAddressBookUrlRequest.Parse(stream); objectOut = getAddressBookUrlRequest; break; } default: { objectOut = "Unavailable Response Type"; break; } } } else { switch (requestType) { case "Connect": { ConnectResponseBody ConnectResponse = new ConnectResponseBody(); ConnectResponse.Parse(stream); objectOut = ConnectResponse; break; } case "Execute": { ExecuteResponseBody ExecuteResponse = new ExecuteResponseBody(); ExecuteResponse.Parse(stream); objectOut = ExecuteResponse; break; } case "Disconnect": { DisconnectResponseBody DisconnectResponse = new DisconnectResponseBody(); DisconnectResponse.Parse(stream); objectOut = DisconnectResponse; break; } case "NotificationWait": { NotificationWaitResponseBody NotificationWaitResponse = new NotificationWaitResponseBody(); NotificationWaitResponse.Parse(stream); objectOut = NotificationWaitResponse; break; } case "Bind": { BindResponse bindResponse = new BindResponse(); bindResponse.Parse(stream); objectOut = bindResponse; break; } case "Unbind": { UnbindResponse unbindResponse = new UnbindResponse(); unbindResponse.Parse(stream); objectOut = unbindResponse; break; } case "CompareMIds": { CompareMinIdsResponse compareMinIdsResponse = new CompareMinIdsResponse(); compareMinIdsResponse.Parse(stream); objectOut = compareMinIdsResponse; break; } case "DNToMId": { DnToMinIdResponse dnToMinIdResponse = new DnToMinIdResponse(); dnToMinIdResponse.Parse(stream); objectOut = dnToMinIdResponse; break; } case "GetMatches": { GetMatchesResponse getMatchesResponse = new GetMatchesResponse(); getMatchesResponse.Parse(stream); objectOut = getMatchesResponse; break; } case "GetPropList": { GetPropListResponse getPropListResponse = new GetPropListResponse(); getPropListResponse.Parse(stream); objectOut = getPropListResponse; break; } case "GetProps": { GetPropsResponse getPropsResponse = new GetPropsResponse(); getPropsResponse.Parse(stream); objectOut = getPropsResponse; break; } case "GetSpecialTable": { GetSpecialTableResponse getSpecialTableResponse = new GetSpecialTableResponse(); getSpecialTableResponse.Parse(stream); objectOut = getSpecialTableResponse; break; } case "GetTemplateInfo": { GetTemplateInfoResponse getTemplateInfoResponse = new GetTemplateInfoResponse(); getTemplateInfoResponse.Parse(stream); objectOut = getTemplateInfoResponse; break; } case "ModLinkAtt": { ModLinkAttResponse modLinkAttResponse = new ModLinkAttResponse(); modLinkAttResponse.Parse(stream); objectOut = modLinkAttResponse; break; } case "ModProps": { ModPropsResponse modPropsResponse = new ModPropsResponse(); modPropsResponse.Parse(stream); objectOut = modPropsResponse; break; } case "QueryRows": { QueryRowsResponse queryRowsResponse = new QueryRowsResponse(); queryRowsResponse.Parse(stream); objectOut = queryRowsResponse; break; } case "QueryColumns": { QueryColumnsResponse queryColumnsResponse = new QueryColumnsResponse(); queryColumnsResponse.Parse(stream); objectOut = queryColumnsResponse; break; } case "ResolveNames": { ResolveNamesResponse resolveNamesResponse = new ResolveNamesResponse(); resolveNamesResponse.Parse(stream); objectOut = resolveNamesResponse; break; } case "ResortRestriction": { ResortRestrictionResponse resortRestrictionResponse = new ResortRestrictionResponse(); resortRestrictionResponse.Parse(stream); objectOut = resortRestrictionResponse; break; } case "SeekEntries": { SeekEntriesResponse seekEntriesResponse = new SeekEntriesResponse(); seekEntriesResponse.Parse(stream); objectOut = seekEntriesResponse; break; } case "UpdateStat": { UpdateStatResponse updateStatResponse = new UpdateStatResponse(); updateStatResponse.Parse(stream); objectOut = updateStatResponse; break; } case "GetMailboxUrl": { GetMailboxUrlResponse getMailboxUrlResponse = new GetMailboxUrlResponse(); getMailboxUrlResponse.Parse(stream); objectOut = getMailboxUrlResponse; break; } case "GetAddressBookUrl": { GetAddressBookUrlResponse getAddressBookUrlResponse = new GetAddressBookUrlResponse(); getAddressBookUrlResponse.Parse(stream); objectOut = getAddressBookUrlResponse; break; } default: { objectOut = "Unavailable Response Type"; break; } } } return objectOut; } catch (MissingInformationException mException) { DialogResult confirmResult = MessageBox.Show("Do you want to spend more time to parse the related message?", "Confirmation", MessageBoxButtons.YesNo); if (confirmResult == DialogResult.Yes) { DecodingContext.LogonFlagMapLogId = new Dictionary<byte, LogonFlags>(); DecodingContext.SetColumnProTagMap_Index = new Dictionary<uint, PropertyTag[]>(); DecodingContext.DestinationConfigure_OutputHandles = new List<uint>(); DecodingContext.PutBuffer_sourceOperation = new Dictionary<uint, SourceOperation>(); HandleContextInformation(mException.RopID, out objectOut, out bytes, mException.Parameters); return objectOut; } else { return null; } } catch (Exception ex) { objectOut = ex.ToString(); return objectOut; } }
/// <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(); } }