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()); } }
private SipRegistrationExpireMessage ParseRegExpire(KamailioSipEvent kamailioData) { var expire = new SipRegistrationExpireMessage() { SipAddress = new SipUri(kamailioData.FromUri), ReceivedIp = kamailioData.Ip.SenderIp }; return(expire); }
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); }
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); }
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); }