Revision: 10933
Author: pavel.slegr
Date: Tue Mar 23 13:01:25 2010
Log: Fixes Issue 1266
http://code.google.com/p/mobicents/source/detail?r=10933
Added:
/branches/jbcp/1.2/sip-servlets-release/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/b2bua/prack
/branches/jbcp/1.2/sip-servlets-release/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/b2bua/prack/CallForwardingB2BUAPrackTest.java
Modified:
/branches/jbcp/1.2/sip-servlets-release/sip-servlets-impl/src/main/java/org/mobicents/servlet/sip/core/dispatchers/SubsequentRequestDispatcher.java
/branches/jbcp/1.2/sip-servlets-release/sip-servlets-test-suite/applications/call-forwarding-b2bua-servlet/src/main/java/org/mobicents/servlet/sip/testsuite/CallForwardingB2BUASipServlet.java
/branches/jbcp/1.2/sip-servlets-release/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/AllTests.java
/branches/jbcp/1.2/sip-servlets-release/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/TestSipListener.java
=======================================
--- /dev/null
+++
/branches/jbcp/1.2/sip-servlets-release/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/b2bua/prack/CallForwardingB2BUAPrackTest.java
Tue Mar 23 13:01:25 2010
@@ -0,0 +1,145 @@
+/*
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.mobicents.servlet.sip.testsuite.b2bua.prack;
+
+import javax.sip.SipProvider;
+import javax.sip.address.SipURI;
+
+import org.apache.log4j.Logger;
+import org.mobicents.servlet.sip.SipServletTestCase;
+import org.mobicents.servlet.sip.testsuite.ProtocolObjects;
+import org.mobicents.servlet.sip.testsuite.TestSipListener;
+
+public class CallForwardingB2BUAPrackTest extends SipServletTestCase {
+
+ private static transient Logger logger =
Logger.getLogger(CallForwardingB2BUAPrackTest.class);
+
+ private static final String TRANSPORT = "udp";
+ private static final boolean AUTODIALOG = true;
+ private static final int TIMEOUT = 10000;
+// private static final int TIMEOUT = 100000000;
+
+ TestSipListener sender;
+ TestSipListener receiver;
+ ProtocolObjects senderProtocolObjects;
+ ProtocolObjects receiverProtocolObjects;
+
+ public CallForwardingB2BUAPrackTest(String name) {
+ super(name);
+ }
+
+ @Override
+ public void deployApplication() {
+ assertTrue(tomcat.deployContext(
+ projectHome
+ "/sip-servlets-test-suite/applications/call-forwarding-b2bua-servlet/src/main/sipapp",
+ "sip-test-context",
+ "sip-test"));
+ }
+
+ @Override
+ protected String getDarConfigurationFile() {
+ return "file:///"
+ + projectHome
+ +
"/sip-servlets-test-suite/testsuite/src/test/resources/"
+
+ "org/mobicents/servlet/sip/testsuite/callcontroller/call-forwarding-b2bua-servlet-dar.properties";
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+
+ senderProtocolObjects = new ProtocolObjects("forward-sender",
+ "gov.nist", TRANSPORT, AUTODIALOG, null);
+ receiverProtocolObjects = new ProtocolObjects("receiver",
+ "gov.nist", TRANSPORT, AUTODIALOG, null);
+
+ }
+
+ public void testCallForwardingCallerSendBye() throws Exception {
+ sender = new TestSipListener(5080, 5070, senderProtocolObjects,
true);
+ SipProvider senderProvider = sender.createProvider();
+
+ receiver = new TestSipListener(5090, 5070, receiverProtocolObjects,
false);
+ SipProvider receiverProvider = receiver.createProvider();
+
+ receiverProvider.addSipListener(receiver);
+ senderProvider.addSipListener(sender);
+
+ senderProtocolObjects.start();
+ receiverProtocolObjects.start();
+
+ String fromName = "forward-sender";
+ String fromSipAddress = "sip-servlets.com";
+ SipURI fromAddress =
senderProtocolObjects.addressFactory.createSipURI(
+ fromName, fromSipAddress);
+
+ String toSipAddress = "sip-servlets.com";
+ String toUser = "receiver";
+ SipURI toAddress =
senderProtocolObjects.addressFactory.createSipURI(
+ toUser, toSipAddress);
+
+ String[] headerNames = new String[]{"require"};
+ String[] headerValues = new String[]{"100rel"};
+
+ sender.sendSipRequest("INVITE", fromAddress, toAddress, null, null,
false, headerNames, headerValues);
+ Thread.sleep(TIMEOUT);
+ assertTrue(sender.getOkToByeReceived());
+ assertTrue(receiver.getByeReceived());
+ }
+
+ public void testCallForwardingCalleeSendBye() throws Exception {
+ sender = new TestSipListener(5080, 5070, senderProtocolObjects,
false);
+ SipProvider senderProvider = sender.createProvider();
+
+ receiver = new TestSipListener(5090, 5070, receiverProtocolObjects,
true);
+ SipProvider receiverProvider = receiver.createProvider();
+
+ receiverProvider.addSipListener(receiver);
+ senderProvider.addSipListener(sender);
+
+ senderProtocolObjects.start();
+ receiverProtocolObjects.start();
+
+ String fromName = "forward-sender";
+ String fromSipAddress = "sip-servlets.com";
+ SipURI fromAddress =
senderProtocolObjects.addressFactory.createSipURI(
+ fromName, fromSipAddress);
+
+ String toSipAddress = "sip-servlets.com";
+ String toUser = "receiver";
+ SipURI toAddress =
senderProtocolObjects.addressFactory.createSipURI(
+ toUser, toSipAddress);
+
+ String[] headerNames = new String[]{"require"};
+ String[] headerValues = new String[]{"100rel"};
+
+ sender.sendSipRequest("INVITE", fromAddress, toAddress, null, null,
false, headerNames, headerValues);
+ Thread.sleep(TIMEOUT);
+ assertTrue(receiver.getOkToByeReceived());
+ assertTrue(sender.getByeReceived());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ senderProtocolObjects.destroy();
+ receiverProtocolObjects.destroy();
+ logger.info("Test completed");
+ super.tearDown();
+ }
+
+
+}
=======================================
---
/branches/jbcp/1.2/sip-servlets-release/sip-servlets-impl/src/main/java/org/mobicents/servlet/sip/core/dispatchers/SubsequentRequestDispatcher.java
Fri Dec 4 01:50:12 2009
+++
/branches/jbcp/1.2/sip-servlets-release/sip-servlets-impl/src/main/java/org/mobicents/servlet/sip/core/dispatchers/SubsequentRequestDispatcher.java
Tue Mar 23 13:01:25 2010
@@ -268,7 +268,7 @@
final String requestMethod =
sipServletRequest.getMethod();
try {
-
sipSession.setSessionCreatingTransaction(sipServletRequest.getTransaction());
+
sipSession.addOngoingTransaction(sipServletRequest.getTransaction());
// JSR 289 Section 6.2.1 :
// any state transition caused by the reception
of a SIP message,
// the state change must be accomplished by the container before
calling
=======================================
---
/branches/jbcp/1.2/sip-servlets-release/sip-servlets-test-suite/applications/call-forwarding-b2bua-servlet/src/main/java/org/mobicents/servlet/sip/testsuite/CallForwardingB2BUASipServlet.java
Wed Jan 20 02:21:11 2010
+++
/branches/jbcp/1.2/sip-servlets-release/sip-servlets-test-suite/applications/call-forwarding-b2bua-servlet/src/main/java/org/mobicents/servlet/sip/testsuite/CallForwardingB2BUASipServlet.java
Tue Mar 23 13:01:25 2010
@@ -30,10 +30,12 @@
import javax.servlet.sip.SipErrorListener;
import javax.servlet.sip.SipFactory;
import javax.servlet.sip.SipServlet;
+import javax.servlet.sip.SipServletMessage;
import javax.servlet.sip.SipServletRequest;
import javax.servlet.sip.SipServletResponse;
import javax.servlet.sip.SipSession;
import javax.servlet.sip.SipURI;
+import javax.servlet.sip.UAMode;
import javax.sip.header.ContactHeader;
import org.apache.log4j.Logger;
@@ -225,6 +227,48 @@
}
}
}
+
+ @Override
+ protected void doUpdate(SipServletRequest request) throws
ServletException,
+ IOException {
+ if(logger.isInfoEnabled()) {
+ logger.info("Got UPDATE: " + request.toString());
+ }
+ B2buaHelper helper = request.getB2buaHelper();
+ SipSession peerSession =
helper.getLinkedSession(request.getSession());
+ SipServletRequest update = helper.createRequest(peerSession,
request, null);
+ update.send();
+ }
+
+ @Override
+ protected void doPrack(SipServletRequest req) throws ServletException,
+ IOException {
+
+ B2buaHelper helper = req.getB2buaHelper();
+ SipSession peerSession = helper.getLinkedSession(req.getSession());
+ List<SipServletMessage> pendingMessages =
helper.getPendingMessages(peerSession, UAMode.UAC);
+ SipServletResponse invitePendingResponse = null;
+ logger.info("pending messages : ");
+ for(SipServletMessage pendingMessage : pendingMessages) {
+ logger.info("\t pending message : " + pendingMessage);
+ if(((SipServletResponse)pendingMessage).getStatus() > 100) {
+ invitePendingResponse =
(SipServletResponse)pendingMessage;
+ break;
+ }
+ }
+ SipServletResponse inviteResponse = (SipServletResponse)
invitePendingResponse;
+ SipServletRequest prack = inviteResponse.createPrack();
+ String[] forwardingUri =
forwardingUris.get(prack.getFrom().getURI().toString());
+ SipFactory sipFactory = (SipFactory)
getServletContext().getAttribute(
+ SIP_FACTORY);
+ SipURI sipUri = (SipURI) sipFactory.createURI(forwardingUri[1]);
+ prack.setRequestURI(sipUri);
+ prack.send();
+
+ if(logger.isTraceEnabled()) {
+ logger.trace("[Send " + prack.getMethod() + " Request]:" +
prack);
+ }
+ }
@Override
protected void doSuccessResponse(SipServletResponse sipServletResponse)
@@ -234,18 +278,39 @@
SipSession originalSession =
sipServletResponse.getRequest().getB2buaHelper().getLinkedSession(sipServletResponse.getSession());
String cSeqValue = sipServletResponse.getHeader("CSeq");
+ if ("PRACK".equals(sipServletResponse.getMethod())) {
+ List<SipServletMessage> pendingMessages =
sipServletResponse.getRequest().getB2buaHelper().getPendingMessages(originalSession,
UAMode.UAS);
+ SipServletRequest prackPendingMessage =null;
+ logger.info("pending messages : ");
+ for(SipServletMessage pendingMessage : pendingMessages) {
+ logger.info("\t pending message : " + pendingMessage);
+ if(((SipServletRequest)
pendingMessage).getMethod().equals("PRACK")) {
+ prackPendingMessage = (SipServletRequest)
pendingMessage;
+ break;
+ }
+ }
+
prackPendingMessage.createResponse(sipServletResponse.getStatus()).send();
+ return;
+ }
//if this is a response to an INVITE we ack it and forward the
OK
- if(originalSession!= null && cSeqValue.indexOf("INVITE") != -1)
{
- SipServletRequest ackRequest =
sipServletResponse.createAck();
- logger.info("Sending " + ackRequest);
- ackRequest.send();
+ if(originalSession!= null && cSeqValue.indexOf("INVITE") != -1)
{
//create and sends OK for the first call leg
- SipServletRequest originalRequest = (SipServletRequest)
sipServletResponse.getSession().getAttribute("originalRequest");
- SipServletResponse responseToOriginalRequest =
originalRequest.createResponse(sipServletResponse.getStatus());
- logger.info("Sending OK on 1st call leg" +
responseToOriginalRequest);
-
responseToOriginalRequest.setContentLength(sipServletResponse.getContentLength());
- //responseToOriginalRequest.setContent(sipServletResponse.getContent(),
sipServletResponse.getContentType());
- responseToOriginalRequest.send();
+ SipServletRequest originalRequest = (SipServletRequest)
sipServletResponse.getSession().getAttribute("originalRequest");
+ if(originalRequest.getHeader("Require") == null) {
+ // we send the ACK directly only in non PRACK
scenario
+ SipServletRequest ackRequest =
sipServletResponse.createAck();
+ logger.info("Sending " + ackRequest);
+ ackRequest.send();
+ SipServletResponse responseToOriginalRequest =
originalRequest.createResponse(sipServletResponse.getStatus());
+ logger.info("Sending OK on 1st call leg" +
responseToOriginalRequest);
+
responseToOriginalRequest.setContentLength(sipServletResponse.getContentLength());
+
//responseToOriginalRequest.setContent(sipServletResponse.getContent(),
sipServletResponse.getContentType());
+ responseToOriginalRequest.send();
+ } else {
+ SipSession peerSession =
sipServletResponse.getRequest().getB2buaHelper().getLinkedSession(sipServletResponse.getSession());
+ SipServletResponse responseToOriginalRequest =
sipServletResponse.getRequest().getB2buaHelper().createResponseToOriginalRequest(peerSession,
sipServletResponse.getStatus(), sipServletResponse.getReasonPhrase());
+ responseToOriginalRequest.send();
+ }
}
}
@@ -284,6 +349,21 @@
}
}
}
+
+ @Override
+ protected void doProvisionalResponse(SipServletResponse
sipServletResponse)
+ throws ServletException, IOException {
+ SipServletRequest originalRequest = (SipServletRequest)
sipServletResponse.getSession().getAttribute("originalRequest");
+ SipServletResponse responseToOriginalRequest =
originalRequest.createResponse(sipServletResponse.getStatus());
+ if(logger.isInfoEnabled()) {
+ logger.info("Sending on the first call leg " +
responseToOriginalRequest.toString());
+ }
+ if(sipServletResponse.getHeader("Require") != null) {
+ responseToOriginalRequest.sendReliably();
+ } else {
+ responseToOriginalRequest.send();
+ }
+ }
// SipErrorListener methods
/**
=======================================
---
/branches/jbcp/1.2/sip-servlets-release/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/AllTests.java
Fri Dec 4 02:00:26 2009
+++
/branches/jbcp/1.2/sip-servlets-release/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/AllTests.java
Tue Mar 23 13:01:25 2010
@@ -25,6 +25,7 @@
import org.mobicents.servlet.sip.testsuite.annotations.AnnotationTest;
import org.mobicents.servlet.sip.testsuite.b2bua.B2BUASipUnitTest;
import org.mobicents.servlet.sip.testsuite.b2bua.B2BUATcpUdpTest;
+import
org.mobicents.servlet.sip.testsuite.b2bua.prack.CallForwardingB2BUAPrackTest;
import org.mobicents.servlet.sip.testsuite.callcontroller.CallBlockingTest;
import
org.mobicents.servlet.sip.testsuite.callcontroller.CallControllerCancelTest;
import
org.mobicents.servlet.sip.testsuite.callcontroller.CallControllerJunitTest;
@@ -125,6 +126,7 @@
suite.addTestSuite(ProxyPrackTest.class);
suite.addTestSuite(ShootmePrackSipServletTest.class);
suite.addTestSuite(ShootistPrackSipServletTest.class);
+ suite.addTestSuite(CallForwardingB2BUAPrackTest.class);
suite.addTestSuite(ConcurrentyControlSipSessionIsolationTest.class);
suite.addTestSuite(CongestionControlTest.class);
suite.addTestSuite(ProxyBranchTimeoutTest.class);
=======================================
---
/branches/jbcp/1.2/sip-servlets-release/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/TestSipListener.java
Wed Jan 20 05:13:42 2010
+++
/branches/jbcp/1.2/sip-servlets-release/sip-servlets-test-suite/testsuite/src/test/java/org/mobicents/servlet/sip/testsuite/TestSipListener.java
Tue Mar 23 13:01:25 2010
@@ -1379,13 +1379,15 @@
System.out
.println("INVITE AUTHORIZATION
sent:\n" + authrequest);
} 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;
+ if(!prackSent) {
+ 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;
+ }
}
}
/**
To unsubscribe from this group, send email to
mobicents-commits+unsubscribegooglegroups.com or reply to this email with the words
"REMOVE ME" as the subject.