예제 #1
0
        private void putResponse(TcpClient client, MemoryStream ms, ResponseMsg response, SlimSerializer serializer)
        {
            var frameBegin = Consts.PACKET_DELIMITER_LENGTH;

            ms.Position = frameBegin;

            var frame = new WireFrame(WireFrame.SLIM_FORMAT, true, response.RequestID);

            // Write the frame
            var frameSize = frame.Serialize(ms);

            // Write the message
            serializer.Serialize(ms, response);

            var size = (int)ms.Position - frameBegin;

            var buffer = ms.GetBuffer(); //no stream expansion beyond this point

            buffer.WriteBEInt32(0, size);

            Binding.DumpMsg(true, response, buffer, 0, (int)ms.Position);

            if (size > Binding.MaxMsgSize)
            {
                Instrumentation.ServerSerializedOverMaxMsgSizeErrorEvent.Happened(Node);
                throw new MessageSizeException(size, Binding.MaxMsgSize, "putResponse()", serializer.BatchTypesAdded);
            }

            client.GetStream().Write(buffer, 0, (int)ms.Position);

            stat_MsgSent();
            stat_BytesSent(size);
        }
예제 #2
0
        private int serialize(MemChunk chunk, WireFrame frame, Msg msg)
        {
            chunk.Position = sizeof(int);
            frame.Serialize(chunk);
            Binding.Serializer.Serialize(chunk, msg);
            var size = (int)chunk.Position; //includes 4 byte len prefix

            var buff = chunk.GetBuffer();   //no stream expansion beyond this point

            buff.WriteBEInt32(0, size);
            return(size);
        }
예제 #3
0
        private void putRequest(RequestMsg request)
        {
            var ms        = m_MemStream;
            var dataBegin = Consts.PACKET_DELIMITER_LENGTH;

            ms.Position = dataBegin;

            var frame = new WireFrame(WireFrame.SLIM_FORMAT, request.OneWay, request.RequestID);

            // Write the frame
            var frameSize = frame.Serialize(ms);

            // Write the message
            m_Serializer.Serialize(ms, request);

            var size = (int)ms.Position - dataBegin;

            var buffer = ms.GetBuffer();   //no stream expansion beyond this point

            buffer.WriteBEInt32(0, size);

            Binding.DumpMsg(false, request, buffer, 0, (int)ms.Position);

            if (size > Binding.MaxMsgSize)
            {
                Instrumentation.ClientSerializedOverMaxMsgSizeErrorEvent.Happened(Node);
                //do not tear the socket, however we may have added extra types to Serializer typereg that server never received
                //so in thatcase we do close the channel
                throw new MessageSizeException(size, Binding.MaxMsgSize, "putRequest(" + request.RequestID + ")", m_Serializer.BatchTypesAdded);
            }

            m_Client.GetStream().Write(buffer, 0, (int)ms.Position);

            stat_MsgSent();
            stat_BytesSent(size);
        }
예제 #4
0
        public void EchoResponse_SerializeDeserialize()
        {
            var frm1 = new WireFrame(FrameType.EchoResponse, 123, false, FID.Generate());
            Assert.IsTrue( frm1.OneWay );
            Assert.AreEqual( WireFrame.FRAME_LENGTH, frm1.Length );

            var ms = new MemoryStream();

            Assert.AreEqual(WireFrame.FRAME_LENGTH, frm1.Serialize(ms));

            ms.Position = 0;

            var frm2 = new WireFrame(ms);

            Assert.AreEqual( frm1.Type, frm2.Type );
            Assert.AreEqual( frm1.RequestID, frm2.RequestID );
            Assert.AreEqual( frm1.OneWay, frm2.OneWay );

            Assert.AreEqual( frm1.Length, frm2.Length );
            Assert.AreEqual( frm1.Format, frm2.Format );
            Assert.AreEqual( frm1.HeadersContent, frm2.HeadersContent );

            Assert.IsTrue( frm2.OneWay );
        }
예제 #5
0
        public void Glue_SerializeDeserialize_WithHeadersWithLatinText()
        {
            var hdr = "<a><remote name='zzz'/></a>";//Latin only chars

            var frm1 = new WireFrame(123, false, FID.Generate(), hdr);

            var utfLen = WireFrame.HEADERS_ENCODING.GetByteCount( hdr );

            Assert.IsTrue( utfLen == hdr.Length);

            Assert.AreEqual( WireFrame.FRAME_LENGTH + hdr.Length, frm1.Length );

            var ms = new MemoryStream();

            Assert.AreEqual(WireFrame.FRAME_LENGTH + hdr.Length, frm1.Serialize(ms));

            ms.Position = 0;

            var frm2 = new WireFrame(ms);

            Assert.AreEqual( frm1.Type, frm2.Type );
            Assert.AreEqual( frm1.RequestID, frm2.RequestID );
            Assert.AreEqual( frm1.OneWay, frm2.OneWay );

            Assert.AreEqual( frm1.Length, frm2.Length );
            Assert.AreEqual( frm1.Format, frm2.Format );
            Assert.AreEqual( frm1.HeadersContent, frm2.HeadersContent );

            Assert.IsFalse( frm2.OneWay );

            Assert.AreEqual( "zzz", frm2.Headers["remote"].AttrByName("name").Value);
        }
예제 #6
0
        public void Glue_SerializeDeserialize_WithHeadersWithChineseText()
        {
            var hdr = "<a><remote name='久有归天愿'/></a>";

            var frm1 = new WireFrame(123, false, FID.Generate(), hdr);

            var utfLen = WireFrame.HEADERS_ENCODING.GetByteCount( hdr );

            Assert.IsTrue( utfLen > hdr.Length);
            Console.WriteLine("{0} has {1} byte len and {2} char len".Args(hdr, utfLen, hdr.Length) );

            Assert.AreEqual( WireFrame.FRAME_LENGTH + utfLen, frm1.Length );

            var ms = new MemoryStream();

            Assert.AreEqual(WireFrame.FRAME_LENGTH + utfLen, frm1.Serialize(ms));

            ms.Position = 0;

            var frm2 = new WireFrame(ms);

            Assert.AreEqual( frm1.Type, frm2.Type );
            Assert.AreEqual( frm1.RequestID, frm2.RequestID );
            Assert.AreEqual( frm1.OneWay, frm2.OneWay );

            Assert.AreEqual( frm1.Length, frm2.Length );
            Assert.AreEqual( frm1.Format, frm2.Format );
            Assert.AreEqual( frm1.HeadersContent, frm2.HeadersContent );

            Assert.IsFalse( frm2.OneWay );

            Assert.AreEqual( "久有归天愿", frm2.Headers["remote"].AttrByName("name").Value);
        }