[prev in list] [next in list] [prev in thread] [next in thread] 

List:       mina-commits
Subject:    svn commit: r985754 - in
From:       ngn () apache ! org
Date:       2010-08-15 20:55:35
Message-ID: 20100815205535.E68CA23889E3 () eris ! apache ! org
[Download RAW message or body]

Author: ngn
Date: Sun Aug 15 20:55:35 2010
New Revision: 985754

URL: http://svn.apache.org/viewvc?rev=985754&view=rev
Log:
Implement detection of over activity (VYSPER-234, by Bogdan Pistol)

Modified:
    mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContext.java
  mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandler.java
  mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContextTest.java


Modified: mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContext.java
                
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0124-xep0206- \
bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContext.java?rev=985754&r1=985753&r2=985754&view=diff
 ==============================================================================
--- mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContext.java \
                (original)
+++ mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContext.java \
Sun Aug 15 20:55:35 2010 @@ -30,6 +30,7 @@ import org.apache.vysper.xmpp.server.Abs
 import org.apache.vysper.xmpp.server.ServerRuntimeContext;
 import org.apache.vysper.xmpp.server.SessionState;
 import org.apache.vysper.xmpp.stanza.Stanza;
+import org.apache.vysper.xmpp.stanza.StanzaBuilder;
 import org.apache.vysper.xmpp.writer.StanzaWriter;
 import org.eclipse.jetty.continuation.Continuation;
 import org.eclipse.jetty.continuation.ContinuationListener;
@@ -149,11 +150,31 @@ public class BoshBackedSessionContext ex
         continuation.setAttribute("response", boshResponse);
         continuation.resume();
     }
+    
+    /**
+     * Writes an error to the client and closes the connection
+     * @param condition the error condition
+     */
+    synchronized public void error(String condition) {
+        if (!requestsWindow.isEmpty()) {
+            BoshRequest req = requestsWindow.remove(requestsWindow.firstKey());
+            Stanza stanza = boshHandler.getTerminateResponse();
+            stanza = boshHandler.addAttribute(stanza, "condition", condition);
+            BoshResponse boshResponse = getBoshResponse(stanza, null);
+            if (LOGGER.isDebugEnabled()) {
+                LOGGER.debug("BOSH writing response: {}", new \
String(boshResponse.getContent())); +            }
+            Continuation continuation = \
ContinuationSupport.getContinuation(req.getHttpServletRequest()); +            \
continuation.setAttribute("response", boshResponse); +            \
continuation.resume(); +        }
+        close();
+    }
 
     /*
      * Terminates the BOSH session
      */
-    public void close() {
+    synchronized public void close() {
         // respond to all the queued HTTP requests with empty responses
         while (!requestsWindow.isEmpty()) {
             write0(boshHandler.getEmptyResponse());
@@ -305,6 +326,12 @@ public class BoshBackedSessionContext ex
             // TODO: return the old response
             return;
         }
+        if (requestsWindow.size() + 1 > requests && \
!"terminate".equals(br.getBody().getAttributeValue("type")) +                && \
br.getBody().getAttributeValue("pause") == null) { +            // overactivity
+            error("policy-violation");
+            return;
+        }
         Continuation continuation = \
ContinuationSupport.getContinuation(br.getHttpServletRequest());  \
continuation.setTimeout(wait * 1000);  continuation.suspend();
@@ -357,7 +384,7 @@ public class BoshBackedSessionContext ex
 
     private BoshResponse getBoshResponse(Stanza stanza, Long ack) {
         if (ack != null) {
-            stanza = boshHandler.addAck(stanza, ack);
+            stanza = boshHandler.addAttribute(stanza, "ack", ack.toString());
         }
         byte[] content = new Renderer(stanza).getComplete().getBytes();
         return new BoshResponse(contentType, content);

Modified: mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandler.java
                
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0124-xep0206- \
bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandler.java?rev=985754&r1=985753&r2=985754&view=diff
 ==============================================================================
--- mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandler.java \
                (original)
+++ mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/main/java/org/apache/vysper/xmpp/extension/xep0124/BoshHandler.java \
Sun Aug 15 20:55:35 2010 @@ -275,18 +275,30 @@ public class BoshHandler {
         return wrapStanza(features);
     }
     
-    private Stanza getTerminateResponse() {
+    /**
+     * Creates a session termination BOSH response
+     * @return the termination BOSH body
+    */
+    public Stanza getTerminateResponse() {
         StanzaBuilder stanzaBuilder = new StanzaBuilder("body", \
NamespaceURIs.XEP0124_BOSH);  stanzaBuilder.addAttribute("type", "terminate");
         return stanzaBuilder.build();
     }
     
-    public Stanza addAck(Stanza stanza, Long ack) {
+    /**
+     * Adds a custom attribute to a BOSH body.
+     * 
+     * @param stanza the BOSH body
+     * @param attributeName the name of the attribute
+     * @param attributeValue the value of the attribute
+     * @return a new BOSH body identical with the one provided except it also has \
the newly added attribute +     */
+    public Stanza addAttribute(Stanza stanza, String attributeName, String \
                attributeValue) {
         StanzaBuilder stanzaBuilder = new StanzaBuilder("body", \
NamespaceURIs.XEP0124_BOSH);  for (Attribute attr : stanza.getAttributes()) {
             stanzaBuilder.addAttribute(attr);
         }
-        stanzaBuilder.addAttribute("ack", ack.toString());
+        stanzaBuilder.addAttribute(attributeName, attributeValue);
         for (XMLElement element : stanza.getInnerElements()) {
             stanzaBuilder.addPreparedElement(element);
         }

Modified: mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContextTest.java
                
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/extensions/xep0124-xep0206- \
bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContextTest.java?rev=985754&r1=985753&r2=985754&view=diff
 ==============================================================================
--- mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContextTest.java \
                (original)
+++ mina/vysper/trunk/server/extensions/xep0124-xep0206-bosh/src/test/java/org/apache/vysper/xmpp/extension/xep0124/BoshBackedSessionContextTest.java \
Sun Aug 15 20:55:35 2010 @@ -172,7 +172,7 @@ public class BoshBackedSessionContextTes
         continuation2.addContinuationListener(EasyMock.<ContinuationListener> \
anyObject());  
         Stanza body = new StanzaBuilder("body", NamespaceURIs.XEP0124_BOSH).build();
-        expect(boshHandler.addAck(eq(body), EasyMock.anyLong())).andReturn(body);
+        expect(boshHandler.addAttribute(eq(body), eq("ack"), \
Long.toString(EasyMock.anyLong()))).andReturn(body);  
         // write0
         Capture<BoshResponse> captured = new Capture<BoshResponse>();


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic