[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