[Red5commits] [1098] Updated debug handler.Added dump filer, can save as .raw (binary), and .cap (cu

lhubbard luke at codegent.com
Sat Jul 1 18:40:14 EDT 2006


Updated debug handler.
Added dump filer, can save as .raw (binary), and .cap (custom capture format).
Updated spring config to remove thread pool. Mina now does this for us.
Added debug handler port 0.0.0.0:1936 -> 127.0.0.1:1935


Timestamp: 07/02/06 08:36:53 (less than one hour ago) 
Change: 1098 
Author: lhubbard

Files (see diff or trac for details): 
java/server/trunk/conf/red5-core.xml
java/server/trunk/conf/red5.properties
java/server/trunk/dumps
java/server/trunk/src/org/red5/server/net/proxy/DebugProxyHandler.java
java/server/trunk/src/org/red5/server/net/proxy/NetworkDumpFilter.java
java/server/trunk/src/org/red5/server/net/rtmp/RTMPHandler.java


Trac: http://mirror1.cvsdude.com/trac/osflash/red5/changeset/1098

Index: /java/server/trunk/conf/red5-core.xml
===================================================================
--- /java/server/trunk/conf/red5-core.xml (revision 810)
+++ /java/server/trunk/conf/red5-core.xml (revision 1098)
@@ -3,8 +3,5 @@
 <beans>
 
-	<!-- This context holds all the networking: mina, jetty, etc -->
-
-	<!--<bean id="red5.server" class="org.red5.server.Server" init-method="init" />-->
-	<!--<bean id="jetty6.server" class="org.red5.server.JettyLoader" init-method="init" />-->
+	<!-- This context holds all the networking: mina -->
 
 	<bean id="customEditorConfigurer" 
@@ -22,17 +19,7 @@
 	    <property name="location" value="classpath:/red5.properties" />
 	</bean>
-		
-	<bean id="threadPoolFilter" class="org.apache.mina.filter.ThreadPoolFilter">
-     <constructor-arg value="mina"/>
-     <property name="maximumPoolSize" value="10"/>
-   </bean>
 	
    <bean id="filterChainBuilder" 
          class="org.apache.mina.integration.spring.DefaultIoFilterChainBuilderFactoryBean">
-     <property name="filters">
-       <list>
-         <ref bean="threadPoolFilter" />
-       </list>
-     </property>
    </bean>
 	
@@ -43,4 +30,5 @@
      <property name="bindings">
        <list>
+         
          <!-- RTMP -->
          <bean class="org.apache.mina.integration.spring.Binding">
@@ -55,4 +43,18 @@
            </property>
          </bean>
+         
+         <!-- DEBUG PROXY -->
+         <bean class="org.apache.mina.integration.spring.Binding">
+           <property name="address" value="${debug_proxy.host_port}"/>
+           <property name="handler" ref="debugProxyIoHandler"/>
+           <property name="serviceConfig">
+             <bean class="org.apache.mina.transport.socket.nio.SocketAcceptorConfig">
+               <property name="filterChainBuilder" ref="filterChainBuilder"/>
+               <property name="reuseAddress" value="true"/>
+               <property name="sessionConfig.reuseAddress" value="true"/>
+             </bean>
+           </property>
+         </bean>
+       
        </list>
      </property>
@@ -74,3 +76,10 @@
 	<bean id="rtmpt.server" class="org.red5.server.net.rtmpt.RTMPTLoader" init-method="init" autowire="byType" />
 	
+	<bean id="debugProxyIoHandler" class="org.red5.server.net.proxy.DebugProxyHandler">
+        <property name="codecFactory" ref="rtmpCodecFactory" />
+        <property name="forward" value="${proxy_forward.host_port}" />
+        <property name="dumpTo" value="./dumps/" />
+    </bean>
+	
+	
 </beans>
Index: /java/server/trunk/conf/red5.properties
===================================================================
--- /java/server/trunk/conf/red5.properties (revision 752)
+++ /java/server/trunk/conf/red5.properties (revision 1098)
@@ -1,5 +1,5 @@
 rtmp.host_port = 0.0.0.0:1935
-debug_proxy.host_port = 127.0.0.1:1936
-proxy.forward_host_port = 127.0.0.1:1935
+debug_proxy.host_port = 0.0.0.0:1936
+proxy_forward.host_port = 127.0.0.1:1935
 # for future use.. 
 rtmps.host_port = 127.0.0.1:1945
Index: /java/server/trunk/src/org/red5/server/net/proxy/NetworkDumpFilter.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/proxy/NetworkDumpFilter.java (revision 1098)
+++ /java/server/trunk/src/org/red5/server/net/proxy/NetworkDumpFilter.java (revision 1098)
@@ -0,0 +1,63 @@
+package org.red5.server.net.proxy;
+
+/*
+ * RED5 Open Source Flash Server - http://www.osflash.org/red5
+ * 
+ * Copyright (c) 2006 by respective authors (see below). All rights reserved.
+ * 
+ * This library 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 library 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 library; if not, write to the Free Software Foundation, Inc., 
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 
+ */
+
+import java.nio.channels.WritableByteChannel;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.mina.common.ByteBuffer;
+import org.apache.mina.common.IoFilterAdapter;
+import org.apache.mina.common.IoSession;
+
+public class NetworkDumpFilter extends IoFilterAdapter {
+
+	protected static Log log =
+        LogFactory.getLog(ProxyFilter.class.getName());
+	
+	protected WritableByteChannel channel;
+	protected boolean addHeaders = true;
+	
+	public NetworkDumpFilter(WritableByteChannel channel, boolean addHeaders){
+		this.channel = channel;
+		this.addHeaders = addHeaders;
+	}
+	
+	public void messageReceived(NextFilter next, IoSession session, Object message) throws Exception {
+		if(message instanceof ByteBuffer){
+			ByteBuffer out = (ByteBuffer) message;
+			if( addHeaders ){
+				ByteBuffer header = ByteBuffer.allocate(12);
+				header.putLong(System.currentTimeMillis());
+				header.putInt(out.limit());
+				header.flip();
+				channel.write( header.buf() );
+			}
+			channel.write( out.asReadOnlyBuffer().buf() );
+		}
+		next.messageReceived(session, message);
+	}
+
+	public void sessionClosed(NextFilter next, IoSession session) throws Exception {
+		channel.close();
+		next.sessionClosed(session);
+	}
+
+}
Index: /java/server/trunk/src/org/red5/server/net/proxy/DebugProxyHandler.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/proxy/DebugProxyHandler.java (revision 1092)
+++ /java/server/trunk/src/org/red5/server/net/proxy/DebugProxyHandler.java (revision 1098)
@@ -20,6 +20,8 @@
  */
 
+import java.io.File;
+import java.io.FileOutputStream;
 import java.net.InetSocketAddress;
-import java.net.SocketAddress;
+import java.nio.channels.WritableByteChannel;
 
 import org.apache.commons.logging.Log;
@@ -32,17 +34,25 @@
 import org.apache.mina.filter.codec.ProtocolCodecFilter;
 import org.apache.mina.transport.socket.nio.SocketConnector;
-import org.red5.server.net.rtmp.Channel;
-import org.red5.server.net.rtmp.RTMPMinaConnection;
 import org.red5.server.net.rtmp.codec.RTMP;
 import org.red5.server.net.rtmp.message.Header;
 import org.red5.server.net.rtmp.message.Packet;
+import org.springframework.context.ResourceLoaderAware;
+import org.springframework.core.io.ResourceLoader;
 
-public class DebugProxyHandler extends IoHandlerAdapter {
+public class DebugProxyHandler extends IoHandlerAdapter
+	implements ResourceLoaderAware {
 
 	protected static Log log =
         LogFactory.getLog(DebugProxyHandler.class.getName());
 	
-	public ProtocolCodecFactory codecFactory = null;
-	private SocketAddress forward = null;
+	private ResourceLoader loader;
+	private ProtocolCodecFactory codecFactory = null;
+	private InetSocketAddress forward = null;
+	private String dumpTo = "./dumps/";
+	private boolean addHeaders = true;
+
+	public void setResourceLoader(ResourceLoader loader) {
+		this.loader = loader;
+	}
 
 	public void setCodecFactory(ProtocolCodecFactory codecFactory) {
@@ -55,4 +65,12 @@
 		int port = Integer.parseInt( forward.substring(split+1,forward.length()) );
 		this.forward = new InetSocketAddress(host,port); 
+	}
+	
+	public void setDumpTo(String dumpTo){
+		this.dumpTo = dumpTo;
+	}
+	
+	public void setAddHeadersToDump(boolean addHeaders){
+		this.addHeaders = addHeaders;
 	}
 	
@@ -71,10 +89,27 @@
 		
 		session.getFilterChain().addFirst(
-                "proxy", new ProxyFilter(isClient ? "down" : "up") );
-
+				"proxy", new ProxyFilter(isClient ? "down" : "up") );
+		
+		if(true){
+		
+			String fileName = System.currentTimeMillis() 
+				+ "_" + forward.getHostName() 
+				+ "_" + forward.getPort() 
+				+ "_up." + ( (addHeaders) ? "cap" : "raw" );
+			
+			File file = loader.getResource( dumpTo + fileName ).getFile();
+			file.createNewFile();
+			FileOutputStream fos = new FileOutputStream( file );
+			WritableByteChannel channel = fos.getChannel();
+			
+			session.getFilterChain().addFirst(
+                "dump", new NetworkDumpFilter( channel, addHeaders ) );
+		}
+		
         //session.getFilterChain().addLast(
         //        "logger", new LoggingFilter() );
 		
         if(!isClient){
+        	log.debug("Connecting..");
         	SocketConnector connector = new SocketConnector();
         	ConnectFuture future = connector.connect(forward, this);
@@ -92,4 +127,6 @@
 	public void messageReceived(IoSession session, Object in) {
 		
+		if(!log.isDebugEnabled()) return;
+		
 		if(in instanceof ByteBuffer){
 			log.debug("Handskake");
@@ -98,17 +135,14 @@
 		
 		try {
-			
-			final RTMPMinaConnection conn = (RTMPMinaConnection) session.getAttachment();
 						
 			final Packet packet = (Packet) in;
 			final Object message = packet.getMessage();
 			final Header source = packet.getHeader();
-			final Channel channel = conn.getChannel(packet.getHeader().getChannelId());
 			
-			log.info(source);
-			log.info(message);
+			log.debug(source);
+			log.debug(message);
 			
 		} catch (RuntimeException e) {
-			log.debug("Exception",e);
+			log.error("Exception",e);
 		}
 	}
Index: /java/server/trunk/src/org/red5/server/net/rtmp/RTMPHandler.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/RTMPHandler.java (revision 1094)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/RTMPHandler.java (revision 1098)
@@ -144,5 +144,5 @@
 			case TYPE_AUDIO_DATA:
 			case TYPE_VIDEO_DATA:
-				//log.info("in packet: "+source.getSize()+" ts:"+source.getTimer());
+				// log.info("in packet: "+source.getSize()+" ts:"+source.getTimer());
 				try {
 					((IEventDispatcher) stream).dispatchEvent(message);


Note:
Diffs are chopped if more than 25k.
This is to get past the limit on the mailing list.



More information about the Red5commits mailing list