예제 #1
0
        byte[] ProcessMessage(Message message, TestEngine.MessageSpoiler spoiler)
        {
            MemoryStream originalStream = new MemoryStream();

            baseEncoder.WriteMessage(message, originalStream);

            byte[] originalMessage = originalStream.GetBuffer();
            string content         = Encoding.GetEncoding(factory.CharSet).GetString(originalMessage);

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.LoadXml(content);

            System.Diagnostics.Debug.WriteLine("Content before spoiling: ");
            System.Diagnostics.Debug.WriteLine(content);

            if (spoiler.NodesToReplace != null)
            {
                XmlNamespaceManager manager = new XmlNamespaceManager(xmlDoc.NameTable);
                foreach (string key in spoiler.Namespaces.Keys)
                {
                    manager.AddNamespace(key, spoiler.Namespaces[key]);
                }

                foreach (string nodePath in spoiler.NodesToReplace.Keys)
                {
                    XmlNode node = xmlDoc.SelectSingleNode(nodePath, manager);
                    if (node != null)
                    {
                        node.InnerText = spoiler.NodesToReplace[nodePath];
                    }
                }
            }

            MemoryStream stream = new MemoryStream();

            Encoding encoding;

            if (factory.CharSet.ToUpper() == "UTF-8")
            {
                encoding = new UTF8Encoding(false);
            }
            else
            {
                encoding = Encoding.GetEncoding(factory.CharSet);
            }
            XmlWriter writer = new XmlTextWriter(stream, encoding);

            xmlDoc.WriteTo(writer);
            writer.Close();

            byte[] messageBytes = stream.GetBuffer();
            return(messageBytes);
        }
예제 #2
0
        public override ArraySegment <byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
        {
            ArraySegment <byte> byteArray;
            string content;

            TestEngine.MessageSpoiler spoiler = null;
            if (_bindingElement != null)
            {
                spoiler = _bindingElement.Spoiler;
            }

            if (spoiler == null)
            {
                byteArray = baseEncoder.WriteMessage(message, maxMessageSize, bufferManager);

                byte[] messageBytes = byteArray.Array;
                content = Encoding.GetEncoding(factory.CharSet).GetString(messageBytes, byteArray.Offset, byteArray.Count);
            }
            else
            {
                byte[] messageBytes  = ProcessMessage(message, spoiler);
                int    messageLength = messageBytes.Length;

                int totalLength = messageLength + messageOffset;

                byte[] totalBytes = bufferManager.TakeBuffer(totalLength);
                Array.Copy(messageBytes, 0, totalBytes, messageOffset, messageLength);

                byteArray = new ArraySegment <byte>(totalBytes, messageOffset, messageLength);

                content = Encoding.GetEncoding(factory.CharSet).GetString(messageBytes);
                System.Diagnostics.Debug.WriteLine("Content after spoiling: ");
                System.Diagnostics.Debug.WriteLine(content);
            }

            foreach (ITrafficListener listener in _listeners)
            {
                listener.LogRequest(content);
            }

            return(byteArray);
        }
예제 #3
0
 public void AddBreakingBehaviour(TestEngine.MessageSpoiler spoiler)
 {
     _behaviourContainer.Spoiler = spoiler;
 }