Пример #1
0
     public void OnRequest(SipRequestLine requestLine)
     {
         if (_logger.IsDebugEnabled)
             _logger.Debug("OnRequest called. Method:'{0}', Uri:'{1}'", requestLine.Method, requestLine.Uri.FormatToString());
 
         _message = _messageFactory.CreateRequest(requestLine);
     }
Пример #2
0
 public SipParser2(SipMessageFactory messageFactory, SipHeaderFactory headerFactory)
 {
     _logger.Trace("Constructor called.");
     _messageFactory = messageFactory;
     _headerFactory = headerFactory;
     _message = null;
 }
Пример #3
0
     public void OnResponse(SipStatusLine statusLine)
     {
         if (_logger.IsDebugEnabled)
             _logger.Debug("OnResponse called.  StatusCode:'{0}', ReasonPhrase:'{1}'", statusLine.StatusCode, statusLine.ReasonPhrase);
 
         _message = _messageFactory.CreateResponse(statusLine);
      }
Пример #4
0
        private void OnFirstLine(string firstLine)
        {
            if (_logger.IsDebugEnabled)
                _logger.Debug("OnFirstLine called. firstLine:'{0}'", firstLine);

            if (firstLine.EndsWith(SipConstants.SipTwoZeroString))
            {
                if (_logger.IsDebugEnabled)
                    _logger.Debug("Firstline is expected to be a SipRequestLine. Try parsing...");

                var requestLine = new SipRequestLineParser().Parse(firstLine);
                _message = _messageFactory.CreateRequest(requestLine);

                if (_logger.IsDebugEnabled)
                    _logger.Debug("RequestLine parsed. Continuing SipRequest parsing...");
            }
            else if (firstLine.StartsWith(SipConstants.SipTwoZeroString))
            {
                if (_logger.IsDebugEnabled)
                    _logger.Debug("Firstline is expected to be a SipStatusLine. Try parsing...");

                var statusLine = new SipStatusLineParser().Parse(firstLine);
                _message = _messageFactory.CreateResponse(statusLine);

                if (_logger.IsDebugEnabled)
                    _logger.Debug("SipStatusLine parsed. Continuing SipResponse parsing..");
            }
            else
            {
                if (_logger.IsDebugEnabled)
                    _logger.Debug("Firstline format could not be recognized.");

                throw new ParseException(ExceptionMessage.InvalidFirstLineFormat);
            }
        }
Пример #5
0
        public void OnRequest(SipRequestLine requestLine)
        {
            if (_logger.IsDebugEnabled)
            {
                _logger.Debug("OnRequest called. Method:'{0}', Uri:'{1}'", requestLine.Method, requestLine.Uri.FormatToString());
            }

            _message = _messageFactory.CreateRequest(requestLine);
        }
Пример #6
0
        public void OnResponse(SipStatusLine statusLine)
        {
            if (_logger.IsDebugEnabled)
            {
                _logger.Debug("OnResponse called.  StatusCode:'{0}', ReasonPhrase:'{1}'", statusLine.StatusCode, statusLine.ReasonPhrase);
            }

            _message = _messageFactory.CreateResponse(statusLine);
        }
Пример #7
0
        internal static string GetDialogId(SipMessage message, bool isServer)
        {
            Check.Require(message, "message");

            string localTag  = isServer ? message.To.Tag : message.From.Tag;
            string remoteTag = isServer ? message.From.Tag : message.To.Tag;

            return(message.CallId.Value + ":" + localTag + ":" + remoteTag);
        }
Пример #8
0
 private string FindFirstMissingRequiredHeader(SipMessage sipMessage)
 {
     if (sipMessage.CallId == null) return SipHeaderNames.CallId;
     if (sipMessage.CSeq == null) return SipHeaderNames.CSeq;
     if (sipMessage.MaxForwards == null) return SipHeaderNames.MaxForwards;
     if (sipMessage.To == null) return SipHeaderNames.To;
     if (sipMessage.From == null) return SipHeaderNames.From;
     if (sipMessage.Vias == null || sipMessage.Vias.Count == 0) return SipHeaderNames.Via;
     return null;
 }
Пример #9
0
        private SipContext CreateSipContext(SipMessage message, Datagram datagram)
        {
            var request = message as SipRequest;
            var response = message as SipResponse;

            var c = new SipContext();

            c.Request = request;
            c.Response = response;
            c.RemoteEndPoint = datagram.RemoteEndPoint;
            c.LocalEndPoint = datagram.LocalEndPoint;

            return c;
        }
Пример #10
0
 private static void FormatHeaders(SipMessage message, StringBuilder b)
 {
     foreach (var header in message.GetHeaders())
     {
         if (header.IsList)
         {
             b.Append(FormatHeader((IEnumerable <SipHeader>)header));
         }
         else
         {
             b.Append(FormatHeader((SipHeader)header));
         }
     }
 }
Пример #11
0
        private void OnFirstLine(string firstLine)
        {
            if (_logger.IsDebugEnabled)
            {
                _logger.Debug("OnFirstLine called. firstLine:'{0}'", firstLine);
            }

            if (firstLine.EndsWith(SipConstants.SipTwoZeroString))
            {
                if (_logger.IsDebugEnabled)
                {
                    _logger.Debug("Firstline is expected to be a SipRequestLine. Try parsing...");
                }

                var requestLine = new SipRequestLineParser().Parse(firstLine);
                _message = _messageFactory.CreateRequest(requestLine);

                if (_logger.IsDebugEnabled)
                {
                    _logger.Debug("RequestLine parsed. Continuing SipRequest parsing...");
                }
            }
            else if (firstLine.StartsWith(SipConstants.SipTwoZeroString))
            {
                if (_logger.IsDebugEnabled)
                {
                    _logger.Debug("Firstline is expected to be a SipStatusLine. Try parsing...");
                }

                var statusLine = new SipStatusLineParser().Parse(firstLine);
                _message = _messageFactory.CreateResponse(statusLine);

                if (_logger.IsDebugEnabled)
                {
                    _logger.Debug("SipStatusLine parsed. Continuing SipResponse parsing..");
                }
            }
            else
            {
                if (_logger.IsDebugEnabled)
                {
                    _logger.Debug("Firstline format could not be recognized.");
                }

                throw new ParseException(ExceptionMessage.InvalidFirstLineFormat);
            }
        }
Пример #12
0
        public static byte[] FormatMessage(SipMessage message)
        {
            var envelope = FormatMessageEnvelope(message, true);

            var msg = SipUtil.ToUtf8Bytes(envelope);

            if (message.Body == null)
            {
                return(msg);
            }

            var bytes = new List <byte>(msg);

            bytes.AddRange(message.Body);

            return(bytes.ToArray());
        }
Пример #13
0
        public static string FormatMessageEnvelope(SipMessage message, bool isNewlineTerminated = false)
        {
            var b = new StringBuilder();

            if (message is SipRequest)
            {
                b.AppendLine(((SipRequest)message).RequestLine.FormatToString());
            }
            else
            {
                b.AppendLine(((SipResponse)message).StatusLine.FormatToString());
            }

            FormatHeaders(message, b);

            if (isNewlineTerminated)
            {
                b.AppendLine(string.Empty);
            }

            return(b.ToString());
        }
Пример #14
0
 public ValidateMessageResult ValidateMessage(SipMessage message)
 {
     //testing commit
     if(message is SipRequest)
     {
         var request = message as SipRequest;
         var result = new ValidateRequestResult();
         result.MissingRequiredHeader = FindFirstMissingRequiredHeader(message);
         result.HasUnSupportedSipVersion = !ValidateSipVersion(request.RequestLine.Version);
         if (result.HasRequiredHeadersMissing) return result;
         result.HasInvalidSCeqMethod = !ValidateCSeqMethod(request);
         result.InviteHasNoContactHeader = !ValidateContactHeader(request);
         return result;
     }
     else
     {
         var response = message as SipResponse;
         var result = new ValidateMessageResult();
         result.MissingRequiredHeader = FindFirstMissingRequiredHeader(message);
         result.HasUnSupportedSipVersion = !ValidateSipVersion(response.StatusLine.Version);
         return result;
     }
 }
Пример #15
0
 internal static string GetClientTransactionId(SipMessage message)
 {
     /*concatenate branch and command. Branch only does not suffice bc CANCEL request have the same branch as the request they need to cancel. To cover id-uniqueness
      * also for CANCEL requests, we add the Cseq Command.*/
     return message.Vias.GetTopMost().Branch + "-" + message.CSeq.Command;
 }
Пример #16
0
 internal static string GetClientTransactionId(SipMessage message)
 {
     /*concatenate branch and command. Branch only does not suffice bc CANCEL request have the same branch as the request they need to cancel. To cover id-uniqueness
      * also for CANCEL requests, we add the Cseq Command.*/
     return(message.Vias.GetTopMost().Branch + "-" + message.CSeq.Command);
 }
Пример #17
0
        internal static string GetDialogId(SipMessage message, bool isServer)
        {
            Check.Require(message, "message");

            string localTag = isServer ? message.To.Tag : message.From.Tag;
            string remoteTag = isServer ? message.From.Tag : message.To.Tag;

            return message.CallId.Value + ":" + localTag + ":" + remoteTag;
        }
Пример #18
0
        private SipContext CreateSipContext(SipMessage message, Datagram datagram)
        {
            var request = message as SipRequest;
            var response = message as SipResponse;
            
            if (request != null)
            {
                _logger.Debug("Request Received '" + request.RequestLine.Method + " " + request.RequestLine.Uri.FormatToString() + "' from " +
                              datagram.RemoteEndPoint);
            }
            else
            {
                _logger.Debug("Response Received '" + response.StatusLine.StatusCode + " " + response.StatusLine.ReasonPhrase + "' from " +
                             datagram.RemoteEndPoint);
            }
               
            var c = new SipContext();

            _logger.Trace("Parse on parser context completed.");

            c.Request = request;
            c.Response = response;
            c.RemoteEndPoint = datagram.RemoteEndPoint;
            c.LocalEndPoint = datagram.LocalEndPoint;

            return c;
        }