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