Пример #1
0
        public async Task <IHttpActionResult> Post(KamailioSipEvent sipEvent)
        {
            if (!_settingsManager.UseSipEvent)
            {
                if (log.IsTraceEnabled)
                {
                    log.Warn("Receiving event but receiver is not ON for 'UseSipEvent'");
                }
                return(Ok());
            }

            if (log.IsTraceEnabled)
            {
                Stream stream = await Request.Content.ReadAsStreamAsync();

                stream.Seek(0, SeekOrigin.Begin);
                var body = await Request.Content.ReadAsStringAsync();

                log.Trace($"Request {Request} Body {body}");
            }

            using (new TimeMeasurer("Incoming SIP event"))
            {
                if (sipEvent == null)
                {
                    log.Warn("SIP event controller received empty data");
                    return(BadRequest());
                }

                var sipMessage = _sipEventParser.Parse(sipEvent);

                if (sipMessage == null)
                {
                    log.Warn("Incorrect SIP message format: ", sipEvent);
                    return(BadRequest());
                }

                SipEventHandlerResult result = _sipMessageManager.HandleSipMessage(sipMessage);

                if (log.IsDebugEnabled)
                {
                    log.Debug("SIP message, Handled: {0}, Parsed: {1}, Result: {2}", sipEvent.ToLogString(), sipMessage.ToDebugString(), result?.ChangeStatus);
                }

                if (result == null)
                {
                    log.Warn("Kamailio message was handled but result was null");
                }
                else if (result.ChangeStatus != SipEventChangeStatus.NothingChanged)
                {
                    _guiHubUpdater.Update(result);    // First web gui
                    _statusHubUpdater.Update(result); // Then codec status to external clients
                }

                return(Ok());
            }
        }
Пример #2
0
        private SipRegistrationExpireMessage ParseRegExpire(KamailioSipEvent kamailioData)
        {
            var expire = new SipRegistrationExpireMessage()
            {
                SipAddress = new SipUri(kamailioData.FromUri),
                ReceivedIp = kamailioData.Ip.SenderIp
            };

            return(expire);
        }
Пример #3
0
        public SipMessageBase Parse(KamailioSipEvent sipEvent)
        {
            switch (sipEvent.Event)
            {
            case SipEventType.Register:
                return(ParseRegistration(sipEvent));

            case SipEventType.Dialog:
                return(ParseDialog(sipEvent));

            case SipEventType.RegExpire:
                return(ParseRegExpire(sipEvent));
            }
            return(null);
        }
Пример #4
0
        private SipRegistrationMessage ParseRegistration(KamailioSipEvent kamailioData)
        {
            var registration = new SipRegistrationMessage()
            {
                Sip             = new SipUri(kamailioData.FromUri),
                Username        = kamailioData.AuthUser, // TODO: Obsolete. To be removed.
                FromDisplayName = ParseDisplayName(kamailioData.FromDisplayName),
                ToDisplayName   = ParseDisplayName(kamailioData.ToDisplayName),
                UserAgent       = kamailioData.UserAgentHeader,
                Registrar       = kamailioData.Registrar,
                RegType         = kamailioData.RegType,
                Ip            = kamailioData.Ip.SenderIp,
                Port          = kamailioData.Ip.SenderPort,
                Expires       = kamailioData.Expires,
                UnixTimeStamp = kamailioData.TimeStamp
            };

            return(registration);
        }
Пример #5
0
        private SipDialogMessage ParseDialog(KamailioSipEvent kamailioData)
        {
            if (!Enum.TryParse(kamailioData.DialogState, true, out DialogStatus dialogStatus))
            {
                log.Warn($"Dialog state field = {kamailioData.DialogState} of Kamailio dialog message");
                return(null);
            }

            var dialog = new SipDialogMessage
            {
                Status          = dialogStatus,
                CallId          = kamailioData.CallId,
                HashId          = kamailioData.DialogHashId,
                HashEntry       = kamailioData.DialogHashEntry,
                FromDisplayName = ParseDisplayName(kamailioData.FromDisplayName),
                ToDisplayName   = ParseDisplayName(kamailioData.ToDisplayName),
                FromSipUri      = new SipUri(kamailioData.FromUri),
                ToSipUri        = new SipUri(kamailioData.RequestUri), //new SipUri(kamailioData.ToUri),
                FromTag         = kamailioData.FromTag,
                ToTag           = kamailioData.ToTag,
            };

            return(dialog);
        }