private SIPRequest CreateDummyRequest(SIPDialogue dialogueToReplace, string callDestination) { SIPRequest dummyInvite = new SIPRequest(SIPMethodsEnum.INVITE, SIPURI.ParseSIPURIRelaxed(callDestination + "@sipsorcery.com")); SIPHeader dummyHeader = new SIPHeader("<sip:[email protected]>", "<sip:[email protected]>", 1, CallProperties.CreateNewCallId()) { CSeqMethod = SIPMethodsEnum.INVITE }; dummyHeader.Vias.PushViaHeader(new SIPViaHeader(new IPEndPoint(SIPTransport.BlackholeAddress, 0), CallProperties.CreateBranchId())); dummyInvite.Header = dummyHeader; dummyInvite.Header.ContentType = "application/sdp"; dummyInvite.Body = dialogueToReplace.SDP; return(dummyInvite); }
/// <summary> /// In transaction ACK requests are for non-2xx responses, i.e. INVITE rejected and no dialogue being created. /// </summary> /// <remarks> /// From RFC 3261 Chapter 17.1.1.3 - ACK for non-2xx final responses /// /// IMPORTANT: /// an ACK for a non-2xx response will also have the same branch ID as the INVITE whose response it acknowledges. /// /// The ACK request constructed by the client transaction MUST contain /// values for the Call-ID, From, and Request-URI that are equal to the /// values of those header fields in the request passed to the transport /// by the client transaction (call this the "original request"). The To /// header field in the ACK MUST equal the To header field in the /// response being acknowledged, and therefore will usually differ from /// the To header field in the original request by the addition of the /// tag parameter. The ACK MUST contain a single Via header field, and /// this MUST be equal to the top Via header field of the original /// request. The CSeq header field in the ACK MUST contain the same /// value for the sequence number as was present in the original request, /// but the method parameter MUST be equal to "ACK". /// /// If the INVITE request whose response is being acknowledged had Route /// header fields, those header fields MUST appear in the ACK. This is /// to ensure that the ACK can be routed properly through any downstream /// stateless proxies. /// </remarks> private SIPRequest GetInTransactionACKRequest(SIPResponse sipResponse, SIPURI ackURI) { SIPRequest ackRequest = new SIPRequest(SIPMethodsEnum.ACK, ackURI.ToString()); ackRequest.SetSendFromHints(sipResponse.LocalSIPEndPoint); SIPHeader header = new SIPHeader(TransactionRequest.Header.From, sipResponse.Header.To, sipResponse.Header.CSeq, sipResponse.Header.CallId); header.CSeqMethod = SIPMethodsEnum.ACK; header.AuthenticationHeader = TransactionRequest.Header.AuthenticationHeader; header.Routes = base.TransactionRequest.Header.Routes; header.ProxySendFrom = base.TransactionRequest.Header.ProxySendFrom; ackRequest.Header = header; ackRequest.Header.Vias.PushViaHeader(SIPViaHeader.GetDefaultSIPViaHeader()); return(ackRequest); }
private void CallAnswered(ISIPClientUserAgent uac, SIPResponse sipResponse) { logger.Debug("AppServerDispatcher CallAnswered with " + (int)sipResponse.Status + " " + sipResponse.ReasonPhrase + "."); SIPHeader okHeader = uac.ServerTransaction.TransactionFinalResponse.Header; int executionCount = 0; foreach (string unknownHeader in okHeader.UnknownHeaders) { if (unknownHeader.StartsWith("DialPlanEngine-ExecutionCount")) { executionCount = Convert.ToInt32(Regex.Match(unknownHeader, @"\S: (?<count>\d+)").Result("${count}")); break; } } m_startCheckTime.Stop(); logger.Debug("AppServerDispatcher execution count for " + m_activeAppServerEntry.AppServerURI.ToString() + " is " + executionCount + "."); logger.Debug("AppServerDispatcher response took " + m_startCheckTime.ElapsedMilliseconds + "ms."); }
private SIPResponse GetResponse(SIPHeader requestHeader, SIPResponseStatusCodesEnum responseCode) { try { SIPResponse response = new SIPResponse(responseCode); response.Header = new SIPHeader(requestHeader.Contact, requestHeader.From, requestHeader.To, requestHeader.CSeq, requestHeader.CallId); response.Header.CSeqMethod = requestHeader.CSeqMethod; response.Header.Via = requestHeader.Via; response.Header.MaxForwards = Int32.MinValue; return(response); } catch (Exception excp) { logger.Error("Exception GetResponse. " + excp.Message); throw excp; } }
/// <summary> /// Builds a basic SIP request with the header fields set to correctly identify it as an /// in dialog request. Calling this method also increments the dialog's local CSeq counter. /// This is safe to do even if the request does not end up being sent. /// </summary> /// <param name="method">The method of the SIP request to create.</param> /// <returns>An in dialog SIP request.</returns> public SIPRequest GetInDialogRequest(SIPMethodsEnum method) { CSeq++; SIPRequest inDialogRequest = new SIPRequest(method, RemoteTarget); SIPFromHeader fromHeader = SIPFromHeader.ParseFromHeader(LocalUserField.ToString()); SIPToHeader toHeader = SIPToHeader.ParseToHeader(RemoteUserField.ToString()); int cseq = CSeq; SIPHeader header = new SIPHeader(fromHeader, toHeader, cseq, CallId); header.CSeqMethod = method; inDialogRequest.Header = header; inDialogRequest.Header.Routes = RouteSet; inDialogRequest.Header.ProxySendFrom = ProxySendFrom; inDialogRequest.Header.Vias.PushViaHeader(SIPViaHeader.GetDefaultSIPViaHeader()); return(inDialogRequest); }
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("---------------------------------------------------"); }
/// <summary> /// 确认接收视频请求 /// </summary> /// <param name="response">响应消息</param> /// <returns></returns> private SIPRequest AckRequest(SIPResponse response) { SIPURI uri = new SIPURI(response.Header.To.ToURI.User, _remoteEndPoint.ToHost(), ""); SIPRequest ackRequest = _m_sipTransport.GetRequest(SIPMethodsEnum.ACK, uri); SIPFromHeader from = new SIPFromHeader(null, _sipRequest.URI, response.Header.CallId); from.FromTag = response.Header.From.FromTag; SIPHeader header = new SIPHeader(from, response.Header.To, response.Header.CSeq, response.Header.CallId); header.To.ToTag = null; header.CSeqMethod = SIPMethodsEnum.ACK; header.Vias = response.Header.Vias; header.MaxForwards = response.Header.MaxForwards; header.ContentLength = response.Header.ContentLength; header.UserAgent = _userAgent; header.Allow = null; ackRequest.Header = header; return(ackRequest); }
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("---------------------------------------------------"); }
private SIPResponse GetCancelResponse(SIPRequest sipRequest, SIPResponseStatusCodesEnum sipResponseCode) { try { SIPResponse cancelResponse = new SIPResponse(sipResponseCode, null, sipRequest.LocalSIPEndPoint); SIPHeader requestHeader = sipRequest.Header; cancelResponse.Header = new SIPHeader(requestHeader.From, requestHeader.To, requestHeader.CSeq, requestHeader.CallId); cancelResponse.Header.CSeqMethod = SIPMethodsEnum.CANCEL; cancelResponse.Header.Vias = requestHeader.Vias; cancelResponse.Header.MaxForwards = Int32.MinValue; return(cancelResponse); } catch (Exception excp) { logger.Error("Exception GetCancelResponse. " + excp.Message); throw excp; } }
private SIPRequest GetByeRequest(SIPEndPoint localSIPEndPoint) { SIPRequest byeRequest = new SIPRequest(SIPMethodsEnum.BYE, m_sipDialogue.RemoteTarget); SIPFromHeader byeFromHeader = SIPFromHeader.ParseFromHeader(m_sipDialogue.LocalUserField.ToString()); SIPToHeader byeToHeader = SIPToHeader.ParseToHeader(m_sipDialogue.RemoteUserField.ToString()); int cseq = m_sipDialogue.CSeq + 1; SIPHeader byeHeader = new SIPHeader(byeFromHeader, byeToHeader, cseq, m_sipDialogue.CallId); byeHeader.CSeqMethod = SIPMethodsEnum.BYE; byeRequest.Header = byeHeader; byeRequest.Header.Routes = m_sipDialogue.RouteSet; byeRequest.Header.ProxySendFrom = m_sipDialogue.ProxySendFrom; SIPViaHeader viaHeader = new SIPViaHeader(localSIPEndPoint, CallProperties.CreateBranchId()); byeRequest.Header.Vias.PushViaHeader(viaHeader); return(byeRequest); }
private SIPRequest GetByeRequest(SIPResponse inviteResponse, SIPURI byeURI) { SIPRequest byeRequest = new SIPRequest(SIPMethodsEnum.BYE, byeURI); byeRequest.SetSendFromHints(inviteResponse.LocalSIPEndPoint); SIPFromHeader byeFromHeader = inviteResponse.Header.From; SIPToHeader byeToHeader = inviteResponse.Header.To; int cseq = inviteResponse.Header.CSeq + 1; SIPHeader byeHeader = new SIPHeader(byeFromHeader, byeToHeader, cseq, inviteResponse.Header.CallId); byeHeader.CSeqMethod = SIPMethodsEnum.BYE; byeHeader.ProxySendFrom = m_serverTransaction.TransactionRequest.Header.ProxySendFrom; byeRequest.Header = byeHeader; byeRequest.Header.Routes = (inviteResponse.Header.RecordRoutes != null) ? inviteResponse.Header.RecordRoutes.Reversed() : null; byeRequest.Header.Vias.PushViaHeader(SIPViaHeader.GetDefaultSIPViaHeader(null)); return(byeRequest); }
/// <summary> /// Helper method to create a SIP response for a SIP request. This method can be thought of as creating a /// vanilla (or no frills) response for a request. It's suitable for generating error responses. For requests that /// require an action such as creating a call or registering a contact the response will require additional /// information and this method will not be suitable. /// </summary> /// <param name="sipRequest">The SIP request to create the response for.</param> /// <param name="responseCode">The response code.</param> /// <param name="reasonPhrase">Optional reason phrase to set on the response (needs to be short).</param> /// <returns>A SIP response object.</returns> public static SIPResponse GetResponse(SIPRequest sipRequest, SIPResponseStatusCodesEnum responseCode, string reasonPhrase) { try { SIPResponse response = new SIPResponse(responseCode, reasonPhrase); response.SetSendFromHints(sipRequest.LocalSIPEndPoint); if (reasonPhrase != null) { response.ReasonPhrase = reasonPhrase; } SIPHeader requestHeader = sipRequest.Header; SIPFromHeader from = (requestHeader == null || requestHeader.From != null) ? requestHeader.From : new SIPFromHeader(null, new SIPURI(sipRequest.URI.Scheme, sipRequest.LocalSIPEndPoint), null); SIPToHeader to = (requestHeader == null || requestHeader.To != null) ? requestHeader.To : new SIPToHeader(null, new SIPURI(sipRequest.URI.Scheme, sipRequest.LocalSIPEndPoint), null); int cSeq = (requestHeader == null || requestHeader.CSeq != -1) ? requestHeader.CSeq : 1; string callId = (requestHeader == null || requestHeader.CallId != null) ? requestHeader.CallId : CallProperties.CreateNewCallId(); response.Header = new SIPHeader(from, to, cSeq, callId); response.Header.CSeqMethod = (requestHeader != null) ? requestHeader.CSeqMethod : SIPMethodsEnum.NONE; if (requestHeader == null || requestHeader.Vias == null || requestHeader.Vias.Length == 0) { response.Header.Vias.PushViaHeader(new SIPViaHeader(sipRequest.RemoteSIPEndPoint, CallProperties.CreateBranchId())); } else { response.Header.Vias = requestHeader.Vias; } response.Header.MaxForwards = Int32.MinValue; response.Header.Allow = m_allowedSIPMethods; return(response); } catch (Exception excp) { logger.LogError("Exception SIPResponse.GetResponse. " + excp.Message); throw; } }
/// <summary> /// In transaction ACK requests are for non-2xx responses, i.e. INVITE rejected and no dialogue being created. /// </summary> private SIPRequest GetInTransactionACKRequest(SIPResponse sipResponse, SIPURI ackURI, SIPEndPoint localSIPEndPoint) { SIPRequest ackRequest = new SIPRequest(SIPMethodsEnum.ACK, ackURI.ToString()); ackRequest.LocalSIPEndPoint = localSIPEndPoint; SIPHeader header = new SIPHeader(TransactionRequest.Header.From, sipResponse.Header.To, sipResponse.Header.CSeq, sipResponse.Header.CallId); header.CSeqMethod = SIPMethodsEnum.ACK; header.AuthenticationHeader = TransactionRequest.Header.AuthenticationHeader; header.Routes = base.TransactionRequest.Header.Routes; header.ProxySendFrom = base.TransactionRequest.Header.ProxySendFrom; ackRequest.Header = header; SIPViaHeader viaHeader = new SIPViaHeader(localSIPEndPoint, sipResponse.Header.Vias.TopViaHeader.Branch); ackRequest.Header.Vias.PushViaHeader(viaHeader); return(ackRequest); }
private SIPRequest GetUpdateRequest(SIPRequest inviteRequest, CRMHeaders crmHeaders) { SIPRequest updateRequest = new SIPRequest(SIPMethodsEnum.UPDATE, inviteRequest.URI); updateRequest.SetSendFromHints(inviteRequest.LocalSIPEndPoint); SIPHeader inviteHeader = inviteRequest.Header; SIPHeader updateHeader = new SIPHeader(inviteHeader.From, inviteHeader.To, inviteHeader.CSeq + 1, inviteHeader.CallId); inviteRequest.Header.CSeq++; updateRequest.Header = updateHeader; updateHeader.CSeqMethod = SIPMethodsEnum.UPDATE; updateHeader.Routes = inviteHeader.Routes; updateHeader.ProxySendFrom = inviteHeader.ProxySendFrom; SIPViaHeader viaHeader = new SIPViaHeader(new IPEndPoint(IPAddress.Any, 0), CallProperties.CreateBranchId()); updateHeader.Vias.PushViaHeader(viaHeader); return(updateRequest); }
protected SIPResponse GetInfoResponse(SIPRequest sipRequest, SIPResponseStatusCodesEnum sipResponseCode) { try { SIPResponse informationalResponse = new SIPResponse(sipResponseCode, null, sipRequest.LocalSIPEndPoint); SIPHeader requestHeader = sipRequest.Header; informationalResponse.Header = new SIPHeader(requestHeader.From, requestHeader.To, requestHeader.CSeq, requestHeader.CallId); informationalResponse.Header.CSeqMethod = requestHeader.CSeqMethod; informationalResponse.Header.Vias = requestHeader.Vias; informationalResponse.Header.MaxForwards = Int32.MinValue; informationalResponse.Header.Timestamp = requestHeader.Timestamp; return(informationalResponse); } catch (Exception excp) { logger.LogError("Exception GetInformationalResponse. " + excp.Message); throw excp; } }
private SIPResponse GetOkResponse(SIPRequest sipRequest) { SIPResponse okResponse = SIPResponse.GetResponse(sipRequest, SIPResponseStatusCodesEnum.Ok, null); SIPHeader requestHeader = sipRequest.Header; okResponse.Header = new SIPHeader(requestHeader.Contact, requestHeader.From, requestHeader.To, requestHeader.CSeq, requestHeader.CallId); // RFC3261 has a To Tag on the example in section "24.1 Registration". if (okResponse.Header.To.ToTag == null || okResponse.Header.To.ToTag.Trim().Length == 0) { okResponse.Header.To.ToTag = CallProperties.CreateNewTag(); } okResponse.Header.CSeqMethod = requestHeader.CSeqMethod; okResponse.Header.Vias = requestHeader.Vias; okResponse.Header.Server = m_serverAgent; okResponse.Header.MaxForwards = Int32.MinValue; okResponse.Header.SetDateHeader(); return(okResponse); }
public SIPResponse GetOkResponse(SIPRequest sipRequest, SIPEndPoint localSIPEndPoint, string contentType, string messageBody) { try { SIPResponse okResponse = new SIPResponse(SIPResponseStatusCodesEnum.Ok, null, sipRequest.LocalSIPEndPoint); SIPHeader requestHeader = sipRequest.Header; okResponse.Header = new SIPHeader(new SIPContactHeader(null, new SIPURI(sipRequest.URI.Scheme, localSIPEndPoint)), requestHeader.From, requestHeader.To, requestHeader.CSeq, requestHeader.CallId); if (m_contactIPAddress != null) { if (IPSocket.TryParseIPEndPoint(okResponse.Header.Contact.First().ContactURI.Host, out var contactEP)) { contactEP.Address = m_contactIPAddress; okResponse.Header.Contact.First().ContactURI.Host = contactEP.ToString(); } else { throw new ApplicationException($"Could not parse IP end point from {okResponse.Header.Contact.First().ContactURI.Host} when parsing OK response."); } } okResponse.Header.To.ToTag = m_localTag; okResponse.Header.CSeqMethod = requestHeader.CSeqMethod; okResponse.Header.Vias = requestHeader.Vias; okResponse.Header.Server = m_sipServerAgent; okResponse.Header.MaxForwards = Int32.MinValue; okResponse.Header.RecordRoutes = requestHeader.RecordRoutes; okResponse.Body = messageBody; okResponse.Header.ContentType = contentType; okResponse.Header.ContentLength = (messageBody != null) ? messageBody.Length : 0; return(okResponse); } catch (Exception excp) { logger.LogError("Exception GetOkResponse. " + excp.Message); throw excp; } }
private SIPRequest GetInviteRequest(SIPDialogue dialogue, SIPEndPoint localSIPEndPoint, string body) { SIPRequest inviteRequest = new SIPRequest(SIPMethodsEnum.INVITE, dialogue.RemoteTarget); SIPHeader inviteHeader = new SIPHeader(SIPFromHeader.ParseFromHeader(dialogue.LocalUserField.ToString()), SIPToHeader.ParseToHeader(dialogue.RemoteUserField.ToString()), dialogue.CSeq, dialogue.CallId); SIPURI contactURI = new SIPURI(dialogue.RemoteTarget.Scheme, localSIPEndPoint); inviteHeader.Contact = SIPContactHeader.ParseContactHeader("<" + contactURI.ToString() + ">"); inviteHeader.CSeqMethod = SIPMethodsEnum.INVITE; inviteRequest.Header = inviteHeader; inviteRequest.Header.Routes = dialogue.RouteSet; SIPViaHeader viaHeader = new SIPViaHeader(localSIPEndPoint, CallProperties.CreateBranchId()); inviteRequest.Header.Vias.PushViaHeader(viaHeader); inviteRequest.Body = body; inviteRequest.Header.ContentLength = body.Length; inviteRequest.Header.ContentType = m_sdpContentType; return(inviteRequest); }
private SIPRequest GetInviteRequest(IPEndPoint localContact, string inviteBody, IPEndPoint dstEndPoint) { SIPRequest inviteRequest = new SIPRequest(SIPMethodsEnum.INVITE, SIPURI.ParseSIPURI("sip:" + dstEndPoint)); SIPHeader inviteHeader = new SIPHeader(SIPFromHeader.ParseFromHeader("<sip:" + localContact + ">"), SIPToHeader.ParseToHeader("<sip:" + dstEndPoint + ">"), 1, CallProperties.CreateNewCallId()); inviteHeader.From.FromTag = CallProperties.CreateNewTag(); inviteHeader.Contact = SIPContactHeader.ParseContactHeader("sip:" + localContact); inviteHeader.CSeqMethod = SIPMethodsEnum.INVITE; inviteHeader.UserAgent = "unit test"; inviteRequest.Header = inviteHeader; SIPViaHeader viaHeader = new SIPViaHeader(localContact.Address.ToString(), localContact.Port, CallProperties.CreateBranchId(), SIPProtocolsEnum.udp); inviteRequest.Header.Vias.PushViaHeader(viaHeader); //inviteRequest.Body = inviteBody; //inviteRequest.Header.ContentLength = inviteBody.Length; inviteRequest.Header.ContentType = "application/sdp"; return(inviteRequest); }
public SIPRequest GetReferRequest(SIPRequest inviteRequest, SIPResponse inviteResponse, string referToURI) { SIPRequest referRequest = new SIPRequest(SIPMethodsEnum.REFER, inviteRequest.URI); SIPHeader referHeader = new SIPHeader(inviteResponse.Header.From, inviteResponse.Header.To, inviteRequest.Header.CSeq + 1, inviteRequest.Header.CallId); referHeader.Contact = inviteRequest.Header.Contact; referHeader.CSeqMethod = SIPMethodsEnum.REFER; referHeader.ReferTo = referToURI; SIPFromHeader referredBy = new SIPFromHeader(inviteRequest.Header.From.FromName, inviteRequest.Header.From.FromURI, null); referHeader.ReferredBy = referredBy.ToString(); referHeader.AuthenticationHeader = inviteRequest.Header.AuthenticationHeader; IPEndPoint localSIPEndPoint = m_sipTransport.GetIPEndPointsList()[0]; SIPViaHeader viaHeader = new SIPViaHeader(localSIPEndPoint.Address.ToString(), localSIPEndPoint.Port, CallProperties.CreateBranchId()); referHeader.Via.PushViaHeader(viaHeader); referRequest.Header = referHeader; return(referRequest); }
/// <summary> /// 向上级平台注册 /// </summary> private void RegisterToPlatform() { string fromTag = CallProperties.CreateNewTag(); string callId = CallProperties.CreateNewCallId(); int cSeq = CallProperties.CreateNewCSeq(); string branch = CallProperties.CreateBranchId(); SIPURI localUri = new SIPURI(LocalSIPId, LocalEndPoint.ToHost(), ""); SIPURI remoteUri = new SIPURI(RemoteSIPId, RemoteEndPoint.ToHost(), ""); SIPRequest registerReq = new SIPRequest(SIPMethodsEnum.REGISTER, remoteUri); SIPViaHeader via = new SIPViaHeader(LocalEndPoint, branch); SIPViaSet viaSet = new SIPViaSet(); viaSet.PushViaHeader(via); SIPFromHeader from = new SIPFromHeader(null, localUri, fromTag); SIPToHeader to = new SIPToHeader(null, localUri, null); SIPHeader header = new SIPHeader(from, to, cSeq, callId); registerReq.Header = header; SIPContactHeader contact = new SIPContactHeader(null, localUri); header.Contact = new List <SIPContactHeader>(); header.Contact.Add(contact); header.Vias = viaSet; header.AuthenticationHeader = _auth; header.Expires = 3600; header.CSeqMethod = SIPMethodsEnum.REGISTER; header.MaxForwards = 70; header.ContentLength = 0; header.UserAgent = SIPConstants.SIP_SERVER_STRING; Transport.SendRequest(RemoteEndPoint, registerReq); }
public void ByeVideoReq() { if (_audioChannel == null) { return; } _audioChannel.Stop(); _audioChannel = null; SIPURI localUri = new SIPURI(_LocalSipAccount.SIPPassword, LocalEP.ToHost(), ""); SIPURI remoteUri = new SIPURI(_ackRequest.Header.From.FromURI.User, _byeRemoteEP.ToHost(), ""); SIPFromHeader from = new SIPFromHeader(null, localUri, _ackRequest.Header.To.ToTag); SIPToHeader to = new SIPToHeader(null, remoteUri, _ackRequest.Header.From.FromTag); SIPRequest byeReq = new SIPRequest(SIPMethodsEnum.BYE, localUri); SIPHeader header = new SIPHeader(from, to, _ackRequest.Header.CSeq + 1, _ackRequest.Header.CallId) { CSeqMethod = SIPMethodsEnum.BYE }; SIPViaHeader viaHeader = new SIPViaHeader(LocalEP, CallProperties.CreateBranchId()) { Branch = CallProperties.CreateBranchId(), Transport = SIPProtocolsEnum.udp }; SIPViaSet viaSet = new SIPViaSet { Via = new List <SIPViaHeader>() }; viaSet.Via.Add(viaHeader); header.Vias = viaSet; header.UserAgent = SIPConstants.SIP_USERAGENT_STRING; header.Contact = _ackRequest.Header.Contact; byeReq.Header = header; SendRequest(_byeRemoteEP, byeReq); }
private SIPRequest GetOptionsRequest(SIPURI serverURI, int cseq, IPEndPoint contact) { SIPRequest optionsRequest = new SIPRequest(SIPMethodsEnum.OPTIONS, serverURI); SIPFromHeader fromHeader = new SIPFromHeader(null, SIPURI.ParseSIPURI("sip:" + contact.ToString()), null); SIPToHeader toHeader = new SIPToHeader(null, serverURI, null); string callId = CallProperties.CreateNewCallId(); string branchId = CallProperties.CreateBranchId(); SIPHeader header = new SIPHeader(fromHeader, toHeader, cseq, callId); header.CSeqMethod = SIPMethodsEnum.OPTIONS; header.MaxForwards = 0; SIPViaHeader viaHeader = new SIPViaHeader(contact.Address.ToString(), contact.Port, branchId); header.Vias.PushViaHeader(viaHeader); optionsRequest.Header = header; return(optionsRequest); }
/// <summary> /// New transaction ACK requests are for 2xx responses, i.e. INVITE accepted and /// dialogue being created. /// </summary> /// <remarks> /// From RFC 3261 Chapter 13.2.2.4 - ACK for 2xx final responses /// /// IMPORTANT: /// an ACK for a 2xx final response is a new transaction and has a new branch ID. /// /// The UAC core MUST generate an ACK request for each 2xx received from /// the transaction layer. The header fields of the ACK are constructed /// in the same way as for any request sent within a dialog (see Section /// 12) with the exception of the CSeq and the header fields related to /// authentication. The sequence number of the CSeq header field MUST be /// the same as the INVITE being acknowledged, but the CSeq method MUST /// be ACK. The ACK MUST contain the same credentials as the INVITE. If /// the 2xx contains an offer (based on the rules above), the ACK MUST /// carry an answer in its body. If the offer in the 2xx response is not /// acceptable, the UAC core MUST generate a valid answer in the ACK and /// then send a BYE immediately. /// </remarks> private SIPRequest GetNewTxACKRequest(SIPMethodsEnum method, int cseq, SIPResponse sipResponse, SIPURI ackURI) { SIPRequest acknowledgeRequest = new SIPRequest(method, ackURI.ToString()); acknowledgeRequest.SetSendFromHints(sipResponse.LocalSIPEndPoint); SIPHeader header = new SIPHeader(TransactionRequest.Header.From, sipResponse.Header.To, cseq, sipResponse.Header.CallId); header.CSeqMethod = method; header.AuthenticationHeaders = TransactionRequest.Header.AuthenticationHeaders; header.ProxySendFrom = TransactionRequest.Header.ProxySendFrom; // If the UAS supplies a desired Record-Route list use that first. Otherwise fall back to any Route list used in the original transaction. if (sipResponse.Header.RecordRoutes != null) { header.Routes = sipResponse.Header.RecordRoutes.Reversed(); } else if (TransactionRequest.Header.Routes != null) { header.Routes = TransactionRequest.Header.Routes; } acknowledgeRequest.Header = header; acknowledgeRequest.Header.Vias.PushViaHeader(SIPViaHeader.GetDefaultSIPViaHeader(null)); if (method == SIPMethodsEnum.PRACK) { m_sentPrack = true; acknowledgeRequest.Header.RAckRSeq = sipResponse.Header.RSeq; acknowledgeRequest.Header.RAckCSeq = sipResponse.Header.CSeq; acknowledgeRequest.Header.RAckCSeqMethod = sipResponse.Header.CSeqMethod; } return(acknowledgeRequest); }
private SIPResponse GetErrorResponse(SIPRequest sipRequest, SIPResponseStatusCodesEnum errorResponseCode, string errorMessage) { try { SIPResponse errorResponse = SIPTransport.GetResponse(sipRequest, errorResponseCode, null); if (errorMessage != null) { errorResponse.ReasonPhrase = errorMessage; } SIPHeader requestHeader = sipRequest.Header; SIPHeader errorHeader = new SIPHeader(requestHeader.Contact, requestHeader.From, requestHeader.To, requestHeader.CSeq, requestHeader.CallId); if (errorHeader.To.ToTag == null || errorHeader.To.ToTag.Trim().Length == 0) { errorHeader.To.ToTag = CallProperties.CreateNewTag(); } errorHeader.CSeqMethod = requestHeader.CSeqMethod; errorHeader.Vias = requestHeader.Vias; //errorHeader.Server = m_serverAgent; errorHeader.UserAgent = m_serverAgent; errorHeader.MaxForwards = Int32.MinValue; errorResponse.Header = errorHeader; return(errorResponse); } catch (Exception excp) { Logger.Logger.Error("Exception GetErrorResponse. ->" + excp.Message); throw excp; } }
private SIPRequest GetDummyINVITERequest(SIPURI dummyURI) { string dummyFrom = "<sip:[email protected]>"; string dummyContact = "sip:127.0.0.1:1234"; SIPRequest inviteRequest = new SIPRequest(SIPMethodsEnum.INVITE, dummyURI); SIPHeader inviteHeader = new SIPHeader(SIPFromHeader.ParseFromHeader(dummyFrom), new SIPToHeader(null, dummyURI, null), 1, CallProperties.CreateNewCallId()); inviteHeader.From.FromTag = CallProperties.CreateNewTag(); inviteHeader.Contact = SIPContactHeader.ParseContactHeader(dummyContact); inviteHeader.CSeqMethod = SIPMethodsEnum.INVITE; inviteHeader.UserAgent = "unittest"; inviteRequest.Header = inviteHeader; SIPViaHeader viaHeader = new SIPViaHeader("127.0.0.1", 1234, CallProperties.CreateBranchId(), SIPProtocolsEnum.udp); inviteRequest.Header.Vias.PushViaHeader(viaHeader); inviteRequest.Body = "dummy"; inviteRequest.Header.ContentLength = inviteRequest.Body.Length; inviteRequest.Header.ContentType = "application/sdp"; return(inviteRequest); }
public void ParseNoViaHeadersUnitTest() { Console.WriteLine("--> " + 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; Console.WriteLine("Original SIP Headers:\n" + noViaHeaders); string[] headersCollection = Regex.Split(noViaHeaders, "\r\n"); SIPHeader sipHeader = SIPHeader.ParseSIPHeaders(headersCollection); Console.WriteLine("---------------------------------------------------"); }
private void AdjustContactHeader(SIPHeader sipHeader, SIPEndPoint localSIPEndPoint, IPAddress publicIPAddress) { try { // Set the Contact URI on the outgoing requests depending on which SIP socket the request is being sent on and whether // the request is going to an external network. if (sipHeader.Contact != null && sipHeader.Contact.Count == 1) { SIPEndPoint proxyContact = localSIPEndPoint.CopyOf(); if (publicIPAddress != null) { proxyContact = new SIPEndPoint(proxyContact.Protocol, publicIPAddress, proxyContact.Port); } sipHeader.Contact[0].ContactURI.Host = proxyContact.GetIPEndPoint().ToString(); sipHeader.Contact[0].ContactURI.Protocol = proxyContact.Protocol; } } catch (Exception excp) { logger.Error("Exception AdjustContactHeader. " + excp.Message); throw; } }
private SIPRequest GetRequest(SIPMethodsEnum method) { try { SIPURI uri = SIPURI.ParseSIPURIRelaxed(m_callDescriptor.Uri); SIPRequest request = new SIPRequest(method, uri); SIPFromHeader fromHeader = m_callDescriptor.GetFromHeader(); fromHeader.FromTag = CallProperties.CreateNewTag(); SIPToHeader toHeader = new SIPToHeader(null, uri, null); int cseq = Crypto.GetRandomInt(10000, 20000); SIPHeader header = new SIPHeader(fromHeader, toHeader, cseq, CallProperties.CreateNewCallId()); header.CSeqMethod = method; header.UserAgent = m_userAgent; request.Header = header; SIPViaHeader viaHeader = new SIPViaHeader(m_sipTransport.GetDefaultSIPEndPoint(), CallProperties.CreateBranchId()); request.Header.Vias.PushViaHeader(viaHeader); try { if (m_callDescriptor.CustomHeaders != null && m_callDescriptor.CustomHeaders.Count > 0) { foreach (string customHeader in m_callDescriptor.CustomHeaders) { if (customHeader.IsNullOrBlank()) { continue; } else if (customHeader.Trim().StartsWith(SIPHeaders.SIP_HEADER_USERAGENT)) { request.Header.UserAgent = customHeader.Substring(customHeader.IndexOf(":") + 1).Trim(); } else { request.Header.UnknownHeaders.Add(customHeader); } } } } catch (Exception excp) { logger.LogError("Exception Parsing CustomHeader for SIPNonInviteClientUserAgent GetRequest. " + excp.Message + m_callDescriptor.CustomHeaders); } if (!m_callDescriptor.Content.IsNullOrBlank()) { request.Body = m_callDescriptor.Content; request.Header.ContentType = m_callDescriptor.ContentType; request.Header.ContentLength = request.Body.Length; } return(request); } catch (Exception excp) { logger.LogError("Exception SIPNonInviteClientUserAgent GetRequest. " + excp.Message); throw excp; } }
private SIPRequest GetUpdateRequest(SIPRequest inviteRequest, CRMHeaders crmHeaders) { SIPRequest updateRequest = new SIPRequest(SIPMethodsEnum.UPDATE, inviteRequest.URI); updateRequest.LocalSIPEndPoint = inviteRequest.LocalSIPEndPoint; SIPHeader inviteHeader = inviteRequest.Header; SIPHeader updateHeader = new SIPHeader(inviteHeader.From, inviteHeader.To, inviteHeader.CSeq + 1, inviteHeader.CallId); inviteRequest.Header.CSeq++; updateRequest.Header = updateHeader; updateHeader.CSeqMethod = SIPMethodsEnum.UPDATE; updateHeader.Routes = inviteHeader.Routes; updateHeader.ProxySendFrom = inviteHeader.ProxySendFrom; SIPViaHeader viaHeader = new SIPViaHeader(inviteRequest.LocalSIPEndPoint, CallProperties.CreateBranchId()); updateHeader.Vias.PushViaHeader(viaHeader); // Add custom CRM headers. if (crmHeaders != null) { updateHeader.CRMPersonName = crmHeaders.PersonName; updateHeader.CRMCompanyName = crmHeaders.CompanyName; updateHeader.CRMPictureURL = crmHeaders.AvatarURL; } return updateRequest; }
private SIPRequest CreateDummyRequest(SIPDialogue dialogueToReplace, string callDestination) { SIPRequest dummyInvite = new SIPRequest(SIPMethodsEnum.INVITE, SIPURI.ParseSIPURIRelaxed(callDestination + "@sipsorcery.com")); SIPHeader dummyHeader = new SIPHeader("<sip:[email protected]>", "<sip:[email protected]>", 1, CallProperties.CreateNewCallId()); dummyHeader.CSeqMethod = SIPMethodsEnum.INVITE; dummyHeader.Vias.PushViaHeader(new SIPViaHeader(new IPEndPoint(SIPTransport.BlackholeAddress, 0), CallProperties.CreateBranchId())); dummyInvite.Header = dummyHeader; dummyInvite.Header.ContentType = "application/sdp"; dummyInvite.Body = dialogueToReplace.SDP; return dummyInvite; }
private SIPRequest GetInviteRequest(string callURI, SIPCallDescriptor sipCallDescriptor) { SIPFromHeader fromHeader = sipCallDescriptor.GetFromHeader(); SIPRequest inviteRequest = new SIPRequest(SIPMethodsEnum.INVITE, SIPURI.ParseSIPURI(callURI)); inviteRequest.LocalSIPEndPoint = m_blackhole; SIPHeader inviteHeader = new SIPHeader(fromHeader, new SIPToHeader(null, inviteRequest.URI, null), 1, CallProperties.CreateNewCallId()); inviteHeader.From.FromTag = CallProperties.CreateNewTag(); // For incoming calls forwarded via the dial plan the username needs to go into the Contact header. inviteHeader.Contact = new List<SIPContactHeader>() { new SIPContactHeader(null, new SIPURI(inviteRequest.URI.Scheme, m_blackhole)) }; inviteHeader.CSeqMethod = SIPMethodsEnum.INVITE; inviteRequest.Header = inviteHeader; SIPViaHeader viaHeader = new SIPViaHeader(m_blackhole, CallProperties.CreateBranchId()); inviteRequest.Header.Vias.PushViaHeader(viaHeader); try { if (sipCallDescriptor.CustomHeaders != null && sipCallDescriptor.CustomHeaders.Count > 0) { foreach (string customHeader in sipCallDescriptor.CustomHeaders) { if (customHeader.IsNullOrBlank()) { continue; } else if (customHeader.Trim().StartsWith(SIPHeaders.SIP_HEADER_USERAGENT)) { inviteRequest.Header.UserAgent = customHeader.Substring(customHeader.IndexOf(":") + 1).Trim(); } else { inviteRequest.Header.UnknownHeaders.Add(customHeader); } } } } catch (Exception excp) { logger.Error("Exception Parsing CustomHeader for GetInviteRequest. " + excp.Message + sipCallDescriptor.CustomHeaders); } return inviteRequest; }
private SIPRequest GetInviteRequest(string callURI, SIPFromHeader fromHeader) { SIPRequest inviteRequest = new SIPRequest(SIPMethodsEnum.INVITE, SIPURI.ParseSIPURI(callURI)); inviteRequest.LocalSIPEndPoint = m_blackhole; SIPHeader inviteHeader = new SIPHeader(fromHeader, new SIPToHeader(null, inviteRequest.URI, null), 1, CallProperties.CreateNewCallId()); inviteHeader.From.FromTag = CallProperties.CreateNewTag(); // For incoming calls forwarded via the dial plan the username needs to go into the Contact header. inviteHeader.Contact = new List<SIPContactHeader>() { new SIPContactHeader(null, new SIPURI(inviteRequest.URI.Scheme, m_blackhole)) }; inviteHeader.CSeqMethod = SIPMethodsEnum.INVITE; inviteRequest.Header = inviteHeader; SIPViaHeader viaHeader = new SIPViaHeader(m_blackhole, CallProperties.CreateBranchId()); inviteRequest.Header.Vias.PushViaHeader(viaHeader); return inviteRequest; }
private SIPRequest GetCancelRequest(SIPRequest inviteRequest) { SIPRequest cancelRequest = new SIPRequest(SIPMethodsEnum.CANCEL, inviteRequest.URI); cancelRequest.LocalSIPEndPoint = inviteRequest.LocalSIPEndPoint; SIPHeader inviteHeader = inviteRequest.Header; SIPHeader cancelHeader = new SIPHeader(inviteHeader.From, inviteHeader.To, inviteHeader.CSeq, inviteHeader.CallId); cancelRequest.Header = cancelHeader; cancelHeader.CSeqMethod = SIPMethodsEnum.CANCEL; cancelHeader.Routes = inviteHeader.Routes; cancelHeader.ProxySendFrom = inviteHeader.ProxySendFrom; cancelHeader.Vias = inviteHeader.Vias; return cancelRequest; }
public SIPRequest GetByeRequest(SIPResponse inviteResponse) { SIPRequest byeRequest = new SIPRequest(SIPMethodsEnum.BYE, inviteResponse.Header.Contact[0].ContactURI); SIPHeader byeHeader = new SIPHeader(inviteResponse.Header.From, inviteResponse.Header.To, inviteResponse.Header.CSeq + 1, inviteResponse.Header.CallId); byeHeader.CSeqMethod = SIPMethodsEnum.BYE; IPEndPoint localSIPEndPoint = m_sipTransport.GetIPEndPointsList()[0]; SIPViaHeader viaHeader = new SIPViaHeader(localSIPEndPoint.Address.ToString(), localSIPEndPoint.Port, CallProperties.CreateBranchId()); byeHeader.Via.PushViaHeader(viaHeader); byeRequest.Header = byeHeader; return byeRequest; }
public SIPRequest GetReferRequest(SIPRequest inviteRequest, SIPResponse inviteResponse, string referToURI) { SIPRequest referRequest = new SIPRequest(SIPMethodsEnum.REFER, inviteRequest.URI); SIPHeader referHeader = new SIPHeader(inviteResponse.Header.From, inviteResponse.Header.To, inviteRequest.Header.CSeq + 1, inviteRequest.Header.CallId); referHeader.Contact = inviteRequest.Header.Contact; referHeader.CSeqMethod = SIPMethodsEnum.REFER; referHeader.ReferTo = referToURI; SIPFromHeader referredBy = new SIPFromHeader(inviteRequest.Header.From.FromName, inviteRequest.Header.From.FromURI, null); referHeader.ReferredBy = referredBy.ToString(); referHeader.AuthenticationHeader = inviteRequest.Header.AuthenticationHeader; IPEndPoint localSIPEndPoint = m_sipTransport.GetIPEndPointsList()[0]; SIPViaHeader viaHeader = new SIPViaHeader(localSIPEndPoint.Address.ToString(), localSIPEndPoint.Port, CallProperties.CreateBranchId()); referHeader.Via.PushViaHeader(viaHeader); referRequest.Header = referHeader; return referRequest; }
public SIPRequest GetRegisterRequest(string server, string toURIStr, string contactStr) { try { IPEndPoint localSIPEndPoint = m_sipTransport.GetDefaultTransportContact(SIPProtocolsEnum.UDP); SIPRequest registerRequest = new SIPRequest(SIPMethodsEnum.REGISTER, "sip:" + server); SIPHeader registerHeader = new SIPHeader(SIPFromHeader.ParseFromHeader(toURIStr), SIPToHeader.ParseToHeader(toURIStr), 1, CallProperties.CreateNewCallId()); registerHeader.From.FromTag = CallProperties.CreateNewTag(); registerHeader.Contact = SIPContactHeader.ParseContactHeader(contactStr); SIPViaHeader viaHeader = new SIPViaHeader(localSIPEndPoint.Address.ToString(), localSIPEndPoint.Port, CallProperties.CreateBranchId()); registerHeader.Via.PushViaHeader(viaHeader); registerHeader.CSeqMethod = SIPMethodsEnum.REGISTER; registerHeader.Expires = SIPConstants.DEFAULT_REGISTEREXPIRY_SECONDS; registerRequest.Header = registerHeader; return registerRequest; } catch (Exception excp) { logger.Error("Exception GetRegisterRequest. " + excp.Message); throw new ApplicationException("GetRegisterRequest " + excp.GetType().ToString() + ". " + excp.Message); } }
public SIPRequest GetSIPRequest(SIPMethodsEnum sipMethod, string requestURIStr, string fromURIStr, int cseq, string callId, string contentType, string body) { SIPURI requestURI = (requestURIStr.StartsWith("sip:")) ? SIPURI.ParseSIPURI(requestURIStr) : SIPURI.ParseSIPURI("sip:" + requestURIStr); SIPURI fromURI = (fromURIStr.StartsWith("sip:")) ? SIPURI.ParseSIPURI(fromURIStr) : SIPURI.ParseSIPURI("sip:" + fromURIStr); SIPFromHeader fromHeader = new SIPFromHeader(null, fromURI, CallProperties.CreateNewTag()); SIPToHeader toHeader = new SIPToHeader(null, requestURI, null); SIPRequest sipRequest = new SIPRequest(sipMethod, requestURI); IPEndPoint localSIPEndPoint = m_sipTransport.GetIPEndPointsList()[0]; SIPHeader sipHeader = new SIPHeader(fromHeader, toHeader, cseq, callId); sipHeader.Contact = SIPContactHeader.ParseContactHeader("sip:" + localSIPEndPoint.ToString()); sipHeader.CSeqMethod = sipMethod; sipRequest.Header = sipHeader; SIPViaHeader viaHeader = new SIPViaHeader(localSIPEndPoint.Address.ToString(), localSIPEndPoint.Port, CallProperties.CreateBranchId()); sipRequest.Header.Via.PushViaHeader(viaHeader); if (body != null && body.Trim().Length > 0) { sipRequest.Body = body; //sipRequest.Body = "Signal=5\r\nDuration=250"; //sipRequest.Body = "<rtcp>blah blah blah</rtcp>"; sipRequest.Header.ContentLength = sipRequest.Body.Length; sipRequest.Header.ContentType = contentType; } return sipRequest; }
private SIPResponse GetResponse(SIPHeader requestHeader, SIPResponseStatusCodesEnum responseCode) { try { SIPResponse response = new SIPResponse(responseCode); response.Header = new SIPHeader(requestHeader.Contact, requestHeader.From, requestHeader.To, requestHeader.CSeq, requestHeader.CallId); response.Header.CSeqMethod = requestHeader.CSeqMethod; response.Header.Via = requestHeader.Via; response.Header.MaxForwards = Int32.MinValue; return response; } catch (Exception excp) { logger.Error("Exception GetResponse. " + excp.Message); throw excp; } }
//private void ByeFinalResponseReceived(IPEndPoint localEndPoint, IPEndPoint remoteEndPoint, SIPTransaction sipTransaction, SIPResponse sipResponse) //{ // Log_External(new SIPMonitorConsoleEvent(SIPMonitorServerTypesEnum.UserAgentClient, SIPMonitorEventTypesEnum.DialPlan, "BYE response " + sipResponse.StatusCode + " " + sipResponse.ReasonPhrase + ".", Owner)); //} private SIPRequest GetInviteRequest(SIPCallDescriptor sipCallDescriptor, string branchId, string callId, SIPEndPoint localSIPEndPoint, SIPRouteSet routeSet, string content, string contentType) { SIPRequest inviteRequest = new SIPRequest(SIPMethodsEnum.INVITE, sipCallDescriptor.Uri); inviteRequest.LocalSIPEndPoint = localSIPEndPoint; SIPHeader inviteHeader = new SIPHeader(sipCallDescriptor.GetFromHeader(), SIPToHeader.ParseToHeader(sipCallDescriptor.To), 1, callId); inviteHeader.From.FromTag = CallProperties.CreateNewTag(); // For incoming calls forwarded via the dial plan the username needs to go into the Contact header. inviteHeader.Contact = new List<SIPContactHeader>() { new SIPContactHeader(null, new SIPURI(inviteRequest.URI.Scheme, localSIPEndPoint)) }; inviteHeader.Contact[0].ContactURI.User = sipCallDescriptor.Username; inviteHeader.CSeqMethod = SIPMethodsEnum.INVITE; inviteHeader.UserAgent = m_userAgent; inviteHeader.Routes = routeSet; inviteRequest.Header = inviteHeader; if (!sipCallDescriptor.ProxySendFrom.IsNullOrBlank()) { inviteHeader.ProxySendFrom = sipCallDescriptor.ProxySendFrom; } SIPViaHeader viaHeader = new SIPViaHeader(localSIPEndPoint, branchId); inviteRequest.Header.Vias.PushViaHeader(viaHeader); inviteRequest.Body = content; inviteRequest.Header.ContentLength = (inviteRequest.Body != null) ? inviteRequest.Body.Length : 0; inviteRequest.Header.ContentType = contentType; // Add custom switchboard headers. if (CallDescriptor.SwitchboardHeaders != null) { inviteHeader.SwitchboardOriginalCallID = CallDescriptor.SwitchboardHeaders.SwitchboardOriginalCallID; //inviteHeader.SwitchboardCallerDescription = CallDescriptor.SwitchboardHeaders.SwitchboardCallerDescription; inviteHeader.SwitchboardLineName = CallDescriptor.SwitchboardHeaders.SwitchboardLineName; //inviteHeader.SwitchboardOwner = CallDescriptor.SwitchboardHeaders.SwitchboardOwner; //inviteHeader.SwitchboardOriginalFrom = CallDescriptor.SwitchboardHeaders.SwitchboardOriginalFrom; } // Add custom CRM headers. if (CallDescriptor.CRMHeaders != null) { inviteHeader.CRMPersonName = CallDescriptor.CRMHeaders.PersonName; inviteHeader.CRMCompanyName = CallDescriptor.CRMHeaders.CompanyName; inviteHeader.CRMPictureURL = CallDescriptor.CRMHeaders.AvatarURL; } try { if (sipCallDescriptor.CustomHeaders != null && sipCallDescriptor.CustomHeaders.Count > 0) { foreach (string customHeader in sipCallDescriptor.CustomHeaders) { if (customHeader.IsNullOrBlank()) { continue; } else if (customHeader.Trim().StartsWith(SIPHeaders.SIP_HEADER_USERAGENT)) { inviteRequest.Header.UserAgent = customHeader.Substring(customHeader.IndexOf(":") + 1).Trim(); } else { inviteRequest.Header.UnknownHeaders.Add(customHeader); } } } } catch (Exception excp) { logger.Error("Exception Parsing CustomHeader for GetInviteRequest. " + excp.Message + sipCallDescriptor.CustomHeaders); } return inviteRequest; }
public SIPRequest GetCancelRequest(SIPRequest inviteRequest) { SIPRequest cancelRequest = new SIPRequest(SIPMethodsEnum.CANCEL, inviteRequest.URI); SIPHeader cancelHeader = new SIPHeader(inviteRequest.Header.From, inviteRequest.Header.To, inviteRequest.Header.CSeq, inviteRequest.Header.CallId); cancelHeader.Via = inviteRequest.Header.Via; cancelHeader.CSeqMethod = SIPMethodsEnum.CANCEL; cancelRequest.Header = cancelHeader; return cancelRequest; }
/// <summary> /// Attempts to parse a SIP message from a string containing a single SIP request or response. /// </summary> /// <param name="message">The string to parse.</param> /// <param name="localSIPEndPoint">The end point the message was received on.</param> /// <param name="remoteSIPEndPoint">The end point the message was received from.</param> /// <returns>If successful a SIP message or null if not.</returns> public static SIPMessageBuffer ParseSIPMessage(string message, SIPEndPoint localSIPEndPoint, SIPEndPoint remoteSIPEndPoint) { try { SIPMessageBuffer sipMessage = new SIPMessageBuffer(); sipMessage.LocalSIPEndPoint = localSIPEndPoint; sipMessage.RemoteSIPEndPoint = remoteSIPEndPoint; // For connection oriented transports the same connection should be used for responses and subsequent requests. if (sipMessage.LocalSIPEndPoint != null && remoteSIPEndPoint.ConnectionID != null) { sipMessage.LocalSIPEndPoint.ConnectionID = remoteSIPEndPoint.ConnectionID; } sipMessage.RawMessage = message; int endFistLinePosn = message.IndexOf(m_CRLF); if (endFistLinePosn != -1) { sipMessage.FirstLine = message.Substring(0, endFistLinePosn); if (sipMessage.FirstLine.Substring(0, 3) == SIP_RESPONSE_PREFIX) { sipMessage.SIPMessageType = SIPMessageTypesEnum.Response; } else { sipMessage.SIPMessageType = SIPMessageTypesEnum.Request; } int endHeaderPosn = message.IndexOf(m_CRLF + m_CRLF); if (endHeaderPosn == -1) { // Assume flakey implementation if message does not contain the required CRLFCRLF sequence and treat the message as having no body. string headerString = message.Substring(endFistLinePosn + 2, message.Length - endFistLinePosn - 2); sipMessage.SIPHeaders = SIPHeader.SplitHeaders(headerString); } else { string headerString = message.Substring(endFistLinePosn + 2, endHeaderPosn - endFistLinePosn - 2); sipMessage.SIPHeaders = SIPHeader.SplitHeaders(headerString); if (message.Length > endHeaderPosn + 4) { sipMessage.Body = message.Substring(endHeaderPosn + 4); } } return(sipMessage); } else { Logger.Logger.Warn( "Error ParseSIPMessage, there were no end of line characters in the string being parsed."); return(null); } } catch (Exception excp) { Logger.Logger.Error("Exception ParseSIPMessage. ->" + excp.Message + "->SIP Message=" + message + "."); return(null); } }
public SIPRequest GetInviteRequest(string inviteURIStr, string fromURIStr, string body, int rtpPort) { SIPURI inviteURI = (inviteURIStr.StartsWith("sip:")) ? SIPURI.ParseSIPURI(inviteURIStr) : SIPURI.ParseSIPURI("sip:" + inviteURIStr); SIPFromHeader fromHeader = SIPFromHeader.ParseFromHeader(fromURIStr); // (fromURIStr.StartsWith("sip:")) ? SIPFromHeader.ParseFromHeader(fromURIStr) : SIPFromHeader.ParseFromHeader("sip:" + fromURIStr); SIPToHeader toHeader = new SIPToHeader(null, inviteURI, null); SIPRequest inviteRequest = new SIPRequest(SIPMethodsEnum.INVITE, inviteURI); IPEndPoint localSIPEndPoint = m_sipTransport.GetIPEndPointsList()[0]; SIPHeader inviteHeader = new SIPHeader(fromHeader, toHeader, 1, CallProperties.CreateNewCallId()); inviteHeader.From.FromTag = CallProperties.CreateNewTag(); inviteHeader.Contact = SIPContactHeader.ParseContactHeader("sip:" + localSIPEndPoint.ToString()); inviteHeader.CSeqMethod = SIPMethodsEnum.INVITE; //inviteHeader.UnknownHeaders.Add("BlueFace-Test: 12324"); inviteRequest.Header = inviteHeader; SIPViaHeader viaHeader = new SIPViaHeader(localSIPEndPoint.Address.ToString(), localSIPEndPoint.Port, CallProperties.CreateBranchId()); inviteRequest.Header.Via.PushViaHeader(viaHeader); rtpPort = (rtpPort != 0) ? rtpPort : Crypto.GetRandomInt(10000, 20000); string sessionId = Crypto.GetRandomInt(1000, 5000).ToString(); if (body != null && body.Trim().Length > 0) { inviteRequest.Body = body; } else { inviteRequest.Body = "v=0" + CRLF + "o=- " + sessionId + " " + sessionId + " IN IP4 " + localSIPEndPoint.Address.ToString() + CRLF + "s=session" + CRLF + "c=IN IP4 " + localSIPEndPoint.Address.ToString() + CRLF + "t=0 0" + CRLF + "m=audio " + rtpPort + " RTP/AVP 0 101" + CRLF + "a=rtpmap:0 PCMU/8000" + CRLF + "a=rtpmap:101 telephone-event/8000" + CRLF + "a=fmtp:101 0-16" + CRLF + "a=sendrecv"; } inviteRequest.Header.ContentLength = inviteRequest.Body.Length; inviteRequest.Header.ContentType = "application/sdp"; return inviteRequest; }
private SIPRequest GetReferRequest(SIPEndPoint localSIPEndPoint, SIPURI referTo, ReplacesCallDescriptor sipReplacesCallDescriptor) { SIPRequest referRequest = new SIPRequest(SIPMethodsEnum.REFER, m_sipCallDescriptor.Uri); SIPFromHeader referFromHeader = SIPFromHeader.ParseFromHeader(m_sipCallDescriptor.From); SIPToHeader referToHeader = SIPToHeader.ParseToHeader(m_sipCallDescriptor.Uri); int cseq = ++CSeq; CallId = CallProperties.CreateNewCallId(); SIPHeader referHeader = new SIPHeader(referFromHeader, referToHeader, cseq, CallId); referHeader.CSeqMethod = SIPMethodsEnum.REFER; referRequest.Header = referHeader; referRequest.Header.Routes = RouteSet; referRequest.Header.ProxySendFrom = m_sipCallDescriptor.ProxySendFrom; if (sipReplacesCallDescriptor != null) { referTo.Headers.Set("Replaces", sipReplacesCallDescriptor.GetUrlEncodedReplacesUriHeader()); referRequest.Header.ReferTo = referTo.ToString(); } else { referRequest.Header.ReferTo = referTo.ToString(); } // "Requires" Header referRequest.Header.Require = (String.IsNullOrWhiteSpace(referRequest.Header.Require)) ? "replaces" : referRequest.Header.Require + ",replaces"; SIPViaHeader viaHeader = new SIPViaHeader(localSIPEndPoint, CallProperties.CreateBranchId()); referRequest.Header.Vias.PushViaHeader(viaHeader); return referRequest; }
private SIPRequest GetByeRequest(SIPResponse inviteResponse, SIPURI byeURI, SIPEndPoint localSIPEndPoint) { SIPRequest byeRequest = new SIPRequest(SIPMethodsEnum.BYE, byeURI); byeRequest.LocalSIPEndPoint = localSIPEndPoint; SIPFromHeader byeFromHeader = inviteResponse.Header.From; SIPToHeader byeToHeader = inviteResponse.Header.To; int cseq = inviteResponse.Header.CSeq + 1; SIPHeader byeHeader = new SIPHeader(byeFromHeader, byeToHeader, cseq, inviteResponse.Header.CallId); byeHeader.CSeqMethod = SIPMethodsEnum.BYE; byeHeader.ProxySendFrom = m_serverTransaction.TransactionRequest.Header.ProxySendFrom; byeRequest.Header = byeHeader; byeRequest.Header.Routes = (inviteResponse.Header.RecordRoutes != null) ? inviteResponse.Header.RecordRoutes.Reversed() : null; SIPViaHeader viaHeader = new SIPViaHeader(localSIPEndPoint, CallProperties.CreateBranchId()); byeRequest.Header.Vias.PushViaHeader(viaHeader); return byeRequest; }