Exemplo n.º 1
0
        public static SIPResponse ParseSIPResponse(SIPMessage sipMessage)
        {
            try
            {
                SIPResponse sipResponse = new SIPResponse();
                sipResponse.LocalSIPEndPoint  = sipMessage.LocalSIPEndPoint;
                sipResponse.RemoteSIPEndPoint = sipMessage.RemoteSIPEndPoint;
                string statusLine = sipMessage.FirstLine;

                int firstSpacePosn = statusLine.IndexOf(" ");

                sipResponse.SIPVersion   = statusLine.Substring(0, firstSpacePosn).Trim();
                statusLine               = statusLine.Substring(firstSpacePosn).Trim();
                sipResponse.StatusCode   = Convert.ToInt32(statusLine.Substring(0, 3));
                sipResponse.Status       = SIPResponseStatusCodes.GetStatusTypeForCode(sipResponse.StatusCode);
                sipResponse.ReasonPhrase = statusLine.Substring(3).Trim();

                sipResponse.Header = SIPHeader.ParseSIPHeaders(sipMessage.SIPHeaders);
                sipResponse.Body   = sipMessage.Body;

                return(sipResponse);
            }
            catch (SIPValidationException)
            {
                throw;
            }
            catch (Exception excp)
            {
                logger.LogError("Exception ParseSIPResponse. " + excp.Message);
                logger.LogError(sipMessage.RawMessage);
                throw new SIPValidationException(SIPValidationFieldsEnum.Response, "Error parsing SIP Response");
            }
        }
Exemplo n.º 2
0
        public void ParseAsteriskRecordRouteHeadersTest()
        {
            logger.LogDebug("--> " + System.Reflection.MethodBase.GetCurrentMethod().Name);
            logger.BeginScope(System.Reflection.MethodBase.GetCurrentMethod().Name);

            string xtenInviteHeaders =
                "Via: SIP/2.0/UDP 213.168.225.135:5060;branch=z9hG4bK8Z4EIWBeY45fRGwC0qIeu/xpw3A=" + m_CRLF +
                "Via: SIP/2.0/UDP 192.168.1.2:5065;received=220.240.255.198:64091;branch=z9hG4bK4E0728C26A0640E7830D7C9179D08D67" + m_CRLF +
                "Record-Route: <sip:213.168.225.133:5060;lr>,<sip:220.240.255.198:64091;lr>" + m_CRLF +
                "From: bluesipd <sip:bluesipd@bluesipd:5065>;tag=457825353" + m_CRLF +
                "To: <sip:303@bluesipd>;tag=as02a64a42" + m_CRLF +
                "Call-ID: [email protected]" + m_CRLF +
                "CSeq: 38002 INVITE" + m_CRLF +
                "User-Agent: asterisk" + m_CRLF +
                "Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY" + m_CRLF +
                "Contact: <sip:[email protected]>" + m_CRLF +
                "Content-Type: application/sdp" + m_CRLF +
                "Content-Length: 350" + m_CRLF;

            logger.LogDebug("Original SIP Headers:\n" + xtenInviteHeaders);

            string[] headersCollection = Regex.Split(xtenInviteHeaders, "\r\n");

            SIPHeader sipHeader = SIPHeader.ParseSIPHeaders(headersCollection);

            logger.LogDebug("Parsed SIP Headers:\n" + sipHeader.ToString());

            SIPRoute topRoute = sipHeader.RecordRoutes.PopRoute();

            Assert.True(topRoute.Host == "213.168.225.133:5060", "The top record route was not parsed correctly.");

            logger.LogDebug("---------------------------------------------------");
        }
Exemplo n.º 3
0
        public void ParseRequireAndSupportedExtensionsTest()
        {
            logger.LogDebug("--> " + System.Reflection.MethodBase.GetCurrentMethod().Name);
            logger.BeginScope(System.Reflection.MethodBase.GetCurrentMethod().Name);

            string inviteHeaders =
                "Via: SIP/2.0/UDP 192.168.1.2:5065;rport;branch=z9hG4bKFBB7EAC06934405182D13950BD51F001" + m_CRLF +
                "From: SER Test X <sip:[email protected]:5065>;tag=196468136" + m_CRLF +
                "To: <sip:[email protected]>" + m_CRLF +
                "Contact: <sip:[email protected]:5065>" + m_CRLF +
                "Call-ID: [email protected]" + m_CRLF +
                "CSeq: 49429 INVITE" + m_CRLF +
                "Max-Forwards: 70" + m_CRLF +
                "Content-Type: application/sdp" + m_CRLF +
                "User-Agent: X-PRO release 1103v" + m_CRLF +
                "Content-Length: 271" + m_CRLF +
                "Require: abcd, 100rel, xyz" + m_CRLF +
                "Supported: 100rel, other" + m_CRLF;

            string[]  headersCollection = Regex.Split(inviteHeaders, "\r\n");
            SIPHeader sipHeader         = SIPHeader.ParseSIPHeaders(headersCollection);

            Assert.True(sipHeader.RequiredExtensions.Contains(SIPExtensions.Prack), "The required header extensions was missing Prack.");
            Assert.True(sipHeader.SupportedExtensions.Contains(SIPExtensions.Prack), "The supported header extensions was missing Prack.");
            Assert.True(sipHeader.UnknownRequireExtension != null, "The had unknown required header extension was not correctly set.");

            logger.LogDebug("---------------------------------------------------");
        }
Exemplo n.º 4
0
        public void ExtractHeadersUnitTest()
        {
            logger.LogDebug("--> " + System.Reflection.MethodBase.GetCurrentMethod().Name);
            logger.BeginScope(System.Reflection.MethodBase.GetCurrentMethod().Name);

            string sipMsg =
                "From: <sip:[email protected]>;tag=0477183750" + m_CRLF +
                "To: <sip:[email protected]>;tag=414dedfe" + m_CRLF +
                "CSeq: 1 REGISTER" + m_CRLF +
                "Call-ID: 438676792abe47328fc557da2d84d0ee" + m_CRLF +
                "Via: SIP/2.0/UDP 192.168.1.102:7246;branch=z9hG4bK92460620adf84edab2341899a3453f79;received=124.168.235.200;rport=10552" + m_CRLF +
                "Server: Huawei SoftX3000 R006B03D" + m_CRLF +
                "Refer-To: Test Refer-To" + m_CRLF +
                "Authentication-Info: Test Authentication-Info" + m_CRLF +
                "WWW-Authenticate: Digest realm=\"huawei\"," + m_CRLF +
                " nonce=\"248e4b4457f252ae53c859bfe03c4f93\",domain=\"sip:huawei.com\"," + m_CRLF +
                " stale=false,algorithm=MD5" + m_CRLF +
                "Content-Length: 0" + m_CRLF + m_CRLF;

            logger.LogDebug("Original SIP Headers:\n" + sipMsg);

            string[] headersCollection = SIPHeader.SplitHeaders(sipMsg);

            SIPHeader sipHeader = SIPHeader.ParseSIPHeaders(headersCollection);

            Assert.Equal("Test Refer-To", sipHeader.ReferTo);
            Assert.Equal("Test Authentication-Info", sipHeader.AuthenticationInfo);

            logger.LogDebug("-----------------------------------------");
        }
Exemplo n.º 5
0
        public void LowerCaseExpiresUnitTest()
        {
            logger.LogDebug("--> " + System.Reflection.MethodBase.GetCurrentMethod().Name);
            logger.BeginScope(System.Reflection.MethodBase.GetCurrentMethod().Name);

            string sipMsg =
                "Via: SIP/2.0/UDP 192.168.1.32:10254;branch=z9hG4bK-d87543-eb7c9f44883c5955-1--d87543-;rport;received=89.100.104.191" + m_CRLF +
                "To: aaronxten <sip:[email protected]>" + m_CRLF +
                "From: aaronxten <sip:[email protected]>;tag=774d2561" + m_CRLF +
                "Call-ID: MTBhNGZjZmQ2OTc3MWU5MTZjNWUxMDYxOTk1MjdmYzk." + m_CRLF +
                "CSeq: 2 REGISTER" + m_CRLF +
                "Contact: <sip:[email protected]:10254;rinstance=6d2bbd8014ca7a76>;expires=0" + m_CRLF +
                "Max-Forwards: 69" + m_CRLF +
                "expires: 60" + m_CRLF +
                "User-Agent: X-Lite release 1006e stamp 34025" + m_CRLF +
                "Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY, MESSAGE, SUBSCRIBE, INFO" + m_CRLF + m_CRLF;

            logger.LogDebug("Original SIP Headers:\n" + sipMsg);

            string[] headersCollection = Regex.Split(sipMsg, "\r\n");

            SIPHeader sipHeader = SIPHeader.ParseSIPHeaders(headersCollection);

            Assert.True(sipHeader.Expires == 60, "The expires values was parsed incorrectly.");

            logger.LogDebug("-----------------------------------------");
        }
Exemplo n.º 6
0
        public void MultipleContactHeadersUnitTest()
        {
            logger.LogDebug("--> " + System.Reflection.MethodBase.GetCurrentMethod().Name);
            logger.BeginScope(System.Reflection.MethodBase.GetCurrentMethod().Name);

            string sipMsg =
                "From: <sip:[email protected]>;tag=0477183750" + m_CRLF +
                "To: <sip:[email protected]>;tag=414dedfe" + m_CRLF +
                "CSeq: 1 REGISTER" + m_CRLF +
                "Contact: \"Joe Bloggs\" <sip:[email protected]>;expires=0" + m_CRLF +
                "Call-ID: 438676792abe47328fc557da2d84d0ee" + m_CRLF +
                "Via: SIP/2.0/UDP 192.168.1.102:7246;branch=z9hG4bK92460620adf84edab2341899a3453f79;received=124.168.235.200;rport=10552" + m_CRLF +
                "Server: Huawei SoftX3000 R006B03D" + m_CRLF +
                "WWW-Authenticate: Digest realm=\"huawei\"," + m_CRLF +
                " nonce=\"248e4b4457f252ae53c859bfe03c4f93\",domain=\"sip:huawei.com\"," + m_CRLF +
                " stale=false,algorithm=MD5" + m_CRLF +
                "Contact: \"Jane Doe\" <sip:[email protected]>" + m_CRLF +
                "Content-Length: 0" + m_CRLF + m_CRLF;

            logger.LogDebug("Original SIP Headers:\n" + sipMsg);

            string[] headersCollection = SIPHeader.SplitHeaders(sipMsg);

            SIPHeader sipHeader = SIPHeader.ParseSIPHeaders(headersCollection);

            Assert.True(sipHeader.Contact.Count == 2, "The SIP header had the wrong number of Contacts.");
            Assert.True(sipHeader.Contact[0].ToString() == "\"Joe Bloggs\" <sip:[email protected]>;expires=0", "The first Contact header was not parsed correctly.");
            Assert.True(sipHeader.Contact[1].ToString() == "\"Jane Doe\" <sip:[email protected]>", "The second Contact header was not parsed correctly.");

            logger.LogDebug("-----------------------------------------");
        }
Exemplo n.º 7
0
        public void ParseNoViaHeadersUnitTest()
        {
            logger.LogDebug("--> " + System.Reflection.MethodBase.GetCurrentMethod().Name);
            logger.BeginScope(System.Reflection.MethodBase.GetCurrentMethod().Name);

            string noViaHeaders =
                "SIP/2.0 407 Proxy Authentication Required" + m_CRLF +
                "From: dev <sip:[email protected]>;tag=0013c339acec050c0635cf7b-48c41caf" + m_CRLF +
                "To: <sip:[email protected]>;tag=as019f14fe" + m_CRLF +
                "Call-ID: [email protected]" + m_CRLF +
                "CSeq: 101 INVITE" + m_CRLF +
                "User-Agent: asterisk" + m_CRLF +
                "Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY" + m_CRLF +
                "Contact: <sip:[email protected]:5061>" + m_CRLF +
                "Proxy-Authenticate: Digest algorithm=MD5, realm=\"sip.blueface.ie\", nonce=\"789f00ab\"" + m_CRLF +
                "Content-Length: 0" + m_CRLF + m_CRLF;

            logger.LogDebug("Original SIP Headers:\n" + noViaHeaders);

            string[] headersCollection = Regex.Split(noViaHeaders, "\r\n");

            Assert.Throws <SIPValidationException>(() => SIPHeader.ParseSIPHeaders(headersCollection));

            logger.LogDebug("---------------------------------------------------");
        }
Exemplo n.º 8
0
        public void ParseAuthenticationRequiredHeadersTest()
        {
            logger.LogDebug("--> " + System.Reflection.MethodBase.GetCurrentMethod().Name);
            logger.BeginScope(System.Reflection.MethodBase.GetCurrentMethod().Name);

            string authReqdHeaders =
                "SIP/2.0 407 Proxy Authentication Required" + m_CRLF +
                "Via: SIP/2.0/UDP 192.168.1.2:5066;received=220.240.255.198:64066;branch=65cacee9-25b6-405c-8f82-e40427438af7" + m_CRLF +
                "From: SER Test X <sip:[email protected]:5065>;tag=196468136" + m_CRLF +
                "To: <sip:[email protected]>;tag=as67b6416e" + m_CRLF +
                "Contact: <sip:[email protected]>" + m_CRLF +
                "Call-ID: [email protected]" + m_CRLF +
                "CSeq: 908 INVITE" + m_CRLF +
                "Max-Forwards: 70" + m_CRLF +
                "User-Agent: asterisk" + m_CRLF +
                "Proxy-Authenticate: Digest realm=\"asterisk\", nonce=\"15aeff81\"" + m_CRLF +
                "Record-Route: <sip:213.168.225.135:5060;lr>" + m_CRLF +
                "Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY" + m_CRLF + m_CRLF;

            logger.LogDebug("Original SIP Headers:\n" + authReqdHeaders);

            string[] headersCollection = Regex.Split(authReqdHeaders, "\r\n");

            SIPHeader sipHeader = SIPHeader.ParseSIPHeaders(headersCollection);

            logger.LogDebug("Parsed SIP Headers:\n" + sipHeader.ToString());

            logger.LogDebug("---------------------------------------------------");
        }
Exemplo n.º 9
0
        public void HuaweiRegisterUnitTest()
        {
            Console.WriteLine("--> " + System.Reflection.MethodBase.GetCurrentMethod().Name);

            string sipMsg =
                "From: <sip:[email protected]>;tag=0477183750" + m_CRLF +
                "To: <sip:[email protected]>;tag=414dedfe" + m_CRLF +
                "CSeq: 1 REGISTER" + m_CRLF +
                "Call-ID: 438676792abe47328fc557da2d84d0ee" + m_CRLF +
                "Via: SIP/2.0/UDP 192.168.1.102:7246;branch=z9hG4bK92460620adf84edab2341899a3453f79;received=124.168.235.200;rport=10552" + m_CRLF +
                "Server: Huawei SoftX3000 R006B03D" + m_CRLF +
                "WWW-Authenticate: Digest realm=\"huawei\"," + m_CRLF +
                " nonce=\"248e4b4457f252ae53c859bfe03c4f93\",domain=\"sip:huawei.com\"," + m_CRLF +
                " stale=false,algorithm=MD5" + m_CRLF +
                "Content-Length: 0" + m_CRLF + m_CRLF;

            Console.WriteLine("Original SIP Headers:\n" + sipMsg);

            string[] headersCollection = SIPHeader.SplitHeaders(sipMsg);

            SIPHeader sipHeader = SIPHeader.ParseSIPHeaders(headersCollection);

            Console.WriteLine(sipHeader.ToString());
            Console.WriteLine(sipHeader.AuthenticationHeader.ToString());

            Assert.IsTrue(Regex.Match(sipHeader.AuthenticationHeader.ToString(), "nonce").Success, "The WWW-Authenticate header was not correctly parsed across multpiple lines.");

            Console.WriteLine("-----------------------------------------");
        }
Exemplo n.º 10
0
        public static SIPRequest ParseSIPRequest(SIPMessage sipMessage)
        {
            string uriStr = null;

            try
            {
                SIPRequest sipRequest = new SIPRequest();
                sipRequest.LocalSIPEndPoint  = sipMessage.LocalSIPEndPoint;
                sipRequest.RemoteSIPEndPoint = sipMessage.RemoteSIPEndPoint;

                string statusLine = sipMessage.FirstLine;

                int firstSpacePosn = statusLine.IndexOf(" ");

                string method = statusLine.Substring(0, firstSpacePosn).Trim();
                sipRequest.Method = SIPMethods.GetMethod(method);
                if (sipRequest.Method == SIPMethodsEnum.UNKNOWN)
                {
                    sipRequest.UnknownMethod = method;
                    logger.Warn("Unknown SIP method received " + sipRequest.UnknownMethod + ".");
                }

                statusLine = statusLine.Substring(firstSpacePosn).Trim();
                int secondSpacePosn = statusLine.IndexOf(" ");

                if (secondSpacePosn != -1)
                {
                    uriStr = statusLine.Substring(0, secondSpacePosn);

                    sipRequest.URI        = SIPURI.ParseSIPURI(uriStr);
                    sipRequest.SIPVersion = statusLine.Substring(secondSpacePosn, statusLine.Length - secondSpacePosn)
                                            .Trim();
                    sipRequest.Header = SIPHeader.ParseSIPHeaders(sipMessage.SIPHeaders);
                    sipRequest.Body   = sipMessage.Body;

                    return(sipRequest);
                }
                else
                {
                    throw new SIPValidationException(SIPValidationFieldsEnum.Request, "URI was missing on Request.");
                }
            }
            catch (SIPValidationException)
            {
                throw;
            }
            catch (Exception excp)
            {
                logger.Error("Exception parsing SIP Request. " + excp.Message);
                logger.Error(sipMessage.RawMessage);
                throw new SIPValidationException(SIPValidationFieldsEnum.Request, "Unknown error parsing SIP Request");
            }
        }
Exemplo n.º 11
0
        public void ParseAMulitLineHeaderTest()
        {
            logger.LogDebug("--> " + System.Reflection.MethodBase.GetCurrentMethod().Name);
            logger.BeginScope(System.Reflection.MethodBase.GetCurrentMethod().Name);

            string mulitLineHeader =
                "Via: SIP/2.0/UDP 213.168.225.135:5060;branch=z9hG4bK8Z4EIWBeY45fRGwC0qIeu/xpw3A=" + m_CRLF +
                "Via: SIP/2.0/UDP 192.168.1.2:5065;received=220.240.255.198:64091;branch=z9hG4bK4E0728C26A0640E7830D7C9179D08D67" + m_CRLF +
                "Record-Route: <sip:213.168.225.133:5060;lr>," + m_CRLF +
                " <sip:220.240.255.198:64091;lr>" + m_CRLF +
                "From: bluesipd <sip:bluesipd@bluesipd:5065>;tag=457825353" + m_CRLF +
                "To: <sip:303@bluesipd>;tag=as02a64a42" + m_CRLF +
                "Call-ID: [email protected]" + m_CRLF +
                "CSeq: 38002 INVITE" + m_CRLF +
                "Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, NOTIFY" + m_CRLF +
                "Contact: <sip:[email protected]>" + m_CRLF +
                "Content-Type: application/sdp" + m_CRLF +
                "Content-Length: 350" + m_CRLF;

            logger.LogDebug("Original SIP Headers:\n" + mulitLineHeader);

            string[] headersCollection = SIPHeader.SplitHeaders(mulitLineHeader);
            foreach (string headerStr in headersCollection)
            {
                logger.LogDebug("Header => " + headerStr + ".");
            }

            Assert.True(headersCollection.Length == 12, "The headers were not split properly.");

            logger.LogDebug("");

            SIPHeader sipHeader = SIPHeader.ParseSIPHeaders(headersCollection);

            logger.LogDebug("Parsed SIP Headers:\n" + sipHeader.ToString());

            Assert.True(sipHeader.RecordRoutes.Length == 2, "An incorrect number of record route entries was extracted, number was " + sipHeader.RecordRoutes.Length + ".");

            SIPRoute topRoute = sipHeader.RecordRoutes.PopRoute();

            Assert.True(topRoute.Host == "213.168.225.133:5060", "The top record route was not parsed correctly.");

            logger.LogDebug("---------------------------------------------------");
        }
Exemplo n.º 12
0
        public void ParseXTenHeadersTest()
        {
            logger.LogDebug("--> " + System.Reflection.MethodBase.GetCurrentMethod().Name);
            logger.BeginScope(System.Reflection.MethodBase.GetCurrentMethod().Name);

            string xtenInviteHeaders =
                "Via: SIP/2.0/UDP 192.168.1.2:5065;rport;branch=z9hG4bKFBB7EAC06934405182D13950BD51F001" + m_CRLF +
                "From: SER Test X <sip:[email protected]:5065>;tag=196468136" + m_CRLF +
                "To: <sip:[email protected]>" + m_CRLF +
                "Contact: <sip:[email protected]:5065>" + m_CRLF +
                "Call-ID: [email protected]" + m_CRLF +
                "CSeq: 49429 INVITE" + m_CRLF +
                "Max-Forwards: 70" + m_CRLF +
                "Content-Type: application/sdp" + m_CRLF +
                "User-Agent: X-PRO release 1103v" + m_CRLF +
                "Content-Length: 271" + m_CRLF;

            logger.LogDebug("Original SIP Headers:\n" + xtenInviteHeaders);

            string[] headersCollection = Regex.Split(xtenInviteHeaders, "\r\n");

            SIPHeader sipHeader = SIPHeader.ParseSIPHeaders(headersCollection);

            logger.LogDebug("Parsed SIP Headers:\n" + sipHeader.ToString());

            Assert.True("Via: SIP/2.0/UDP 192.168.1.2:5065;rport;branch=z9hG4bKFBB7EAC06934405182D13950BD51F001" == sipHeader.Vias.TopViaHeader.ToString(), "The Via header was not parsed correctly," + sipHeader.Vias.TopViaHeader.ToString() + ".");
            Assert.True("SER Test X" == sipHeader.From.FromName, "The From Name value was not parsed correctly, " + sipHeader.From.FromName + ".");
            Assert.True("sip:[email protected]:5065" == sipHeader.From.FromURI.ToString(), "The From URI value was not parsed correctly, " + sipHeader.From.FromURI + ".");
            Assert.True("196468136" == sipHeader.From.FromTag, "The From tag value was not parsed correctly, " + sipHeader.From.FromTag + ".");
            Assert.True(null == sipHeader.To.ToName, "The To Name value was not parsed correctly, " + sipHeader.To.ToName + ".");
            Assert.True("sip:[email protected]" == sipHeader.To.ToURI.ToString(), "The To URI value was not parsed correctly, " + sipHeader.To.ToURI + ".");
            Assert.True(null == sipHeader.To.ToTag, "The To tag value was not parsed correctly, " + sipHeader.To.ToTag + ".");
            Assert.True("[email protected]" == sipHeader.CallId, "The Call ID values was not parsed correctly, " + sipHeader.CallId + ".");
            Assert.True(49429 == sipHeader.CSeq, "The CSeq value was not parsed correctly, " + sipHeader.CSeq + ".");
            Assert.True(SIPMethodsEnum.INVITE == sipHeader.CSeqMethod, "The CSeq Method value was not parsed correctly, " + sipHeader.CSeqMethod + ".");
            Assert.True(70 == sipHeader.MaxForwards, "The MaxForwards value was not parsed correctly, " + sipHeader.MaxForwards + ".");
            Assert.True("X-PRO release 1103v" == sipHeader.UserAgent, "The UserAgent value was not parsed correctly, " + sipHeader.UserAgent + ".");
            Assert.True("application/sdp" == sipHeader.ContentType, "The ContentType value was not parsed correctly, " + sipHeader.ContentType + ".");
            Assert.True(271 == sipHeader.ContentLength, "The ContentLength value was not parsed correctly, " + sipHeader.ContentLength + ".");

            logger.LogDebug("---------------------------------------------------");
        }