Esempio n. 1
0
        public void SipTcpTransport_TransmitMultiple()
        {
            // Create two transport instances and send 10K messages from one to
            // the other and verify that they got through.

            TestTransport transport1 = new TestTransport();
            TestTransport transport2 = new TestTransport();
            SipRequest    sentMsg;
            SipRequest    recvMsg;

            try
            {
                transport1.Start(new NetworkBinding("127.0.0.1:5311"));
                transport2.Start(new NetworkBinding("127.0.0.1:5312"));

                for (int i = 0; i < 2500; i++)
                {
                    sentMsg = new SipRequest(SipMethod.Register, "sip:[email protected]", SipHelper.SIP20);
                    sentMsg.AddHeader(SipHeader.Via, string.Format("SIP/2.0/TCP {0}", transport1.LocalEndpoint));
                    sentMsg.AddHeader("Count", i.ToString());
                    sentMsg.Contents = GetContents(i);

                    transport1.Send(transport2.LocalEndpoint, sentMsg);
                    recvMsg = (SipRequest)transport2.Receive();

                    Assert.AreEqual(SipMethod.Register, recvMsg.Method);
                    Assert.AreEqual("sip:[email protected]", recvMsg.Uri);
                    Assert.AreEqual(SipHelper.SIP20, recvMsg.SipVersion);
                    Assert.AreEqual(sentMsg[SipHeader.Via].FullText, recvMsg[SipHeader.Via].FullText);
                    Assert.AreEqual(i.ToString(), recvMsg["Count"].FullText);
                    CollectionAssert.AreEqual(sentMsg.Contents, recvMsg.Contents);
                    Assert.AreEqual(transport1.LocalEndpoint.Address, recvMsg.RemoteEndpoint.Address);

                    // Send a message the other way.

                    sentMsg = new SipRequest(SipMethod.Register, "sip:[email protected]", SipHelper.SIP20);
                    sentMsg.AddHeader(SipHeader.Via, string.Format("SIP/2.0/TCP {0}", transport1.LocalEndpoint));
                    sentMsg.Contents = GetContents(i);

                    transport2.Send(transport1.LocalEndpoint, sentMsg);
                    recvMsg = (SipRequest)transport1.Receive();

                    Assert.AreEqual(SipMethod.Register, recvMsg.Method);
                    Assert.AreEqual("sip:[email protected]", recvMsg.Uri);
                    Assert.AreEqual(SipHelper.SIP20, recvMsg.SipVersion);
                    Assert.AreEqual(sentMsg[SipHeader.Via].FullText, recvMsg[SipHeader.Via].FullText);
                    CollectionAssert.AreEqual(sentMsg.Contents, recvMsg.Contents);
                    Assert.AreEqual(transport2.LocalEndpoint.Address, recvMsg.RemoteEndpoint.Address);
                }
            }
            finally
            {
                transport1.Stop();
                transport2.Stop();
            }
        }
Esempio n. 2
0
        public void SipTcpTransport_MultipleChunks()
        {
            // Transmit a message to a transport in several chunks to make
            // sure it can be reassembled properly.

            TestTransport  transport = new TestTransport();
            EnhancedSocket sock      = null;
            SipRequest     msg;
            SipRequest     recvMsg;

            byte[] buf;

            try
            {
                transport.Start(new NetworkBinding("127.0.0.1:5311"));

                sock = new EnhancedSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                sock.Connect("127.0.0.1", 5311);
                sock.NoDelay = true;

                msg = new SipRequest(SipMethod.Register, "sip:[email protected]", SipHelper.SIP20);
                msg.AddHeader(SipHeader.Via, string.Format("SIP/2.0/TCP {0}", transport.LocalEndpoint));
                msg.AddHeader("Count", "0");
                msg.Contents = GetContents(25);

                buf = msg.ToArray();
                for (int i = 0; i < buf.Length; i++)
                {
                    sock.Send(buf, i, 1, SocketFlags.None);
                    Thread.Sleep(1);
                }

                recvMsg = (SipRequest)transport.Receive();
                Assert.AreEqual(SipMethod.Register, recvMsg.Method);
                Assert.AreEqual("sip:[email protected]", recvMsg.Uri);
                Assert.AreEqual(SipHelper.SIP20, recvMsg.SipVersion);
                Assert.AreEqual(msg[SipHeader.Via].FullText, recvMsg[SipHeader.Via].FullText);
                Assert.AreEqual("0", recvMsg["Count"].FullText);
                CollectionAssert.AreEqual(msg.Contents, recvMsg.Contents);
            }
            finally
            {
                if (sock != null)
                {
                    sock.Close();
                }

                transport.Stop();
            }
        }
Esempio n. 3
0
        public void Request_Basic()
        {
            SipBasicCore    core = null;
            SipCoreSettings settings;
            SipRequest      request;
            SipResult       result;
            string          serviceUri;

            try
            {
                settings          = new SipCoreSettings();
                settings.UserName = "******";
                settings.Password = "******";

                serviceUri = "sip:" + settings.TransportSettings[0].ExternalBinding.ToString();

                core = new SipBasicCore(settings);
                core.RequestReceived += new SipRequestDelegate(OnRequest);
                core.Start();

                request = new SipRequest(SipMethod.Info, serviceUri, null);
                request.AddHeader("Test", "OK");
                result = core.Request(request);

                Assert.AreEqual(SipStatus.OK, result.Status);
            }
            finally
            {
                if (core != null)
                {
                    core.Stop();
                }
            }
        }
Esempio n. 4
0
        public void SipMaxForwardsValue_Message()
        {
            SipRequest          message = new SipRequest(SipMethod.Invite, "sip:[email protected]", null);
            SipMaxForwardsValue v;

            Assert.IsNull(message.GetHeader <SipMaxForwardsValue>(SipHeader.MaxForwards));

            message.AddHeader(SipHeader.MaxForwards, new SipMaxForwardsValue(77));
            v = message.GetHeader <SipMaxForwardsValue>(SipHeader.MaxForwards);
            Assert.IsNotNull(v);
            Assert.AreEqual(77, v.Count);
        }
Esempio n. 5
0
        public void SipTcpTransport_TransmitSingle()
        {
            // Create two transport instances and send a message from one to
            // the other and verify that it got through.

            TestTransport transport1 = new TestTransport();
            TestTransport transport2 = new TestTransport();
            SipRequest    sentMsg;
            SipRequest    recvMsg;

            try
            {
                transport1.Start(new NetworkBinding("127.0.0.1:5311"));
                transport2.Start(new NetworkBinding("127.0.0.1:5312"));

                Assert.IsTrue(transport1.IsStreaming);
                Assert.AreEqual(SipTransportType.TCP, transport1.TransportType);

                sentMsg = new SipRequest(SipMethod.Register, "sip:[email protected]", SipHelper.SIP20);
                sentMsg.AddHeader(SipHeader.Via, string.Format("SIP/2.0/TCP {0}", transport1.LocalEndpoint));

                transport1.Send(transport2.LocalEndpoint, sentMsg);
                recvMsg = (SipRequest)transport2.Receive();

                Assert.AreEqual(SipMethod.Register, recvMsg.Method);
                Assert.AreEqual("sip:[email protected]", recvMsg.Uri);
                Assert.AreEqual(SipHelper.SIP20, recvMsg.SipVersion);
                Assert.AreEqual(sentMsg[SipHeader.Via].FullText, recvMsg[SipHeader.Via].FullText);
                Assert.AreEqual(transport1.LocalEndpoint.Address, recvMsg.RemoteEndpoint.Address);

                // Send a message the other way, this one with some content data

                sentMsg = new SipRequest(SipMethod.Register, "sip:[email protected]", SipHelper.SIP20);
                sentMsg.AddHeader(SipHeader.Via, string.Format("SIP/2.0/TCP {0}", transport1.LocalEndpoint));
                sentMsg.Contents = new byte[] { 0, 1, 2, 3, 4 };

                transport2.Send(transport1.LocalEndpoint, sentMsg);
                recvMsg = (SipRequest)transport1.Receive();

                Assert.AreEqual(SipMethod.Register, recvMsg.Method);
                Assert.AreEqual("sip:[email protected]", recvMsg.Uri);
                Assert.AreEqual(SipHelper.SIP20, recvMsg.SipVersion);
                Assert.AreEqual(sentMsg[SipHeader.Via].FullText, recvMsg[SipHeader.Via].FullText);
                CollectionAssert.AreEqual(new byte[] { 0, 1, 2, 3, 4 }, recvMsg.Contents);
                Assert.AreEqual(transport2.LocalEndpoint.Address, recvMsg.RemoteEndpoint.Address);
            }
            finally
            {
                transport1.Stop();
                transport2.Stop();
            }
        }
Esempio n. 6
0
        public void SipValue_Message()
        {
            SipRequest message = new SipRequest(SipMethod.Invite, "sip:[email protected]", null);
            SipValue   v;

            Assert.IsNull(message.GetHeader <SipValue>("Test"));

            message.AddHeader("Test", new SipValue("jeff;hello=world"));
            v = message.GetHeader <SipValue>("Test");
            Assert.IsNotNull(v);
            Assert.AreEqual("jeff", v.Text);
            Assert.AreEqual("world", v["hello"]);
        }
Esempio n. 7
0
        public void SipAuthenticateValue_Message()
        {
            SipRequest           message = new SipRequest(SipMethod.Invite, "sip:[email protected]", null);
            SipAuthenticateValue v;

            Assert.IsNull(message.GetHeader <SipAuthenticateValue>(SipHeader.WWWAuthenticate));

            message.AddHeader(SipHeader.WWWAuthenticate, new SipAuthenticateValue("Digest algorithm=MD5, realm=\"asterisk\", nonce=\"5c9dda7a\""));
            v = message.GetHeader <SipAuthenticateValue>(SipHeader.WWWAuthenticate);
            Assert.IsNotNull(v);
            Assert.AreEqual("MD5", v.Algorithm);
            Assert.AreEqual("asterisk", v.Realm);
        }
Esempio n. 8
0
        public void SipCSeqValue_Message()
        {
            SipRequest   message = new SipRequest(SipMethod.Invite, "sip:[email protected]", null);
            SipCSeqValue v;

            Assert.IsNull(message.GetHeader <SipCSeqValue>(SipHeader.CSeq));

            message.AddHeader(SipHeader.CSeq, new SipCSeqValue("10 INVITE"));
            v = message.GetHeader <SipCSeqValue>(SipHeader.CSeq);
            Assert.IsNotNull(v);
            Assert.AreEqual("INVITE", v.Method);
            Assert.AreEqual("10 INVITE", v.Text);
        }
Esempio n. 9
0
        public void SipContactValue_Message()
        {
            SipRequest      message = new SipRequest(SipMethod.Invite, "sip:[email protected]", null);
            SipContactValue v;

            Assert.IsNull(message.GetHeader <SipContactValue>(SipHeader.Contact));

            message.AddHeader(SipHeader.Contact, new SipContactValue("\"Jeff Lill\" <*****@*****.**>;hello=world"));
            v = message.GetHeader <SipContactValue>(SipHeader.Contact);
            Assert.IsNotNull(v);
            Assert.AreEqual("Jeff Lill", v.DisplayName);
            Assert.AreEqual("*****@*****.**", v.Uri);
            Assert.AreEqual("world", v["hello"]);
        }
Esempio n. 10
0
        public void SipViaValue_Message()
        {
            SipRequest  message = new SipRequest(SipMethod.Invite, "sip:[email protected]", null);
            SipViaValue v;

            Assert.IsNull(message.GetHeader <SipViaValue>("Test"));

            message.AddHeader(SipHeader.Via, new SipViaValue("SIP/2.0/UDP 1.2.3.4;received=5.6.7.8"));
            v = message.GetHeader <SipViaValue>(SipHeader.Via);
            Assert.IsNotNull(v);
            Assert.AreEqual(SipTransportType.UDP, v.TransportType);
            Assert.AreEqual("1.2.3.4", v.SentBy);
            Assert.AreEqual("5.6.7.8", v.Received);
        }
Esempio n. 11
0
        public void SipAuthorizationValue_Message()
        {
            SipRequest            message = new SipRequest(SipMethod.Invite, "sip:[email protected]", null);
            SipAuthenticateValue  vChallenge;
            SipAuthorizationValue vResponse;
            SipAuthorizationValue v;

            vChallenge = new SipAuthenticateValue("Digest realm=\"asterisk\", nonce=\"5c9dda7a\"");
            vResponse  = new SipAuthorizationValue(vChallenge, "jslill", "q0jsrd7y", "REGISTER", "sip:sip4.vitelity.net");

            Assert.IsNull(message.GetHeader <SipAuthorizationValue>(SipHeader.Authorization));

            message.AddHeader(SipHeader.Authorization, vResponse);
            v = message.GetHeader <SipAuthorizationValue>(SipHeader.Authorization);
            Assert.IsNotNull(v);
            Assert.AreEqual(vResponse.Response, v.Response);
        }
Esempio n. 12
0
        public void SipUdpTransport_TransmitSingle()
        {
            // Create two transport instances and send a message from one to
            // the other and verify that it got through.

            TestTransport transport1 = new TestTransport();
            TestTransport transport2 = new TestTransport();
            SipRequest    sentMsg;
            SipRequest    recvMsg;

            try
            {
                transport1.Start(new NetworkBinding("127.0.0.1:ANY"));
                transport2.Start(new NetworkBinding("127.0.0.1:ANY"));

                Assert.IsFalse(transport1.IsStreaming);
                Assert.AreEqual(SipTransportType.UDP, transport1.TransportType);

                sentMsg = new SipRequest(SipMethod.Register, "sip:[email protected]", SipHelper.SIP20);
                sentMsg.AddHeader(SipHeader.Via, string.Format("SIP/2.0/UDP {0}", transport1.LocalEndpoint));

                transport1.Send(transport2.LocalEndpoint, sentMsg);
                recvMsg = (SipRequest)transport2.Receive();

                Assert.AreEqual(SipMethod.Register, recvMsg.Method);
                Assert.AreEqual("sip:[email protected]", recvMsg.Uri);
                Assert.AreEqual(SipHelper.SIP20, recvMsg.SipVersion);
                Assert.AreEqual(sentMsg[SipHeader.Via].FullText, recvMsg[SipHeader.Via].FullText);
                Assert.AreEqual(transport1.LocalEndpoint.Address, recvMsg.RemoteEndpoint.Address);
                Assert.AreEqual(transport1.LocalEndpoint.Port, recvMsg.RemoteEndpoint.Port);
            }
            finally
            {
                transport1.Stop();
                transport2.Stop();
            }
        }
Esempio n. 13
0
        private void Blast(SipTransportType transportType)
        {
            TestCore        serverCore = null;
            TestCore        clientCore = null;
            SipServerAgent  serverAgent;
            SipClientAgent  clientAgent;
            SipCoreSettings settings;
            SipRequest      request;
            SipResponse     response;
            SipResult       result;

            try
            {
                // Initialize the test cores

                settings = new SipCoreSettings();
                settings.TransportSettings = new SipTransportSettings[] {
                    new SipTransportSettings(SipTransportType.UDP, NetworkBinding.Parse("ANY:5060"), 0),
                    new SipTransportSettings(SipTransportType.TCP, NetworkBinding.Parse("ANY:5060"), 0)
                };

                serverCore  = new TestCore(settings);
                serverAgent = new SipServerAgent(serverCore, serverCore);
                serverCore.Start(serverAgent);
                serverCore.SetHandler(new SipRequestDelegate(OnRequest));

                settings = new SipCoreSettings();
                settings.TransportSettings = new SipTransportSettings[] {
                    new SipTransportSettings(SipTransportType.UDP, NetworkBinding.Parse("ANY:0"), 0),
                    new SipTransportSettings(SipTransportType.TCP, NetworkBinding.Parse("ANY:0"), 0)
                };

                clientCore  = new TestCore(settings);
                clientAgent = new SipClientAgent(clientCore, clientCore);
                clientCore.Start(clientAgent);
                clientCore.SetHandler(new SipResponseDelegate(OnResponse));

                // Do a bunch of requests

                for (int i = 0; i < 1000; i++)
                {
                    Clear();

                    request = new SipRequest(SipMethod.Register, string.Format("sip:127.0.0.1:5060;transport={0}", transportType.ToString().ToLowerInvariant()), null);
                    request.AddHeader(SipHeader.To, "sip:[email protected]");
                    request.AddHeader(SipHeader.From, "sip:[email protected]");
                    request.Contents = new byte[] { (byte)i };

                    serverOp = ServerOp.OK;
                    result   = clientAgent.Request(request, null);
                    response = result.Response;
                    Thread.Sleep(100);

                    Assert.AreEqual(SipStatus.OK, result.Status);
                    CollectionAssert.AreEqual(request.Contents, response.Contents);
                }
            }
            finally
            {
                if (clientCore != null)
                {
                    clientCore.Stop();
                }

                if (serverCore != null)
                {
                    serverCore.Stop();
                }
            }
        }
Esempio n. 14
0
        private void Provisional(SipTransportType transportType)
        {
            TestCore        serverCore = null;
            TestCore        clientCore = null;
            SipServerAgent  serverAgent;
            SipClientAgent  clientAgent;
            SipCoreSettings settings;
            SipRequest      request;
            SipResponse     response;
            SipResult       result;

            try
            {
                // Initialize the test cores

                settings = new SipCoreSettings();
                settings.TransportSettings = new SipTransportSettings[] {
                    new SipTransportSettings(SipTransportType.UDP, NetworkBinding.Parse("ANY:5060"), 0),
                    new SipTransportSettings(SipTransportType.TCP, NetworkBinding.Parse("ANY:5060"), 0)
                };

                serverCore  = new TestCore(settings);
                serverAgent = new SipServerAgent(serverCore, serverCore);
                serverCore.Start(serverAgent);
                serverCore.SetHandler(new SipRequestDelegate(OnRequest));

                settings = new SipCoreSettings();
                settings.TransportSettings = new SipTransportSettings[] {
                    new SipTransportSettings(SipTransportType.UDP, NetworkBinding.Parse("ANY:0"), 0),
                    new SipTransportSettings(SipTransportType.TCP, NetworkBinding.Parse("ANY:0"), 0)
                };

                clientCore  = new TestCore(settings);
                clientAgent = new SipClientAgent(clientCore, clientCore);
                clientCore.Start(clientAgent);
                clientCore.SetHandler(new SipResponseDelegate(OnResponse));

                // Verify a transaction with a single provisional response.
                //
                // I'm also going to verify that setting SipRequest.ViaInstanceParam
                // resulted in the "instance" parameter being added to the requests
                // Via header.

                Clear();

                request = new SipRequest(SipMethod.Register, string.Format("sip:127.0.0.1:5060;transport={0}", transportType.ToString().ToLowerInvariant()), null);
                request.AddHeader(SipHeader.To, "sip:[email protected]");
                request.AddHeader(SipHeader.From, "sip:[email protected]");

                serverOp = ServerOp.ProvisionalOK;
                result   = clientAgent.Request(request, null);
                Thread.Sleep(100);

                Assert.AreEqual(SipStatus.OK, result.Status);

                // Verify the response headers

                request  = result.Request;
                response = result.Response;

                Assert.AreEqual(1, requestArgs.Count);
                Assert.AreEqual(2, responseArgs.Count);
                Assert.AreEqual(SipStatus.Trying, responseArgs[0].Response.Status);
                Assert.AreEqual(SipStatus.OK, responseArgs[1].Response.Status);

                Assert.AreEqual(request.Headers[SipHeader.To].Text, new SipValue(request.Headers[SipHeader.To].Text).Text);
                Assert.IsTrue(string.IsNullOrWhiteSpace(new SipValue(response.Headers[SipHeader.To].Text)["tag"]));

                Assert.AreEqual(request.Headers[SipHeader.From].Text, response.Headers[SipHeader.From].Text);
                Assert.AreEqual(request.Headers[SipHeader.CallID].Text, response.Headers[SipHeader.CallID].Text);
                Assert.AreEqual(request.Headers[SipHeader.CSeq].Text, response.Headers[SipHeader.CSeq].Text);
                Assert.AreEqual(request.Headers[SipHeader.Via].Text, response.Headers[SipHeader.Via].Text);

                // Verify a transaction with two provisional responses

                Clear();

                request = new SipRequest(SipMethod.Register, string.Format("sip:127.0.0.1:5060;transport={0}", transportType.ToString().ToLowerInvariant()), null);
                request.AddHeader(SipHeader.To, "sip:[email protected]");
                request.AddHeader(SipHeader.From, "sip:[email protected]");

                serverOp = ServerOp.ProvisionalProvisionalOK;
                result   = clientAgent.Request(request, null);
                Thread.Sleep(100);

                Assert.AreEqual(SipStatus.OK, result.Status);

                // Verify the response headers

                request  = result.Request;
                response = result.Response;

                Assert.AreEqual(1, requestArgs.Count);
                Assert.AreEqual(3, responseArgs.Count);
                Assert.AreEqual(SipStatus.Trying, responseArgs[0].Response.Status);
                Assert.AreEqual("0", responseArgs[0].Response["Test"].Text);
                Assert.AreEqual(SipStatus.Trying, responseArgs[1].Response.Status);
                Assert.AreEqual("1", responseArgs[1].Response["Test"].Text);
                Assert.AreEqual(SipStatus.OK, responseArgs[2].Response.Status);
                Assert.AreEqual("2", responseArgs[2].Response["Test"].Text);

                Assert.AreEqual(request.Headers[SipHeader.To].Text, new SipValue(request.Headers[SipHeader.To].Text).Text);
                Assert.IsTrue(string.IsNullOrWhiteSpace(new SipValue(response.Headers[SipHeader.To].Text)["tag"]));

                Assert.AreEqual(request.Headers[SipHeader.From].Text, response.Headers[SipHeader.From].Text);
                Assert.AreEqual(request.Headers[SipHeader.CallID].Text, response.Headers[SipHeader.CallID].Text);
                Assert.AreEqual(request.Headers[SipHeader.CSeq].Text, response.Headers[SipHeader.CSeq].Text);
                Assert.AreEqual(request.Headers[SipHeader.Via].Text, response.Headers[SipHeader.Via].Text);
            }
            finally
            {
                if (clientCore != null)
                {
                    clientCore.Stop();
                }

                if (serverCore != null)
                {
                    serverCore.Stop();
                }
            }
        }
Esempio n. 15
0
        //---------------------------------------------------------------------
        // Tests

        private void Basic(SipTransportType transportType)
        {
            TestCore        serverCore = null;
            TestCore        clientCore = null;
            SipServerAgent  serverAgent;
            SipClientAgent  clientAgent;
            SipCoreSettings settings;
            SipRequest      request;
            SipResponse     response;
            SipResult       result;

            try
            {
                // Initialize the test cores

                settings = new SipCoreSettings();
                settings.TransportSettings = new SipTransportSettings[] {
                    new SipTransportSettings(SipTransportType.UDP, NetworkBinding.Parse("ANY:5060"), 0),
                    new SipTransportSettings(SipTransportType.TCP, NetworkBinding.Parse("ANY:5060"), 0)
                };

                serverCore  = new TestCore(settings);
                serverAgent = new SipServerAgent(serverCore, serverCore);
                serverCore.Start(serverAgent);
                serverCore.SetHandler(new SipRequestDelegate(OnRequest));

                settings = new SipCoreSettings();
                settings.TransportSettings = new SipTransportSettings[] {
                    new SipTransportSettings(SipTransportType.UDP, NetworkBinding.Parse("ANY:0"), 0),
                    new SipTransportSettings(SipTransportType.TCP, NetworkBinding.Parse("ANY:0"), 0)
                };

                clientCore  = new TestCore(settings);
                clientAgent = new SipClientAgent(clientCore, clientCore);
                clientCore.Start(clientAgent);
                clientCore.SetHandler(new SipResponseDelegate(OnResponse));

                // Verify a basic Request/OK transaction

                Clear();

                request = new SipRequest(SipMethod.Register, string.Format("sip:127.0.0.1:5060;transport={0}", transportType.ToString().ToLowerInvariant()), null);
                request.AddHeader(SipHeader.To, "sip:[email protected]");
                request.AddHeader(SipHeader.From, "sip:[email protected]");

                serverOp = ServerOp.OK;
                result   = clientAgent.Request(request, null);
                Thread.Sleep(100);

                Assert.AreEqual(SipStatus.OK, result.Status);

                // Verify the response headers

                request  = result.Request;
                response = result.Response;

                Assert.AreEqual(1, requestArgs.Count);
                Assert.AreEqual(1, responseArgs.Count);

                Assert.AreEqual(request.Headers[SipHeader.To].Text, new SipValue(request.Headers[SipHeader.To].Text).Text);
                Assert.IsTrue(string.IsNullOrWhiteSpace(new SipValue(response.Headers[SipHeader.To].Text)["tag"]));

                Assert.AreEqual(request.Headers[SipHeader.From].Text, response.Headers[SipHeader.From].Text);
                Assert.AreEqual(request.Headers[SipHeader.CallID].Text, response.Headers[SipHeader.CallID].Text);
                Assert.AreEqual(request.Headers[SipHeader.CSeq].Text, response.Headers[SipHeader.CSeq].Text);
                Assert.AreEqual(request.Headers[SipHeader.Via].Text, response.Headers[SipHeader.Via].Text);

                // Verify that "Max-Forwards: 70" headers were added to the request message.

                Assert.AreEqual(SipHelper.MaxForwards, requestArgs[0].Request.GetHeaderText(SipHeader.MaxForwards));

                // Verify requests that result in errors.

                Clear();

                request = new SipRequest(SipMethod.Register, string.Format("sip:127.0.0.1:5060;transport={0}", transportType.ToString().ToLowerInvariant()), null);
                request.AddHeader(SipHeader.To, "sip:[email protected]");
                request.AddHeader(SipHeader.From, "sip:[email protected]");

                serverOp = ServerOp.Error;
                result   = clientAgent.Request(request, null);
                Thread.Sleep(100);

                Assert.AreEqual(SipStatus.NotImplemented, result.Status);

                // Verify the response headers

                request  = result.Request;
                response = result.Response;

                Assert.AreEqual(1, requestArgs.Count);
                Assert.AreEqual(1, responseArgs.Count);

                Assert.AreEqual(request.Headers[SipHeader.To].Text, new SipValue(request.Headers[SipHeader.To].Text).Text);
                Assert.IsTrue(string.IsNullOrWhiteSpace(new SipValue(response.Headers[SipHeader.To].Text)["tag"]));

                Assert.AreEqual(request.Headers[SipHeader.From].Text, response.Headers[SipHeader.From].Text);
                Assert.AreEqual(request.Headers[SipHeader.CallID].Text, response.Headers[SipHeader.CallID].Text);
                Assert.AreEqual(request.Headers[SipHeader.CSeq].Text, response.Headers[SipHeader.CSeq].Text);
                Assert.AreEqual(request.Headers[SipHeader.Via].Text, response.Headers[SipHeader.Via].Text);
            }
            finally
            {
                if (clientCore != null)
                {
                    clientCore.Stop();
                }

                if (serverCore != null)
                {
                    serverCore.Stop();
                }
            }
        }
Esempio n. 16
0
        public void SipTcpTransport_MultipleBuffered()
        {
            // Render two messages into a single buffer and transmit them
            // to a TCP transport in a single send.  This will result in
            // the two messages being processed out of the headerBuf which
            // is what we want to test here.

            TestTransport  transport = new TestTransport();
            EnhancedSocket sock = null;
            SipRequest     msg1, msg2;
            SipRequest     recvMsg;

            byte[] buf;
            int    cb;

            try
            {
                transport.Start(new NetworkBinding("127.0.0.1:5311"));

                sock = new EnhancedSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                sock.Connect("127.0.0.1", 5311);

                msg1 = new SipRequest(SipMethod.Register, "sip:[email protected]", SipHelper.SIP20);
                msg1.AddHeader(SipHeader.Via, string.Format("SIP/2.0/TCP {0}", transport.LocalEndpoint));
                msg1.AddHeader("Count", "0");
                msg1.Contents = GetContents(0);

                msg2 = new SipRequest(SipMethod.Register, "sip:[email protected]", SipHelper.SIP20);
                msg2.AddHeader(SipHeader.Via, string.Format("SIP/2.0/TCP {0}", transport.LocalEndpoint));
                msg2.AddHeader("Count", "1");
                msg2.Contents = GetContents(0);

                buf = Helper.Concat(msg1.ToArray(), msg2.ToArray());
                cb  = sock.Send(buf);
                Assert.AreEqual(buf.Length, cb);

                recvMsg = (SipRequest)transport.Receive();
                Assert.AreEqual(SipMethod.Register, recvMsg.Method);
                Assert.AreEqual("sip:[email protected]", recvMsg.Uri);
                Assert.AreEqual(SipHelper.SIP20, recvMsg.SipVersion);
                Assert.AreEqual(msg1[SipHeader.Via].FullText, recvMsg[SipHeader.Via].FullText);
                Assert.AreEqual("0", recvMsg["Count"].FullText);
                CollectionAssert.AreEqual(msg1.Contents, recvMsg.Contents);

                recvMsg = (SipRequest)transport.Receive();
                Assert.AreEqual(SipMethod.Register, recvMsg.Method);
                Assert.AreEqual("sip:[email protected]", recvMsg.Uri);
                Assert.AreEqual(SipHelper.SIP20, recvMsg.SipVersion);
                Assert.AreEqual(msg2[SipHeader.Via].FullText, recvMsg[SipHeader.Via].FullText);
                Assert.AreEqual("1", recvMsg["Count"].FullText);
                CollectionAssert.AreEqual(msg2.Contents, recvMsg.Contents);

                // Try it again, this time with some data.

                msg1 = new SipRequest(SipMethod.Register, "sip:[email protected]", SipHelper.SIP20);
                msg1.AddHeader(SipHeader.Via, string.Format("SIP/2.0/TCP {0}", transport.LocalEndpoint));
                msg1.AddHeader("Count", "0");
                msg1.Contents = GetContents(10);

                msg2 = new SipRequest(SipMethod.Register, "sip:[email protected]", SipHelper.SIP20);
                msg2.AddHeader(SipHeader.Via, string.Format("SIP/2.0/TCP {0}", transport.LocalEndpoint));
                msg2.AddHeader("Count", "1");
                msg2.Contents = GetContents(20);

                buf = Helper.Concat(msg1.ToArray(), msg2.ToArray());
                cb  = sock.Send(buf);
                Assert.AreEqual(buf.Length, cb);

                recvMsg = (SipRequest)transport.Receive();
                Assert.AreEqual(SipMethod.Register, recvMsg.Method);
                Assert.AreEqual("sip:[email protected]", recvMsg.Uri);
                Assert.AreEqual(SipHelper.SIP20, recvMsg.SipVersion);
                Assert.AreEqual(msg1[SipHeader.Via].FullText, recvMsg[SipHeader.Via].FullText);
                Assert.AreEqual("0", recvMsg["Count"].FullText);
                CollectionAssert.AreEqual(msg1.Contents, recvMsg.Contents);

                recvMsg = (SipRequest)transport.Receive();
                Assert.AreEqual(SipMethod.Register, recvMsg.Method);
                Assert.AreEqual("sip:[email protected]", recvMsg.Uri);
                Assert.AreEqual(SipHelper.SIP20, recvMsg.SipVersion);
                Assert.AreEqual(msg2[SipHeader.Via].FullText, recvMsg[SipHeader.Via].FullText);
                Assert.AreEqual("1", recvMsg["Count"].FullText);
                CollectionAssert.AreEqual(msg2.Contents, recvMsg.Contents);

                // Try it one more time, this time adding a leading CRLF

                msg1 = new SipRequest(SipMethod.Register, "sip:[email protected]", SipHelper.SIP20);
                msg1.AddHeader(SipHeader.Via, string.Format("SIP/2.0/TCP {0}", transport.LocalEndpoint));
                msg1.AddHeader("Count", "0");
                msg1.Contents = GetContents(10);

                msg2 = new SipRequest(SipMethod.Register, "sip:[email protected]", SipHelper.SIP20);
                msg2.AddHeader(SipHeader.Via, string.Format("SIP/2.0/TCP {0}", transport.LocalEndpoint));
                msg2.AddHeader("Count", "1");
                msg2.Contents = GetContents(20);

                buf = Helper.Concat(new byte[] { 0x0D, 0x0A }, msg1.ToArray(), new byte[] { 0x0D, 0x0A }, msg2.ToArray());
                cb  = sock.Send(buf);
                Assert.AreEqual(buf.Length, cb);

                recvMsg = (SipRequest)transport.Receive();
                Assert.AreEqual(SipMethod.Register, recvMsg.Method);
                Assert.AreEqual("sip:[email protected]", recvMsg.Uri);
                Assert.AreEqual(SipHelper.SIP20, recvMsg.SipVersion);
                Assert.AreEqual(msg1[SipHeader.Via].FullText, recvMsg[SipHeader.Via].FullText);
                Assert.AreEqual("0", recvMsg["Count"].FullText);
                CollectionAssert.AreEqual(msg1.Contents, recvMsg.Contents);

                recvMsg = (SipRequest)transport.Receive();
                Assert.AreEqual(SipMethod.Register, recvMsg.Method);
                Assert.AreEqual("sip:[email protected]", recvMsg.Uri);
                Assert.AreEqual(SipHelper.SIP20, recvMsg.SipVersion);
                Assert.AreEqual(msg2[SipHeader.Via].FullText, recvMsg[SipHeader.Via].FullText);
                Assert.AreEqual("1", recvMsg["Count"].FullText);
                CollectionAssert.AreEqual(msg2.Contents, recvMsg.Contents);
            }
            finally
            {
                if (sock != null)
                {
                    sock.Close();
                }

                transport.Stop();
            }
        }