public string SelectOperation(ref Message message) { string action = message.Headers.Action; string str2 = null; byte[] defaultId = PeerNodeImplementation.DefaultId; string str3 = PeerStrings.FindAction(action); Uri via = null; Uri uri2 = null; bool flag = false; PeerMessageProperty property = new PeerMessageProperty(); if (str3 != null) { return(str3); } try { str2 = PeerMessageHelpers.GetHeaderString(message.Headers, "FloodMessage", "http://schemas.microsoft.com/net/2006/05/peer"); via = PeerMessageHelpers.GetHeaderUri(message.Headers, "PeerVia", "http://schemas.microsoft.com/net/2006/05/peer"); uri2 = PeerMessageHelpers.GetHeaderUri(message.Headers, "PeerTo", "http://schemas.microsoft.com/net/2006/05/peer"); } catch (MessageHeaderException exception) { System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception, TraceEventType.Warning); return("Fault"); } catch (SerializationException exception2) { System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception2, TraceEventType.Warning); return("Fault"); } catch (XmlException exception3) { System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception3, TraceEventType.Warning); return("Fault"); } property.PeerVia = via; property.PeerTo = uri2; message.Properties.Add("PeerProperty", property); if (!(str2 == "PeerFlooder")) { return(null); } try { if (!this.messageHandler.ValidateIncomingMessage(ref message, via)) { property.SkipLocalChannels = true; flag = true; TurnOffSecurityHeader(message); } if (this.messageHandler.IsNotSeenBefore(message, out defaultId, out property.CacheMiss)) { property.MessageVerified = true; } else if (!flag) { property.SkipLocalChannels = true; } if (defaultId == PeerNodeImplementation.DefaultId) { return("Fault"); } } catch (MessageHeaderException exception4) { System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception4, TraceEventType.Warning); return("Fault"); } catch (SerializationException exception5) { System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception5, TraceEventType.Warning); return("Fault"); } catch (XmlException exception6) { System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception6, TraceEventType.Warning); return("Fault"); } catch (MessageSecurityException exception7) { if (!exception7.ReplayDetected) { return("Fault"); } System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception7, TraceEventType.Information); } return("FloodMessage"); }
public virtual IAsyncResult OnFloodedMessage(IPeerNeighbor neighbor, TFloodContract floodInfo, AsyncCallback callback, object state) { bool useful = false; MessageBuffer messageBuffer = null; Message message = null; int index = 0; ulong maxValue = ulong.MaxValue; MessageHeader hopHeader = null; bool flag2 = false; PeerMessageProperty property = null; IAsyncResult result = null; try { property = (PeerMessageProperty)floodInfo.Properties["PeerProperty"]; if (!property.MessageVerified) { if (property.CacheMiss > 2) { UtilityExtension.ReportCacheMiss(neighbor, property.CacheMiss); } result = new CompletedAsyncResult(callback, state); } else { useful = true; messageBuffer = floodInfo.CreateBufferedCopy((int)this.config.MaxReceivedMessageSize); message = messageBuffer.CreateMessage(); Uri peerVia = property.PeerVia; Uri peerTo = property.PeerTo; message.Headers.To = message.Properties.Via = peerVia; index = this.UpdateHopCount(message, out hopHeader, out maxValue); PeerMessagePropagation localAndRemote = PeerMessagePropagation.LocalAndRemote; if (property.SkipLocalChannels) { localAndRemote = PeerMessagePropagation.Remote; } else if (this.messageHandler.HasMessagePropagation) { using (Message message2 = messageBuffer.CreateMessage()) { localAndRemote = this.messageHandler.DetermineMessagePropagation(message2, PeerMessageOrigination.Remote); } } if (((localAndRemote & PeerMessagePropagation.Remote) != PeerMessagePropagation.None) && (maxValue == 0L)) { localAndRemote &= ~PeerMessagePropagation.Remote; } if ((localAndRemote & PeerMessagePropagation.Remote) != PeerMessagePropagation.None) { result = this.BeginFloodReceivedMessage(neighbor, messageBuffer, PeerTransportConstants.ForwardTimeout, callback, state, index, hopHeader); } else { result = new CompletedAsyncResult(callback, state); } if ((localAndRemote & PeerMessagePropagation.Local) != PeerMessagePropagation.None) { this.messageHandler.HandleIncomingMessage(messageBuffer, localAndRemote, index, hopHeader, peerVia, peerTo); } } UtilityExtension.UpdateLinkUtility(neighbor, useful); } catch (Exception exception) { if (Fx.IsFatal(exception)) { flag2 = true; throw; } if (PeerFlooderBase <TFloodContract, TLinkContract> .CloseNeighborIfKnownException(this.neighborManager, exception, neighbor) != null) { throw; } System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception, TraceEventType.Information); } finally { if (!flag2) { if (message != null) { message.Close(); } if (messageBuffer != null) { messageBuffer.Close(); } } } return(result); }
public virtual IAsyncResult OnFloodedMessage(IPeerNeighbor neighbor, TFloodContract floodInfo, AsyncCallback callback, object state) { bool process = false; MessageBuffer messageBuffer = null; Message message = null; Uri via; Uri to; int index = 0; ulong remainingHops = PeerTransportConstants.MaxHopCount; MessageHeader hopHeader = null; bool fatal = false; PeerMessageProperty peerProperty = null; IAsyncResult result = null; try { peerProperty = (PeerMessageProperty)floodInfo.Properties[PeerStrings.PeerProperty]; if (!peerProperty.MessageVerified) { if (peerProperty.CacheMiss > UtilityExtension.AcceptableMissDistance) { UtilityExtension.ReportCacheMiss(neighbor, peerProperty.CacheMiss); } result = new CompletedAsyncResult(callback, state); } else { process = true; messageBuffer = floodInfo.CreateBufferedCopy((int)this.config.MaxReceivedMessageSize); message = messageBuffer.CreateMessage(); via = peerProperty.PeerVia; to = peerProperty.PeerTo; message.Headers.To = message.Properties.Via = via; index = UpdateHopCount(message, out hopHeader, out remainingHops); PeerMessagePropagation propagateFlags = PeerMessagePropagation.LocalAndRemote; if (peerProperty.SkipLocalChannels) { propagateFlags = PeerMessagePropagation.Remote; } else if (messageHandler.HasMessagePropagation) { using (Message filterMessage = messageBuffer.CreateMessage()) { propagateFlags = messageHandler.DetermineMessagePropagation(filterMessage, PeerMessageOrigination.Remote); } } if ((propagateFlags & PeerMessagePropagation.Remote) != 0) { if (remainingHops == 0) { propagateFlags &= ~PeerMessagePropagation.Remote; } } if ((propagateFlags & PeerMessagePropagation.Remote) != 0) { result = BeginFloodReceivedMessage(neighbor, messageBuffer, PeerTransportConstants.ForwardTimeout, callback, state, index, hopHeader); } else { result = new CompletedAsyncResult(callback, state); } if ((propagateFlags & PeerMessagePropagation.Local) != 0) { messageHandler.HandleIncomingMessage(messageBuffer, propagateFlags, index, hopHeader, via, to); } } UtilityExtension.UpdateLinkUtility(neighbor, process); } catch (Exception e) { if (Fx.IsFatal(e)) { fatal = true; throw; } if (null != CloseNeighborIfKnownException(neighborManager, e, neighbor)) { throw; } DiagnosticUtility.TraceHandledException(e, TraceEventType.Information); } finally { if (!fatal) { if (message != null) { message.Close(); } if (messageBuffer != null) { messageBuffer.Close(); } } } return(result); }
public string SelectOperation(ref Message message) { string action = message.Headers.Action; string demux = null; byte[] id = PeerNodeImplementation.DefaultId; string operation = PeerStrings.FindAction(action); Uri via = null; Uri to = null; bool skipped = false; PeerMessageProperty peerProperty = new PeerMessageProperty(); if (operation != null) { return(operation); } try { demux = PeerMessageHelpers.GetHeaderString(message.Headers, PeerOperationNames.Flood, PeerStrings.Namespace); via = PeerMessageHelpers.GetHeaderUri(message.Headers, PeerStrings.Via, PeerStrings.Namespace); to = PeerMessageHelpers.GetHeaderUri(message.Headers, PeerOperationNames.PeerTo, PeerStrings.Namespace); } catch (MessageHeaderException e) { DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning); return(PeerOperationNames.Fault); } catch (SerializationException e) { DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning); return(PeerOperationNames.Fault); } catch (XmlException e) { DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning); return(PeerOperationNames.Fault); } peerProperty.PeerVia = via; peerProperty.PeerTo = to; message.Properties.Add(PeerStrings.PeerProperty, peerProperty); if (demux == PeerOperationNames.Demuxer) { try { if (!this.messageHandler.ValidateIncomingMessage(ref message, via)) { peerProperty.SkipLocalChannels = true; skipped = true; TurnOffSecurityHeader(message); } if (this.messageHandler.IsNotSeenBefore(message, out id, out peerProperty.CacheMiss)) { peerProperty.MessageVerified = true; } else { if (!skipped) { peerProperty.SkipLocalChannels = true; } } //means that the message doesnt contain legal id if (id == PeerNodeImplementation.DefaultId) { return(PeerOperationNames.Fault); } } catch (MessageHeaderException e) { DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning); return(PeerOperationNames.Fault); } catch (SerializationException e) { DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning); return(PeerOperationNames.Fault); } catch (XmlException e) { DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning); return(PeerOperationNames.Fault); } catch (MessageSecurityException e) { if (!e.ReplayDetected) { return(PeerOperationNames.Fault); } else { DiagnosticUtility.TraceHandledException(e, TraceEventType.Information); } } return(PeerOperationNames.Flood); } else { return(null); } }
public string SelectOperation(ref Message message) { string action = message.Headers.Action; string str2 = null; byte[] defaultId = PeerNodeImplementation.DefaultId; string str3 = PeerStrings.FindAction(action); Uri via = null; Uri uri2 = null; bool flag = false; PeerMessageProperty property = new PeerMessageProperty(); if (str3 != null) { return str3; } try { str2 = PeerMessageHelpers.GetHeaderString(message.Headers, "FloodMessage", "http://schemas.microsoft.com/net/2006/05/peer"); via = PeerMessageHelpers.GetHeaderUri(message.Headers, "PeerVia", "http://schemas.microsoft.com/net/2006/05/peer"); uri2 = PeerMessageHelpers.GetHeaderUri(message.Headers, "PeerTo", "http://schemas.microsoft.com/net/2006/05/peer"); } catch (MessageHeaderException exception) { System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception, TraceEventType.Warning); return "Fault"; } catch (SerializationException exception2) { System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception2, TraceEventType.Warning); return "Fault"; } catch (XmlException exception3) { System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception3, TraceEventType.Warning); return "Fault"; } property.PeerVia = via; property.PeerTo = uri2; message.Properties.Add("PeerProperty", property); if (!(str2 == "PeerFlooder")) { return null; } try { if (!this.messageHandler.ValidateIncomingMessage(ref message, via)) { property.SkipLocalChannels = true; flag = true; TurnOffSecurityHeader(message); } if (this.messageHandler.IsNotSeenBefore(message, out defaultId, out property.CacheMiss)) { property.MessageVerified = true; } else if (!flag) { property.SkipLocalChannels = true; } if (defaultId == PeerNodeImplementation.DefaultId) { return "Fault"; } } catch (MessageHeaderException exception4) { System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception4, TraceEventType.Warning); return "Fault"; } catch (SerializationException exception5) { System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception5, TraceEventType.Warning); return "Fault"; } catch (XmlException exception6) { System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception6, TraceEventType.Warning); return "Fault"; } catch (MessageSecurityException exception7) { if (!exception7.ReplayDetected) { return "Fault"; } System.ServiceModel.DiagnosticUtility.ExceptionUtility.TraceHandledException(exception7, TraceEventType.Information); } return "FloodMessage"; }
public string SelectOperation(ref Message message) { string action = message.Headers.Action; string demux = null; byte[] id = PeerNodeImplementation.DefaultId; string operation = PeerStrings.FindAction(action); Uri via = null; Uri to = null; bool skipped = false; PeerMessageProperty peerProperty = new PeerMessageProperty(); if (operation != null) return operation; try { demux = PeerMessageHelpers.GetHeaderString(message.Headers, PeerOperationNames.Flood, PeerStrings.Namespace); via = PeerMessageHelpers.GetHeaderUri(message.Headers, PeerStrings.Via, PeerStrings.Namespace); to = PeerMessageHelpers.GetHeaderUri(message.Headers, PeerOperationNames.PeerTo, PeerStrings.Namespace); } catch (MessageHeaderException e) { DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning); return PeerOperationNames.Fault; } catch (SerializationException e) { DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning); return PeerOperationNames.Fault; } catch (XmlException e) { DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning); return PeerOperationNames.Fault; } peerProperty.PeerVia = via; peerProperty.PeerTo = to; message.Properties.Add(PeerStrings.PeerProperty, peerProperty); if (demux == PeerOperationNames.Demuxer) { try { if (!this.messageHandler.ValidateIncomingMessage(ref message, via)) { peerProperty.SkipLocalChannels = true; skipped = true; TurnOffSecurityHeader(message); } if (this.messageHandler.IsNotSeenBefore(message, out id, out peerProperty.CacheMiss)) { peerProperty.MessageVerified = true; } else { if (!skipped) { peerProperty.SkipLocalChannels = true; } } //means that the message doesnt contain legal id if (id == PeerNodeImplementation.DefaultId) return PeerOperationNames.Fault; } catch (MessageHeaderException e) { DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning); return PeerOperationNames.Fault; } catch (SerializationException e) { DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning); return PeerOperationNames.Fault; } catch (XmlException e) { DiagnosticUtility.TraceHandledException(e, TraceEventType.Warning); return PeerOperationNames.Fault; } catch (MessageSecurityException e) { if (!e.ReplayDetected) return PeerOperationNames.Fault; else DiagnosticUtility.TraceHandledException(e, TraceEventType.Information); } return PeerOperationNames.Flood; } else return null; }