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.

Reply via email to