use of javax.sip.address.SipURI in project load-balancer by RestComm.
the class TestSipListener method sendInDialogSipRequest.
/**
* @param transport TODO
* @param messageToSend
* @throws SipException
* @throws InvalidArgumentException
* @throws ParseException
*/
public void sendInDialogSipRequest(String method, String content, String contentType, String subContentType, List<Header> headers, String transport) throws SipException, InvalidArgumentException, ParseException {
Request message = dialog.createRequest(method);
if (transport != null) {
((SipURI) message.getRequestURI()).setTransportParam(transport);
}
if (content != null) {
ContentLengthHeader contentLengthHeader = protocolObjects.headerFactory.createContentLengthHeader(content.length());
ContentTypeHeader contentTypeHeader = protocolObjects.headerFactory.createContentTypeHeader(contentType, subContentType);
message.setContentLength(contentLengthHeader);
message.setContent(content, contentTypeHeader);
}
if (headers != null) {
for (Header header : headers) {
message.addHeader(header);
}
}
addSpecificHeaders(method, message);
message.removeHeader(ViaHeader.NAME);
ClientTransaction clientTransaction = sipProvider.getNewClientTransaction(message);
if (method.equals("INVITE")) {
inviteClientTid = clientTransaction;
}
dialog.sendRequest(clientTransaction);
}
use of javax.sip.address.SipURI in project load-balancer by RestComm.
the class TestSipListener method processResponse.
public void processResponse(ResponseEvent responseReceivedEvent) {
if (abortProcessing) {
logger.error("Processing aborted");
return;
}
Response response = (Response) responseReceivedEvent.getResponse();
System.out.println("Process response : " + response);
eventListener.uacAfterResponse(response.getStatusCode(), appServer);
if (response.getStatusCode() == 491)
numberOf491s++;
RecordRouteHeader recordRouteHeader = (RecordRouteHeader) response.getHeader(RecordRouteHeader.NAME);
ContactHeader contactHeader = (ContactHeader) response.getHeader(ContactHeader.NAME);
if (contactHeader != null && "0.0.0.0".equals(((SipURI) contactHeader.getAddress().getURI()).getHost())) {
abortProcessing = true;
throw new IllegalArgumentException("we received a contact header with 0.0.0.0 in a response !");
}
if (response.getStatusCode() >= 400 && response.getStatusCode() < 999) {
this.serverErrorReceived = true;
}
if (response.getStatusCode() == 503) {
this.serviceUnavailableReceived = true;
}
if (response.toString().toLowerCase().contains("info")) {
lastInfoResponseTime = System.currentTimeMillis();
}
ClientTransaction tid = responseReceivedEvent.getClientTransaction();
CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
logger.info("Response received : Status Code = " + response.getStatusCode() + " " + cseq);
// not dropping in PRACK case on REINVITE the ClientTx can be null it seems
if (tid == null && !prackSent) {
if (countRetrans) {
nbRetrans++;
}
logger.info("Stray response -- dropping ");
return;
}
if (tid != null) {
logger.info("transaction state is " + tid.getState());
logger.info("Dialog = " + tid.getDialog());
if (tid.getDialog() != null) {
logger.info("Dialog State is " + tid.getDialog().getState());
}
}
try {
if (response.getStatusCode() > 100 && response.getStatusCode() < 200) {
informationalResponse = response;
}
if (response.getStatusCode() >= 200 && response.getStatusCode() < 700) {
logger.info("final response received : status code " + response.getStatusCode());
finalResponseReceived = true;
setFinalResponseStatus(response.getStatusCode());
setFinalResponse(response);
}
if (response.getStatusCode() == Response.OK) {
if (cseq.getMethod().equals(Request.INVITE) && sendAck) {
inviteOkResponse = response;
@SuppressWarnings("deprecation") Request ackRequest = responseReceivedEvent.getClientTransaction().createAck();
if (useToURIasRequestUri) {
ackRequest.setRequestURI(requestURI);
}
if (timeToWaitBeforeAck > 0) {
Thread.sleep(timeToWaitBeforeAck);
}
if (!sendSubsequentRequestsThroughSipProvider && tid.getDialog() != null) {
tid.getDialog().sendAck(ackRequest);
} else {
sipProvider.sendRequest(ackRequest);
}
ackSent = true;
// If the caller is supposed to send the bye
if (sendReinvite && !reinviteSent) {
List<Header> headers = new ArrayList<Header>();
Header reinviteHeader = protocolObjects.headerFactory.createHeader("ReInvite", "true");
headers.add(reinviteHeader);
if (prackSent) {
headers.add(protocolObjects.headerFactory.createHeader(RequireHeader.NAME, "100rel"));
}
sendInDialogSipRequest("INVITE", null, null, null, headers, null);
reinviteSent = true;
return;
}
if (sendBye) {
// Thread.sleep(30000);
sendBye();
}
if (sendByeAfterTerminatingNotify) {
tid.getDialog().terminateOnBye(false);
}
} else if (cseq.getMethod().equals(Request.BYE)) {
okToByeReceived = true;
} else if (cseq.getMethod().equals(Request.CANCEL)) {
this.cancelOkReceived = true;
// if (tid.getDialog().getState() == DialogState.CONFIRMED) {
// // oops cancel went in too late. Need to hang up the
// // dialog.
// logger.info("Sending BYE -- cancel went in too late !!");
// Request byeRequest = dialog.createRequest(Request.BYE);
// ClientTransaction ct = sipProvider
// .getNewClientTransaction(byeRequest);
// tid.getDialog().sendRequest(ct);
// }
} else if (cseq.getMethod().equals(Request.PUBLISH)) {
SIPETagHeader sipTagHeader = (SIPETagHeader) response.getHeader(SIPETag.NAME);
sipETag = sipTagHeader.getETag();
} else if (cseq.getMethod().equals(Request.PRACK)) {
okToPrackReceived = true;
}
} else if (response.getStatusCode() == Response.MOVED_TEMPORARILY) {
// Dialog dies as soon as you get an error response.
if (cseq.getMethod().equals(Request.INVITE)) {
// lookup the contact header
ContactHeader contHdr = (ContactHeader) response.getHeader(ContactHeader.NAME);
// we can re-use the from header
FromHeader from = ((FromHeader) response.getHeader(FromHeader.NAME));
// we use the to-address, but without the tag
ToHeader to = (ToHeader) (response.getHeader(ToHeader.NAME)).clone();
to.removeParameter("tag");
// the call-id can be re-used
CallIdHeader callID = ((CallIdHeader) response.getHeader(CallIdHeader.NAME));
// we take the next cseq
long seqNo = (((CSeqHeader) response.getHeader(CSeqHeader.NAME)).getSeqNumber());
logger.info("seqNo = " + seqNo);
CSeqHeader cseqNew = protocolObjects.headerFactory.createCSeqHeader(++seqNo, "INVITE");
// Create ViaHeaders (either use tcp or udp)
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
ViaHeader viaHeader = null;
if (!isIpv6)
viaHeader = protocolObjects.headerFactory.createViaHeader("127.0.0.1", sipProvider.getListeningPoint(protocolObjects.transport).getPort(), protocolObjects.transport, null);
else
viaHeader = protocolObjects.headerFactory.createViaHeader("::1", sipProvider.getListeningPoint(protocolObjects.transport).getPort(), protocolObjects.transport, null);
// add via headers
viaHeaders.add(viaHeader);
// create max forwards
MaxForwardsHeader maxForwardsHeader = protocolObjects.headerFactory.createMaxForwardsHeader(10);
// create invite Request
SipURI newUri = (SipURI) this.requestURI.clone();
newUri.setParameter("redirection", "true");
requestURI = newUri;
Request invRequest = protocolObjects.messageFactory.createRequest(newUri, "INVITE", callID, cseqNew, from, to, viaHeaders, maxForwardsHeader);
// we set the Request URI to the address given
SipURI contactURI = protocolObjects.addressFactory.createSipURI(null, this.listeningPoint.getIPAddress());
contactURI.setPort(this.listeningPoint.getPort());
contactURI.setTransportParam(protocolObjects.transport);
Address address = protocolObjects.addressFactory.createAddress(contactURI);
ContactHeader contact = protocolObjects.headerFactory.createContactHeader(address);
invRequest.addHeader(contact);
// the contacat header in the response contains where to redirect
// the request to -- which in this case happens to be back to the
// same location.
ContactHeader chdr = (ContactHeader) response.getHeader(ContactHeader.NAME);
SipURI sipUri = (SipURI) chdr.getAddress().getURI();
// sipUri.setLrParam();
RouteHeader routeHeader = protocolObjects.headerFactory.createRouteHeader(chdr.getAddress());
invRequest.addHeader(routeHeader);
invRequest.setRequestURI(sipUri);
logger.info("Sending INVITE to " + contHdr.getAddress().getURI().toString());
inviteClientTid = sipProvider.getNewClientTransaction(invRequest);
logger.info("New TID = " + inviteClientTid);
inviteClientTid.sendRequest();
logger.info("sendReqeust succeeded " + inviteClientTid);
Dialog dialog = inviteClientTid.getDialog();
this.dialogCount++;
this.dialog = dialog;
}
} else if (response.getStatusCode() == Response.REQUEST_TERMINATED) {
if (cseq.getMethod().equals(Request.INVITE)) {
this.requestTerminatedReceived = true;
}
} else if (response.getStatusCode() == Response.RINGING && sendUpdateOn180) {
Request updateRequest = dialog.createRequest(Request.UPDATE);
ClientTransaction ct = sipProvider.getNewClientTransaction(updateRequest);
dialog.sendRequest(ct);
} else if (response.getStatusCode() > Response.TRYING && response.getStatusCode() < Response.OK) {
RequireHeader requireHeader = (RequireHeader) response.getHeader(RequireHeader.NAME);
if (requireHeader != null && "100rel".equalsIgnoreCase(requireHeader.getOptionTag().trim())) {
Request prack = dialog.createPrack(response);
ClientTransaction ct = sipProvider.getNewClientTransaction(prack);
dialog.sendRequest(ct);
prackSent = true;
}
}
/**
* end of modified code
*/
} catch (Exception ex) {
logger.error("An unexpected exception occured while processing the response", ex);
}
}
use of javax.sip.address.SipURI in project load-balancer by RestComm.
the class TestSipListener method createInvite.
public Request createInvite(String callId, long cseq) throws ParseException, InvalidArgumentException {
String fromName = "BigGuy";
String fromSipAddress = "here.com";
String fromDisplayName = "The Master Blaster";
String toSipAddress = "there.com";
String toUser = "LittleGuy";
String toDisplayName = "The Little Blister";
// create >From Header
SipURI fromAddress = protocolObjects.addressFactory.createSipURI(fromName, fromSipAddress);
Address fromNameAddress = protocolObjects.addressFactory.createAddress(fromAddress);
fromNameAddress.setDisplayName(fromDisplayName);
FromHeader fromHeader = protocolObjects.headerFactory.createFromHeader(fromNameAddress, "12345");
// create To Header
SipURI toAddress = protocolObjects.addressFactory.createSipURI(toUser, toSipAddress);
Address toNameAddress = protocolObjects.addressFactory.createAddress(toAddress);
toNameAddress.setDisplayName(toDisplayName);
ToHeader toHeader = protocolObjects.headerFactory.createToHeader(toNameAddress, null);
// create Request URI
SipURI requestURI = protocolObjects.addressFactory.createSipURI(toUser, peerHostPort);
// Create ViaHeaders
ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
ViaHeader viaHeader = null;
if (!isIpv6)
viaHeader = protocolObjects.headerFactory.createViaHeader("127.0.0.1", listeningPoint.getPort(), listeningPoint.getTransport(), null);
else
viaHeader = protocolObjects.headerFactory.createViaHeader("::1", listeningPoint.getPort(), listeningPoint.getTransport(), null);
// add via headers
viaHeaders.add(viaHeader);
// Create ContentTypeHeader
ContentTypeHeader contentTypeHeader = protocolObjects.headerFactory.createContentTypeHeader("application", "sdp");
// Create a new CallId header
CallIdHeader callIdHeader;
callIdHeader = sipProvider.getNewCallId();
if (callId.trim().length() > 0)
callIdHeader.setCallId(callId);
// Create a new Cseq header
CSeqHeader cSeqHeader = protocolObjects.headerFactory.createCSeqHeader(cseq, Request.INVITE);
// Create a new MaxForwardsHeader
MaxForwardsHeader maxForwards = protocolObjects.headerFactory.createMaxForwardsHeader(70);
// Create the request.
Request request = protocolObjects.messageFactory.createRequest(requestURI, Request.INVITE, callIdHeader, cSeqHeader, fromHeader, toHeader, viaHeaders, maxForwards);
// Create contact headers
String host = null;
if (!isIpv6)
host = "127.0.0.1";
else
host = "::1";
SipURI contactUrl = protocolObjects.addressFactory.createSipURI(fromName, host);
contactUrl.setPort(listeningPoint.getPort());
// Create the contact name address.
SipURI contactURI = protocolObjects.addressFactory.createSipURI(fromName, host);
contactURI.setPort(listeningPoint.getPort());
Address contactAddress = protocolObjects.addressFactory.createAddress(contactURI);
// Add the contact address.
contactAddress.setDisplayName(fromName);
contactHeader = protocolObjects.headerFactory.createContactHeader(contactAddress);
request.addHeader(contactHeader);
String sdpData = "v=0\r\n" + "o=4855 13760799956958020 13760799956958020" + " IN IP4 129.6.55.78\r\n" + "s=mysession session\r\n" + "p=+46 8 52018010\r\n" + "c=IN IP4 129.6.55.78\r\n" + "t=0 0\r\n" + "m=audio 6022 RTP/AVP 0 4 18\r\n" + "a=rtpmap:0 PCMU/8000\r\n" + "a=rtpmap:4 G723/8000\r\n" + "a=rtpmap:18 G729A/8000\r\n" + "a=ptime:20\r\n";
byte[] contents = sdpData.getBytes();
request.setContent(contents, contentTypeHeader);
Header callInfoHeader = protocolObjects.headerFactory.createHeader("Call-Info", "<http://www.antd.nist.gov>");
request.addHeader(callInfoHeader);
return request;
}
use of javax.sip.address.SipURI in project load-balancer by RestComm.
the class HeaderConsistentHashAlgorithmTest method testOKRingingLandOnDifferentNode.
@Test
public void testOKRingingLandOnDifferentNode() throws Exception {
EventListener failureEventListener = new EventListener() {
@Override
public void uasAfterResponse(int statusCode, AppServer source) {
}
@Override
public void uasAfterRequestReceived(String method, AppServer source) {
// TODO Auto-generated method stub
}
@Override
public void uacAfterRequestSent(String method, AppServer source) {
// TODO Auto-generated method stub
}
@Override
public void uacAfterResponse(int statusCode, AppServer source) {
if (statusCode == 180) {
ringingAppServer = source;
// source.sendCleanShutdownToBalancers();
source.stop();
} else {
okAppServer = source;
}
}
};
for (AppServer as : servers) as.setEventListener(failureEventListener);
shootist.callerSendsBye = true;
String fromName = "sender";
String fromHost = "sip-servlets.com";
SipURI fromAddress = servers[0].protocolObjects.addressFactory.createSipURI(fromName, fromHost);
String toUser = "replaces";
String toHost = "sip-servlets.com";
SipURI toAddress = servers[0].protocolObjects.addressFactory.createSipURI(toUser, toHost);
SipURI ruri = servers[0].protocolObjects.addressFactory.createSipURI("usera", "127.0.0.1:5033");
ruri.setLrParam();
SipURI route = servers[0].protocolObjects.addressFactory.createSipURI("lbint", "127.0.0.1:5065");
route.setParameter("node_host", "127.0.0.1");
route.setParameter("node_port", "4060");
route.setLrParam();
shootist.start();
// servers[0].sipListener.sendSipRequest("INVITE", fromAddress, toAddress, null, null, false);
servers[0].sipListener.sendSipRequest("INVITE", fromAddress, toAddress, null, route, false, null, null, ruri);
Thread.sleep(20000);
assertTrue(shootist.inviteRequest.getHeader(RecordRouteHeader.NAME).toString().contains("node_host"));
assertNotSame(ringingAppServer, okAppServer);
assertNotNull(ringingAppServer);
assertNotNull(okAppServer);
}
use of javax.sip.address.SipURI in project load-balancer by RestComm.
the class BTBUATest method testBackToBackUserAgent.
// test back to back use agent
@Test
public void testBackToBackUserAgent() throws Exception {
boolean wasRinging = false;
boolean wasOk = false;
boolean wasInvite = false;
boolean wasAck = false;
boolean wasBye = false;
shootist2.start();
shootist1.start();
shootist1.callerSendsBye = true;
SipURI route = shootist1.addressFactory.createSipURI("lbint", "127.0.0.1:5060");
route.setLrParam();
shootist1.sendInitial(Request.INVITE, shootist1.headerFactory.createRouteHeader(shootist1.addressFactory.createAddress(route)));
Thread.sleep(9000);
shootist1.sendBye();
Thread.sleep(2000);
for (Response res : shootist1.responses) {
if (res.getStatusCode() == Response.RINGING)
wasRinging = true;
if (res.getStatusCode() == Response.OK)
wasOk = true;
}
for (Request req : shootist2.requests) {
if (req.getMethod().equals(Request.INVITE))
wasInvite = true;
if (req.getMethod().equals(Request.ACK))
wasAck = true;
if (req.getMethod().equals(Request.BYE))
wasBye = true;
}
assertEquals(3, shootist2.requests.size());
assertTrue(wasOk);
assertTrue(wasRinging);
assertTrue(wasInvite);
assertTrue(wasAck);
assertTrue(wasBye);
}
Aggregations