You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by mw...@apache.org on 2009/11/20 05:52:23 UTC

svn commit: r882412 - in /mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy: SpdyServer.java handler/AbstractSpdyHandler.java handler/SpdyHandler.java messages/AbstractSpdyFrame.java

Author: mwebb
Date: Fri Nov 20 04:52:22 2009
New Revision: 882412

URL: http://svn.apache.org/viewvc?rev=882412&view=rev
Log:
Made some changes to the server and handler classes.

Added:
    mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/handler/AbstractSpdyHandler.java
Modified:
    mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/SpdyServer.java
    mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/handler/SpdyHandler.java
    mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/messages/AbstractSpdyFrame.java

Modified: mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/SpdyServer.java
URL: http://svn.apache.org/viewvc/mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/SpdyServer.java?rev=882412&r1=882411&r2=882412&view=diff
==============================================================================
--- mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/SpdyServer.java (original)
+++ mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/SpdyServer.java Fri Nov 20 04:52:22 2009
@@ -11,6 +11,12 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * Just a simple, developer-level testing server for the SPDY protocol.
+ *
+ * @author @author <a href="http://mina.apache.org">Apache MINA Project</a>
+ * @version $Rev$, $Date$
+ */
 public class SpdyServer {
 
 	public static final int PORT = 6666;

Added: mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/handler/AbstractSpdyHandler.java
URL: http://svn.apache.org/viewvc/mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/handler/AbstractSpdyHandler.java?rev=882412&view=auto
==============================================================================
--- mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/handler/AbstractSpdyHandler.java (added)
+++ mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/handler/AbstractSpdyHandler.java Fri Nov 20 04:52:22 2009
@@ -0,0 +1,129 @@
+package org.apache.mina.spdy.handler;
+
+
+import org.apache.mina.core.service.IoHandler;
+import org.apache.mina.core.session.IoSession;
+import org.apache.mina.spdy.messages.AbstractSpdyFrame;
+import org.apache.mina.spdy.messages.control.AbstractSpdyControlFrame;
+import org.apache.mina.spdy.messages.control.FinStreamControlFrame;
+import org.apache.mina.spdy.messages.control.GoAwayControlFrame;
+import org.apache.mina.spdy.messages.control.HelloControlFrame;
+import org.apache.mina.spdy.messages.control.NoopControlFrame;
+import org.apache.mina.spdy.messages.control.PingControlFrame;
+import org.apache.mina.spdy.messages.control.SubresourceControlFrame;
+import org.apache.mina.spdy.messages.control.SynReplyControlFrame;
+import org.apache.mina.spdy.messages.control.SynStreamControlFrame;
+import org.apache.mina.spdy.messages.data.SpdyDataFrame;
+
+
+/**
+ * This method extends the functionality of the {@link IoHandler} class.  It 
+ * contains its own abstract methods that must be overridden in order to 
+ * properly handle SPDY frames that this class will receive.
+ *
+ * @author @author <a href="http://mina.apache.org">Apache MINA Project</a>
+ * @version $Rev$, $Date$
+ */
+public abstract class AbstractSpdyHandler implements IoHandler
+{
+
+    /**
+     * This method will receive the SPDY frames and determine which method to send
+     * the data to.
+     * 
+     * @see org.apache.mina.core.service.IoHandler#messageReceived(org.apache.mina.core.session.IoSession, java.lang.Object)
+     */
+    public void messageReceived( IoSession session, Object message ) throws Exception
+    {
+        /*
+         * How best to do this?  I do not want to cast and use the 
+         * instanceof operator any more than I have to.  I believe that 
+         * most of the objects received in this method will be data frames,
+         * one cast is not bad to get to where we need to be.
+         */
+        
+        AbstractSpdyFrame frame = (AbstractSpdyFrame)message;
+        int bit = frame.getBit();
+        
+        if( bit == AbstractSpdyFrame.FRAME_CONTROL_BIT ){
+            
+            AbstractSpdyControlFrame control = (AbstractSpdyControlFrame)message;
+            int type = control.getType();
+            
+            switch( type ){
+                case AbstractSpdyControlFrame.CONTROL_TYPE_SYN_STREAM:
+                    handleSynStream( session, (SynStreamControlFrame)message );
+                    break;
+                    
+                case AbstractSpdyControlFrame.CONTROL_TYPE_SYN_REPLY:
+                    handleSynReply( session, (SynReplyControlFrame)message );
+                    break;
+                    
+                case AbstractSpdyControlFrame.CONTROL_TYPE_FIN_STREAM:
+                    handleFinStream( session, (FinStreamControlFrame)message );
+                    break;
+                    
+                case AbstractSpdyControlFrame.CONTROL_TYPE_HELLO:
+                    handleHello( session, (HelloControlFrame)message );
+                    break;
+                    
+                case AbstractSpdyControlFrame.CONTROL_TYPE_NOOP:
+                    handleNoop( session, (NoopControlFrame)message );
+                    break;
+                    
+                case AbstractSpdyControlFrame.CONTROL_TYPE_PING:
+                    handlePing( session, (PingControlFrame)message );
+                    break;
+                    
+                case AbstractSpdyControlFrame.CONTROL_TYPE_GOAWAY:
+                    handleGoAway( session, (GoAwayControlFrame)message );
+                    break;
+                    
+                case AbstractSpdyControlFrame.CONTROL_TYPE_SUBRESOURCE:
+                    handleSubresource( session, (SubresourceControlFrame)message );
+                    break;
+            }
+            
+        } else {
+            
+            handleDataFrame( (SpdyDataFrame)message );
+        }
+    }
+
+    /**
+     * Its a NOOP message.  We don't have to do anything.
+     *
+     * @param session
+     *  The session that received the NOOP
+     * @param noop
+     *  The NOOP message
+     */
+    public void handleNoop( IoSession session, NoopControlFrame noop )
+    {
+        // do nothing, its a noop
+    }
+
+    
+    /**
+     * As per specification, pings should be sent back to the other side 
+     * of the connection ASAP.  We will just go ahead and implement that 
+     * here.
+     *
+     * @param session
+     *  The session that received the ping and will send the response
+     * @param ping
+     *  The frame object we received.
+     */
+    public void handlePing( IoSession session, PingControlFrame ping )
+    {
+        session.write( ping.frameToIoBuffer() );
+    }
+    
+    public abstract void handleFinStream( IoSession session, FinStreamControlFrame message );
+    public abstract void handleDataFrame( SpdyDataFrame message );
+    public abstract void handleSubresource( IoSession session, SubresourceControlFrame message );
+    public abstract void handleGoAway( IoSession session, GoAwayControlFrame message );
+    public abstract void handleSynReply( IoSession session, SynReplyControlFrame message );
+    public abstract void handleSynStream( IoSession session, SynStreamControlFrame message );
+    public abstract void handleHello( IoSession session, HelloControlFrame hello );
+}

Modified: mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/handler/SpdyHandler.java
URL: http://svn.apache.org/viewvc/mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/handler/SpdyHandler.java?rev=882412&r1=882411&r2=882412&view=diff
==============================================================================
--- mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/handler/SpdyHandler.java (original)
+++ mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/handler/SpdyHandler.java Fri Nov 20 04:52:22 2009
@@ -1,53 +1,103 @@
 package org.apache.mina.spdy.handler;
 
+import java.io.File;
 import java.io.FileOutputStream;
 
-import org.apache.mina.core.service.IoHandler;
 import org.apache.mina.core.session.IdleStatus;
 import org.apache.mina.core.session.IoSession;
+import org.apache.mina.spdy.messages.control.FinStreamControlFrame;
+import org.apache.mina.spdy.messages.control.GoAwayControlFrame;
+import org.apache.mina.spdy.messages.control.HelloControlFrame;
+import org.apache.mina.spdy.messages.control.SubresourceControlFrame;
+import org.apache.mina.spdy.messages.control.SynReplyControlFrame;
+import org.apache.mina.spdy.messages.control.SynStreamControlFrame;
 import org.apache.mina.spdy.messages.data.SpdyDataFrame;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class SpdyHandler implements IoHandler {
+public class SpdyHandler extends AbstractSpdyHandler {
 
 	private static final Logger log = LoggerFactory.getLogger(SpdyHandler.class);
-	
-	public void exceptionCaught(IoSession session, Throwable cause)
-			throws Exception {
-		
-		cause.printStackTrace();
-	}
-
-	public void messageReceived(IoSession session, Object message)
-			throws Exception {
-		
-		log.info("Received message ==> " + message.getClass());
-	}
-
-	public void messageSent(IoSession session, Object message) throws Exception {
-		
-		log.info("Message sent");
-	}
-
-	public void sessionClosed(IoSession session) throws Exception {
-		
-		log.info("Session closed.");
-	}
-
-	public void sessionCreated(IoSession session) throws Exception {
-
-		log.info("Session created.");
-	}
-
-	public void sessionIdle(IoSession session, IdleStatus status)
-			throws Exception {
-			
-		log.info("Session Idle.");
-	}
 
-	public void sessionOpened(IoSession session) throws Exception {
-
-		log.info("Session Opened");
-	}
+    @Override
+    public void handleDataFrame( SpdyDataFrame message )
+    {
+        log.info( "Received data frame" );
+        try{
+            File file = File.createTempFile( "recvdata", "dat" );
+            FileOutputStream fos = new FileOutputStream( file );
+            fos.getChannel().write( message.getData().buf() );
+            fos.flush();
+            fos.close();
+            log.info( "Wrote data to " + file );
+        }catch(Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void handleFinStream( IoSession session, FinStreamControlFrame message )
+    {
+        log.info( "Received FIN STREAM frame." );
+    }
+
+    @Override
+    public void handleGoAway( IoSession session, GoAwayControlFrame message )
+    {
+        log.info( "Received GOAWAY frame." );
+    }
+
+    @Override
+    public void handleHello( IoSession session, HelloControlFrame hello )
+    {
+        log.info( "Received HELLO frame." );
+    }
+
+    @Override
+    public void handleSubresource( IoSession session, SubresourceControlFrame message )
+    {
+        log.info( "Received SUBRESOURCE frame" );
+    }
+
+    @Override
+    public void handleSynReply( IoSession session, SynReplyControlFrame message )
+    {
+        log.info( "Received SYN REPLY frame" );
+    }
+
+    @Override
+    public void handleSynStream( IoSession session, SynStreamControlFrame message )
+    {
+        log.info( "Received SYN STREAM frame" );
+    }
+
+    public void messageSent( IoSession session, Object message ) throws Exception
+    {
+        log.info( "Message sent " + message );
+    }
+
+    public void sessionClosed( IoSession session ) throws Exception
+    {
+        log.info( "Session closed" );
+    }
+
+    public void sessionCreated( IoSession session ) throws Exception
+    {
+        log.info( "Session created" );
+    }
+
+    public void sessionIdle( IoSession session, IdleStatus status ) throws Exception
+    {
+        log.info( "Session Idle" );
+    }
+
+    public void sessionOpened( IoSession session ) throws Exception
+    {
+        log.info( "Session opened " + session );
+    }
+
+    public void exceptionCaught( IoSession session, Throwable cause ) throws Exception
+    {
+        cause.printStackTrace();
+    }
 }

Modified: mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/messages/AbstractSpdyFrame.java
URL: http://svn.apache.org/viewvc/mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/messages/AbstractSpdyFrame.java?rev=882412&r1=882411&r2=882412&view=diff
==============================================================================
--- mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/messages/AbstractSpdyFrame.java (original)
+++ mina/sandbox/mwebb/mina/src/main/java/org/apache/mina/spdy/messages/AbstractSpdyFrame.java Fri Nov 20 04:52:22 2009
@@ -10,6 +10,9 @@
  */
 public abstract class AbstractSpdyFrame {
 
+    public static final int FRAME_CONTROL_BIT   = 1;
+    public static final int FRAME_DATA_BIT      = 0;
+    
 	private int bit;		// 1 bit
 	private byte flags;		// 8 bits
 	private int length; 	// 24 bits