/// <summary> /// Parse the FSSHTTPB Bytes. /// </summary> /// <param name="FSSHTTPBbytes">The raw date contains FSSHTTPB message.</param> /// <param name="direction">The direction of the traffic.</param> /// <returns>The object parsed result</returns> public object ParseFSSHTTPBBytes(byte[] FSSHTTPBbytes, TrafficDirection direction) { object objectOut = null; byte[] emptyByte = new byte[0]; if (FSSHTTPBbytes == null || FSSHTTPBbytes.Length == 0) { return(null); } try { if (direction == TrafficDirection.In) { FsshttpbRequest FsshttpbReq = new FsshttpbRequest(); MemoryStream s = new MemoryStream(FSSHTTPBbytes); FsshttpbReq.Parse(s); objectOut = FsshttpbReq; } else { FsshttpbResponse FsshttpbRes = new FsshttpbResponse(); MemoryStream s = new MemoryStream(FSSHTTPBbytes); FsshttpbRes.Parse(s); objectOut = FsshttpbRes; } return(objectOut); } catch (Exception ex) { objectOut = ex.ToString(); return(objectOut); } }
public Lane(Vector2 position, int laneHeight, Rectangle roadRectagle, TrafficDirection direction, float delay, int speed, Texture2D carTexture) { this.direction = direction; this.delay = delay; this.laneHeight = laneHeight; this.position = position; this.roadRectagle = roadRectagle; this.carTexture = carTexture; this.speed = speed; carSize = 2 * laneHeight; random = new Random(DateTime.Now.Millisecond); maxCars = roadRectagle.Width / carSize; cars = new List <Car>(maxCars); for (int i = 0; i < maxCars; i++) { Rectangle rect; if (direction == TrafficDirection.Right) { rect = new Rectangle(-5 * carSize, (int)position.Y + 2, carSize, laneHeight - 4); } else { rect = new Rectangle(roadRectagle.Width + 5 * carSize, (int)position.Y + 2, carSize, laneHeight - 4); } //initially, the car will be offscreen. It will be positioned correctly at the first Update. cars.Add(new Car(rect, roadRectagle.Width, speed, direction, carTexture)); } elapsedTime = 0.0; }
public void Reset(Rectangle rect, int viewWidth, int speed, TrafficDirection direction) { this.rectangle = rect; this.viewWidth = viewWidth; this.direction = direction; this.speed = speed; }
/// <summary> /// Sets the named variable in the network scope which this specified traffic falls under /// </summary> public virtual void SetVariable(TrafficDirection direction, string address, string varName, int value) { if (!m_Enabled) { return; } setVariable(false, direction, address, varName, value); }
public Car(Rectangle rect, int viewWidth, int speed, TrafficDirection direction, Texture2D tex) { this.rectangle = rect; this.viewWidth = viewWidth; this.texture = tex; this.direction = direction; this.speed = speed; color = Color.White; }
private void initLanes() { lanes.Clear(); int speed = 11; for (int i = 0; i < numLanes; i++) { //short of hacky way to determine car spawn rate and car speed. float delay = 0.1f + 0.3f * i; speed -= 1; TrafficDirection direction = rand.Next(2) == 0 ? TrafficDirection.Left : TrafficDirection.Right; Lane lane = new Lane(new Vector2(0, roadRectagle.Y + i * frogRectangle.Height), frogRectangle.Height, roadRectagle, direction, delay, speed, whiteTile); lanes.Add(lane); } }
private void setVariable(bool inc, TrafficDirection direction, string address, string varName, int value) { if (!Running || address.IsNullOrWhiteSpace() || varName.IsNullOrWhiteSpace() || value == 0) { return; } var state = this[direction]; var grp = state.FindGroupForAddress(address); var key = grp == null ? address : grp.Key; var nstate = state.NetState.GetOrAdd(key, (k) => grp == null ? new NetSiteState(address) : new NetSiteState(grp)); lock (nstate) { if (inc) { NetSiteState._value vval; if (!nstate.m_Variables.TryGetValue(varName, out vval)) { nstate.m_Variables[varName] = vval = new NetSiteState._value(); } vval.Value += value; } else { nstate.m_Variables[varName] = new NetSiteState._value { Value = value } }; } } #endregion }
/// <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; } }
public TrafficMessage(string trafficType, byte[] rawData, DateTime ?timestamp = null, string sourceInterface = "", TrafficDirection direction = TrafficDirection.Unknown, TrafficMsgDecoder decodeMessage = null, string additionalInfo = "") { timestamp = timestamp ?? DateTime.Now; this.timestamp = timestamp.Value; this.trafficType = trafficType; this.rawData = rawData; this.sourceInterface = sourceInterface; this.direction = direction; this.decodeMessage = decodeMessage; this.additionalInformation = additionalInfo; }
public bool IsMapihttpSession(int sessionId, TrafficDirection direction) { List<Session> AllSessionsList = new List<Session>(); Session session0 = new Session(new byte[0], new byte[0]); AllSessionsList.AddRange(FiddlerApplication.UI.GetAllSessions()); AllSessionsList.Sort(delegate (Session p1, Session p2) { return p1.id.CompareTo(p2.id); }); AllSessionsList.Insert(0, session0); Session[] allSessions = AllSessionsList.ToArray(); Session os = allSessions[sessionId]; if (os != null) { if (direction == TrafficDirection.In) { return os.RequestHeaders.ExistsAndContains("Content-Type", "application/mapi-http"); } else if (direction == TrafficDirection.Out && os.ResponseHeaders.Exists("X-ResponseCode")) { string xResponseCode = os.ResponseHeaders["X-ResponseCode"]; if (xResponseCode == "0") { return os.ResponseHeaders.ExistsAndContains("Content-Type", "application/mapi-http"); } else if (xResponseCode != "") { return os.ResponseHeaders.ExistsAndContains("Content-Type", "text/html"); } } } return false; }
/// <summary> /// Parse the HTTP payload to FSSHTTP and WOPI message. /// </summary> /// <param name="responseHeaders">The HTTP response header.</param> /// <param name="bytesFromHTTP">The raw data from HTTP layer.</param> /// <param name="direction">The direction of the traffic.</param> /// <returns>The object parsed result</returns> public object ParseHTTPPayloadForFSSHTTP(HTTPHeaders responseHeaders, byte[] bytesFromHTTP, TrafficDirection direction) { object objectOut = null; byte[] emptyByte = new byte[0]; if (bytesFromHTTP == null || bytesFromHTTP.Length == 0) { return(null); } try { if (direction == TrafficDirection.Out && responseHeaders.Exists("Transfer-Encoding") && responseHeaders["Transfer-Encoding"] == "chunked") { bytesFromHTTP = Utilities.GetPaylodFromChunkedBody(bytesFromHTTP); } Stream stream = new MemoryStream(bytesFromHTTP); StreamReader reader = new StreamReader(stream); string text = reader.ReadToEnd(); Regex SOAPRegex = new Regex(@"\<s:Envelop.*\<\/s:Envelope\>"); // extract envelop from http payload. if (SOAPRegex.Match(text).Success) { XmlDocument doc = new XmlDocument(); string soapbody = SOAPRegex.Match(text).Value; if (direction == TrafficDirection.In) { Regex FSSHTTPRequestRegex = new Regex("xsi:type=\"\\w*\"\\s"); // remove xsi:type in xml message. this xsi:type is used for inherit in xmlSerializer. string FSSHTTPRequest = FSSHTTPRequestRegex.Replace(soapbody, string.Empty); MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(FSSHTTPRequest ?? "")); XmlSerializer serializer = new XmlSerializer(typeof(RequestEnvelope)); RequestEnvelope requestEnvelop = (RequestEnvelope)serializer.Deserialize(ms); objectOut = requestEnvelop.Body; // if SubRequestData has fsshttpb messages do parser. if (requestEnvelop.Body.RequestCollection != null) { TryParseFSSHTTPBRequestMessage(requestEnvelop.Body.RequestCollection.Request, bytesFromHTTP); } } else { MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(soapbody ?? "")); XmlSerializer serializer = new XmlSerializer(typeof(ResponseEnvelope)); ResponseEnvelope responseEnvelop = (ResponseEnvelope)serializer.Deserialize(ms); objectOut = responseEnvelop.Body; // if SubResponseData has fsshttpb messages do parser. if (responseEnvelop.Body.ResponseCollection != null) { TryParseFSSHTTPBResponseMessage(responseEnvelop.Body.ResponseCollection.Response, bytesFromHTTP); } } } return(objectOut); } catch (Exception ex) { objectOut = ex.ToString(); return(objectOut); } }
/// <summary> /// Parse the HTTP payload to WOPI message. /// </summary> /// <param name="requestHeaders">The HTTP request header.</param> /// <param name="responseHeaders">The HTTP response header.</param> /// <param name="url">url for a HTTP message.</param> /// <param name="bytesFromHTTP">The raw data from HTTP layer.</param> /// <param name="direction">The direction of the traffic.</param> /// <returns>The object parsed result</returns> public object ParseHTTPPayloadForWOPI(HTTPHeaders requestHeaders, HTTPHeaders responseHeaders, string url, byte[] bytesFromHTTP, out string binaryStructureRopName, TrafficDirection direction) { object objectOut = null; binaryStructureRopName = string.Empty; try { if (direction == TrafficDirection.Out && responseHeaders.Exists("Transfer-Encoding") && responseHeaders["Transfer-Encoding"] == "chunked") { bytesFromHTTP = Utilities.GetPaylodFromChunkedBody(bytesFromHTTP); } Stream stream = new MemoryStream(bytesFromHTTP); StreamReader reader = new StreamReader(stream); string text = reader.ReadToEnd(); WOPIOperations operation = GetWOPIOperationName(requestHeaders, url); if (direction == TrafficDirection.In) { switch (operation) { case WOPIOperations.PutRelativeFile: objectOut = bytesFromHTTP; binaryStructureRopName = "PutRelativeFile"; break; case WOPIOperations.PutFile: objectOut = bytesFromHTTP; binaryStructureRopName = "PutFile"; break; case WOPIOperations.ExecuteCellStorageRelativeRequest: case WOPIOperations.ExecuteCellStorageRequest: byte[] cellreq = bytesFromHTTP; MemoryStream ms; if (requestHeaders.Exists("Content-Encoding") && requestHeaders["Content-Encoding"] == "gzip") { cellreq = Fiddler.Utilities.GzipExpand(cellreq); ms = new MemoryStream(cellreq); } else { ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(text ?? "")); } XmlSerializer serializer = new XmlSerializer(typeof(RequestEnvelope)); RequestEnvelope requestEnvelop = (RequestEnvelope)serializer.Deserialize(ms); objectOut = requestEnvelop.Body; if (requestEnvelop.Body.RequestCollection != null) { TryParseFSSHTTPBRequestMessage(requestEnvelop.Body.RequestCollection.Request, bytesFromHTTP); } break; case WOPIOperations.PutUserInfo: objectOut = text; break; case WOPIOperations.Discovery: case WOPIOperations.CheckFileInfo: case WOPIOperations.Lock: case WOPIOperations.RefreshLock: case WOPIOperations.RevokeRestrictedLink: case WOPIOperations.Unlock: case WOPIOperations.UnlockAndRelock: case WOPIOperations.GetLock: case WOPIOperations.DeleteFile: case WOPIOperations.ReadSecureStore: case WOPIOperations.RenameFile: case WOPIOperations.GetRestrictedLink: case WOPIOperations.CheckFolderInfo: case WOPIOperations.GetFile: case WOPIOperations.EnumerateChildren: objectOut = string.Format("{0} operation's request body is null", operation.ToString()); break; default: throw new Exception("The WOPI operations type is not right."); } } else { string status = this.session.ResponseHeaders.HTTPResponseStatus.Replace(" " + this.session.ResponseHeaders.StatusDescription, string.Empty); if (Convert.ToUInt32(status) != 200)// the status is not success return null; ResponseBodyBase responseBody = new ResponseBodyBase(); switch (operation) { case WOPIOperations.Discovery: MemoryStream discoveryms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(text ?? "")); XmlSerializer discoverySerializer = new XmlSerializer(typeof(wopidiscovery)); wopidiscovery discoveryres = (wopidiscovery)discoverySerializer.Deserialize(discoveryms); objectOut = discoveryres; break; case WOPIOperations.CheckFileInfo: objectOut = WOPISerilizer.JsonToObject<CheckFileInfo>(text); break; case WOPIOperations.CheckFolderInfo: objectOut = WOPISerilizer.JsonToObject<CheckFolderInfo>(text); break; case WOPIOperations.PutRelativeFile: objectOut = WOPISerilizer.JsonToObject<PutRelativeFile>(text); break; case WOPIOperations.ReadSecureStore: objectOut = WOPISerilizer.JsonToObject<ReadSecureStore>(text); break; case WOPIOperations.EnumerateChildren: objectOut = WOPISerilizer.JsonToObject<EnumerateChildren>(text); break; case WOPIOperations.RenameFile: objectOut = WOPISerilizer.JsonToObject<RenameFile>(text); break; case WOPIOperations.ExecuteCellStorageRelativeRequest: case WOPIOperations.ExecuteCellStorageRequest: { byte[] cellres = bytesFromHTTP; MemoryStream ms; string res; if (responseHeaders.Exists("Content-Encoding") && responseHeaders["Content-Encoding"] == "gzip") { cellres = Fiddler.Utilities.GzipExpand(cellres); string res_sub = System.Text.Encoding.UTF8.GetString(cellres); res = string.Format("{0}{1}{2}", @"<Body>", res_sub, "</Body>"); } else { res = string.Format("{0}{1}{2}", @"<Body>", text, "</Body>"); } ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(res ?? "")); XmlSerializer serializer = new XmlSerializer(typeof(ResponseEnvelopeBody)); ResponseEnvelopeBody body = (ResponseEnvelopeBody)serializer.Deserialize(ms); objectOut = body; // if SubResponseData has fsshttpb messages do parser. if (body.ResponseCollection != null) { TryParseFSSHTTPBResponseMessage(body.ResponseCollection.Response, bytesFromHTTP); } break; } case WOPIOperations.GetFile: objectOut = bytesFromHTTP; binaryStructureRopName = "GetFile"; break; case WOPIOperations.DeleteFile: case WOPIOperations.Lock: case WOPIOperations.GetRestrictedLink: case WOPIOperations.PutFile: case WOPIOperations.RefreshLock: case WOPIOperations.RevokeRestrictedLink: case WOPIOperations.Unlock: case WOPIOperations.UnlockAndRelock: case WOPIOperations.GetLock: case WOPIOperations.PutUserInfo: objectOut = string.Format("{0} operation's response body is null", operation.ToString()); break; default: throw new Exception("The WOPI operations type is not right."); } } return objectOut; } catch (Exception ex) { objectOut = ex.ToString(); return objectOut; } }
public void IncreaseVariable(TrafficDirection direction, string address, string varName, int value) { }
/// <summary> /// Parse the HTTP payload to WOPI message. /// </summary> /// <param name="requestHeaders">The HTTP request header.</param> /// <param name="responseHeaders">The HTTP response header.</param> /// <param name="url">url for a HTTP message.</param> /// <param name="bytesFromHTTP">The raw data from HTTP layer.</param> /// <param name="direction">The direction of the traffic.</param> /// <returns>The object parsed result</returns> public object ParseHTTPPayloadForWOPI(HTTPHeaders requestHeaders, HTTPHeaders responseHeaders, string url, byte[] bytesFromHTTP, out string binaryStructureRopName, TrafficDirection direction) { object objectOut = null; binaryStructureRopName = string.Empty; try { if (direction == TrafficDirection.Out && responseHeaders.Exists("Transfer-Encoding") && responseHeaders["Transfer-Encoding"] == "chunked") { bytesFromHTTP = Utilities.GetPaylodFromChunkedBody(bytesFromHTTP); } Stream stream = new MemoryStream(bytesFromHTTP); StreamReader reader = new StreamReader(stream); string text = reader.ReadToEnd(); WOPIOperations operation = GetWOPIOperationName(requestHeaders, url); if (direction == TrafficDirection.In) { switch (operation) { case WOPIOperations.PutRelativeFile: objectOut = bytesFromHTTP; binaryStructureRopName = "PutRelativeFile"; break; case WOPIOperations.PutFile: objectOut = bytesFromHTTP; binaryStructureRopName = "PutFile"; break; case WOPIOperations.ExecuteCellStorageRelativeRequest: case WOPIOperations.ExecuteCellStorageRequest: byte[] cellreq = bytesFromHTTP; MemoryStream ms; if (requestHeaders.Exists("Content-Encoding") && requestHeaders["Content-Encoding"] == "gzip") { cellreq = Fiddler.Utilities.GzipExpand(cellreq); ms = new MemoryStream(cellreq); } else { ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(text ?? "")); } XmlSerializer serializer = new XmlSerializer(typeof(RequestEnvelope)); RequestEnvelope requestEnvelop = (RequestEnvelope)serializer.Deserialize(ms); objectOut = requestEnvelop.Body; if (requestEnvelop.Body.RequestCollection != null) { TryParseFSSHTTPBRequestMessage(requestEnvelop.Body.RequestCollection.Request, bytesFromHTTP); } break; case WOPIOperations.PutUserInfo: objectOut = text; break; case WOPIOperations.Discovery: case WOPIOperations.CheckFileInfo: case WOPIOperations.Lock: case WOPIOperations.RefreshLock: case WOPIOperations.RevokeRestrictedLink: case WOPIOperations.Unlock: case WOPIOperations.UnlockAndRelock: case WOPIOperations.GetLock: case WOPIOperations.DeleteFile: case WOPIOperations.ReadSecureStore: case WOPIOperations.RenameFile: case WOPIOperations.GetRestrictedLink: case WOPIOperations.CheckFolderInfo: case WOPIOperations.GetFile: case WOPIOperations.EnumerateChildren: objectOut = string.Format("{0} operation's request body is null", operation.ToString()); break; default: throw new Exception("The WOPI operations type is not right."); } } else { string status = this.session.ResponseHeaders.HTTPResponseStatus.Replace(" " + this.session.ResponseHeaders.StatusDescription, string.Empty); if (Convert.ToUInt32(status) != 200)// the status is not success { return(null); } ResponseBodyBase responseBody = new ResponseBodyBase(); switch (operation) { case WOPIOperations.Discovery: MemoryStream discoveryms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(text ?? "")); XmlSerializer discoverySerializer = new XmlSerializer(typeof(wopidiscovery)); wopidiscovery discoveryres = (wopidiscovery)discoverySerializer.Deserialize(discoveryms); objectOut = discoveryres; break; case WOPIOperations.CheckFileInfo: objectOut = WOPISerilizer.JsonToObject <CheckFileInfo>(text); break; case WOPIOperations.CheckFolderInfo: objectOut = WOPISerilizer.JsonToObject <CheckFolderInfo>(text); break; case WOPIOperations.PutRelativeFile: objectOut = WOPISerilizer.JsonToObject <PutRelativeFile>(text); break; case WOPIOperations.ReadSecureStore: objectOut = WOPISerilizer.JsonToObject <ReadSecureStore>(text); break; case WOPIOperations.EnumerateChildren: objectOut = WOPISerilizer.JsonToObject <EnumerateChildren>(text); break; case WOPIOperations.RenameFile: objectOut = WOPISerilizer.JsonToObject <RenameFile>(text); break; case WOPIOperations.ExecuteCellStorageRelativeRequest: case WOPIOperations.ExecuteCellStorageRequest: { byte[] cellres = bytesFromHTTP; MemoryStream ms; string res; if (responseHeaders.Exists("Content-Encoding") && responseHeaders["Content-Encoding"] == "gzip") { cellres = Fiddler.Utilities.GzipExpand(cellres); string res_sub = System.Text.Encoding.UTF8.GetString(cellres); res = string.Format("{0}{1}{2}", @"<Body>", res_sub, "</Body>"); } else { res = string.Format("{0}{1}{2}", @"<Body>", text, "</Body>"); } ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(res ?? "")); XmlSerializer serializer = new XmlSerializer(typeof(ResponseEnvelopeBody)); ResponseEnvelopeBody body = (ResponseEnvelopeBody)serializer.Deserialize(ms); objectOut = body; // if SubResponseData has fsshttpb messages do parser. if (body.ResponseCollection != null) { TryParseFSSHTTPBResponseMessage(body.ResponseCollection.Response, bytesFromHTTP); } break; } case WOPIOperations.GetFile: objectOut = bytesFromHTTP; binaryStructureRopName = "GetFile"; break; case WOPIOperations.DeleteFile: case WOPIOperations.Lock: case WOPIOperations.GetRestrictedLink: case WOPIOperations.PutFile: case WOPIOperations.RefreshLock: case WOPIOperations.RevokeRestrictedLink: case WOPIOperations.Unlock: case WOPIOperations.UnlockAndRelock: case WOPIOperations.GetLock: case WOPIOperations.PutUserInfo: objectOut = string.Format("{0} operation's response body is null", operation.ToString()); break; default: throw new Exception("The WOPI operations type is not right."); } } return(objectOut); } catch (Exception ex) { objectOut = ex.ToString(); return(objectOut); } }
/// <summary> /// Parse the HTTP payload to FSSHTTP and WOPI message. /// </summary> /// <param name="responseHeaders">The HTTP response header.</param> /// <param name="bytesFromHTTP">The raw data from HTTP layer.</param> /// <param name="direction">The direction of the traffic.</param> /// <returns>The object parsed result</returns> public object ParseHTTPPayloadForFSSHTTP(HTTPHeaders responseHeaders, byte[] bytesFromHTTP, TrafficDirection direction) { object objectOut = null; byte[] emptyByte = new byte[0]; if (bytesFromHTTP == null || bytesFromHTTP.Length == 0) { return null; } try { if (direction == TrafficDirection.Out && responseHeaders.Exists("Transfer-Encoding") && responseHeaders["Transfer-Encoding"] == "chunked") { bytesFromHTTP = Utilities.GetPaylodFromChunkedBody(bytesFromHTTP); } Stream stream = new MemoryStream(bytesFromHTTP); StreamReader reader = new StreamReader(stream); string text = reader.ReadToEnd(); Regex SOAPRegex = new Regex(@"\<s:Envelop.*\<\/s:Envelope\>"); // extract envelop from http payload. if (SOAPRegex.Match(text).Success) { XmlDocument doc = new XmlDocument(); string soapbody = SOAPRegex.Match(text).Value; if (direction == TrafficDirection.In) { Regex FSSHTTPRequestRegex = new Regex("xsi:type=\"\\w*\"\\s"); // remove xsi:type in xml message. this xsi:type is used for inherit in xmlSerializer. string FSSHTTPRequest = FSSHTTPRequestRegex.Replace(soapbody, string.Empty); MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(FSSHTTPRequest ?? "")); XmlSerializer serializer = new XmlSerializer(typeof(RequestEnvelope)); RequestEnvelope requestEnvelop = (RequestEnvelope)serializer.Deserialize(ms); objectOut = requestEnvelop.Body; // if SubRequestData has fsshttpb messages do parser. if (requestEnvelop.Body.RequestCollection != null) { TryParseFSSHTTPBRequestMessage(requestEnvelop.Body.RequestCollection.Request, bytesFromHTTP); } } else { MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(soapbody ?? "")); XmlSerializer serializer = new XmlSerializer(typeof(ResponseEnvelope)); ResponseEnvelope responseEnvelop = (ResponseEnvelope)serializer.Deserialize(ms); objectOut = responseEnvelop.Body; // if SubResponseData has fsshttpb messages do parser. if (responseEnvelop.Body.ResponseCollection != null) { TryParseFSSHTTPBResponseMessage(responseEnvelop.Body.ResponseCollection.Response, bytesFromHTTP); } } } return objectOut; } catch (Exception ex) { objectOut = ex.ToString(); return objectOut; } }
/// <summary> /// Returns gate state /// </summary> public State this[TrafficDirection direction] { get{ return direction==TrafficDirection.Incoming ? m_IncomingState : m_OutgoingState; } }
public void SetVariable(TrafficDirection direction, string address, string varName, int value) { }
private void setVariable(bool inc, TrafficDirection direction, string address, string varName, int value) { if (!Running || address.IsNullOrWhiteSpace() || varName.IsNullOrWhiteSpace() || value==0) return; var state = this[direction]; var grp = state.FindGroupForAddress(address); var key = grp==null ? address : grp.Key; var nstate = state.NetState.GetOrAdd(key, (k) => grp==null ? new NetSiteState(address) : new NetSiteState(grp)); lock(nstate) { if (inc) { NetSiteState._value vval; if (!nstate.m_Variables.TryGetValue(varName, out vval)) { nstate.m_Variables[varName] = vval = new NetSiteState._value(); } vval.Value += value; } else nstate.m_Variables[varName] = new NetSiteState._value{Value = value}; } }
/// <summary> /// Sets the named variable in the network scope which this specified traffic falls under /// </summary> public virtual void SetVariable(TrafficDirection direction, string address, string varName, int value) { if (!m_Enabled) return; setVariable(false, direction, address, varName, value); }
/// <summary> /// Returns gate state /// </summary> public State this[TrafficDirection direction] { get{ return(direction == TrafficDirection.Incoming ? m_IncomingState : m_OutgoingState); } }
/// <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(); } }
private void DataTraffic(string port_name, DateTime event_time, TrafficDirection direction, byte[] data) { event_handler.Invoke(port_name, event_time, direction, data); }
/// <summary> /// Parse the FSSHTTPB Bytes. /// </summary> /// <param name="FSSHTTPBbytes">The raw date contains FSSHTTPB message.</param> /// <param name="direction">The direction of the traffic.</param> /// <returns>The object parsed result</returns> public object ParseFSSHTTPBBytes(byte[] FSSHTTPBbytes, TrafficDirection direction) { object objectOut = null; byte[] emptyByte = new byte[0]; if (FSSHTTPBbytes == null || FSSHTTPBbytes.Length == 0) { return null; } try { if (direction == TrafficDirection.In) { FsshttpbRequest FsshttpbReq = new FsshttpbRequest(); MemoryStream s = new MemoryStream(FSSHTTPBbytes); FsshttpbReq.Parse(s); objectOut = FsshttpbReq; } else { FsshttpbResponse FsshttpbRes = new FsshttpbResponse(); MemoryStream s = new MemoryStream(FSSHTTPBbytes); FsshttpbRes.Parse(s); objectOut = FsshttpbRes; } return objectOut; } catch (Exception ex) { objectOut = ex.ToString(); return objectOut; } }