[Red5commits] [1547] generate "NetStream?.Publish.BadName?" if two clients try to publish/record a st

jbauch luke at codegent.com
Wed Jan 24 10:52:27 EST 2007


generate "NetStream?.Publish.BadName?" if two clients try to publish/record a stream with the same name


Timestamp: 11/15/06 19:58:16 EST (2 months ago) 
Change: 1547 
Author: jbauch

Files (see diff or trac for details): 
doc/trunk/changelog.txt
java/server/trunk/src/org/red5/server/net/rtmp/Channel.java
java/server/trunk/src/org/red5/server/net/rtmp/RTMPConnection.java
java/server/trunk/src/org/red5/server/net/rtmp/RTMPHandler.java
java/server/trunk/src/org/red5/server/stream/StreamService.java


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

Index: /java/server/trunk/src/org/red5/server/stream/StreamService.java
===================================================================
--- /java/server/trunk/src/org/red5/server/stream/StreamService.java (revision 1546)
+++ /java/server/trunk/src/org/red5/server/stream/StreamService.java (revision 1547)
@@ -35,5 +35,9 @@
 import org.red5.server.api.stream.ISubscriberStream;
 import org.red5.server.api.stream.support.SimplePlayItem;
+import org.red5.server.net.rtmp.Channel;
+import org.red5.server.net.rtmp.RTMPConnection;
 import org.red5.server.net.rtmp.RTMPHandler;
+import org.red5.server.net.rtmp.status.Status;
+import org.red5.server.net.rtmp.status.StatusCodes;
 
 public class StreamService implements IStreamService {
@@ -236,4 +240,19 @@
 		IStreamCapableConnection streamConn = (IStreamCapableConnection) conn;
 		int streamId = getCurrentStreamId();
+		
+		IBroadcastScope bsScope = getBroadcastScope(conn.getScope(), name);
+		if (bsScope != null) {
+			// Another stream with that name is already published.
+			Status badName = new Status(StatusCodes.NS_PUBLISH_BADNAME);
+			badName.setClientid(streamId);
+			badName.setDetails(name);
+			badName.setLevel("error");
+
+			// FIXME: there should be a direct way to send the status
+			Channel channel = ((RTMPConnection) streamConn).getChannel((byte) (4 + ((streamId-1) * 5)));
+			channel.sendStatus(badName);
+			return;
+		}
+		
 		IClientStream stream = streamConn.getStreamById(streamId);
 		if (stream != null && !(stream instanceof IClientBroadcastStream)) {
@@ -260,6 +279,5 @@
 				if (providerService.registerBroadcastStream(conn.getScope(),
 						name, bs)) {
-					IBroadcastScope bsScope = getBroadcastScope(
-							conn.getScope(), bs.getPublishedName());
+					bsScope = getBroadcastScope(conn.getScope(), name);
 					bsScope.setAttribute(IBroadcastScope.STREAM_ATTRIBUTE, bs);
 					if (conn instanceof BaseConnection) {
Index: /java/server/trunk/src/org/red5/server/net/rtmp/RTMPHandler.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/RTMPHandler.java (revision 1538)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/RTMPHandler.java (revision 1547)
@@ -150,5 +150,7 @@
 							&& ACTION_PUBLISH.equals(((Invoke)message).getCall().getServiceMethodName())) {
 						IClientStream s = conn.getStreamById(header.getStreamId());
-						((IEventDispatcher) s).dispatchEvent(message);
+						if (s != null)
+							// Only dispatch if stream really was created 
+							((IEventDispatcher) s).dispatchEvent(message);
 					}
 					break;
@@ -175,9 +177,10 @@
 					// log.info("in packet: "+source.getSize()+"
 					// ts:"+source.getTimer());
-					try {
+					
+					// NOTE: If we respond to "publish" with "NetStream.Publish.BadName",
+					// the client sends a few stream packets before stopping. We need to
+					// ignore them.
+					if (stream != null)
 						((IEventDispatcher) stream).dispatchEvent(message);
-					} catch (NullPointerException e) {
-						log.error(e);
-					}
 					break;
 				case TYPE_SHARED_OBJECT:
Index: /java/server/trunk/src/org/red5/server/net/rtmp/RTMPConnection.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/RTMPConnection.java (revision 1538)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/RTMPConnection.java (revision 1547)
@@ -251,4 +251,12 @@
 	}
 
+	public int getStreamIdForChannel(byte channelId) {
+		if (channelId < 4) {
+			return 0;
+		}
+		
+		return (int) Math.floor((channelId - 4) / 5) + 1;
+	}
+	
 	public IClientStream getStreamByChannelId(byte channelId) {
 		if (channelId < 4) {
@@ -256,8 +264,5 @@
 		}
 
-		// log.debug("Channel id: "+channelId);
-		int id = (int) Math.floor((channelId - 4) / 5);
-		// log.debug("Stream: "+streamId);
-		return streams[id];
+		return streams[getStreamIdForChannel(channelId) - 1];
 	}
 
Index: /java/server/trunk/src/org/red5/server/net/rtmp/Channel.java
===================================================================
--- /java/server/trunk/src/org/red5/server/net/rtmp/Channel.java (revision 1406)
+++ /java/server/trunk/src/org/red5/server/net/rtmp/Channel.java (revision 1547)
@@ -103,5 +103,8 @@
 			((Notify) invoke).setCall(call);
 		}
-		write(invoke);
+		// We send directly to the corresponding stream as for
+		// some status codes, no stream has been created and thus
+		// "getStreamByChannelId" will fail.
+		write(invoke, connection.getStreamIdForChannel(id));
 	}
 
Index: /doc/trunk/changelog.txt
===================================================================
--- /doc/trunk/changelog.txt (revision 1546)
+++ /doc/trunk/changelog.txt (revision 1547)
@@ -24,4 +24,6 @@
 - deserializing of mixed arrays now works in all cases (Trac #109, #195)
 - "NetStream.Record.Start" and "NetStream.Record.Stop" are sent (Trac #127)
+- "NetStream.Publish.BadName" is sent if two clients try to publish/record
+  a stream with the same name
 
 


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