diff --git a/daemon/janus.c b/daemon/janus.c index 16f99037f..d41d962d9 100644 --- a/daemon/janus.c +++ b/daemon/janus.c @@ -507,14 +507,20 @@ static const char *janus_videoroom_join(struct websocket_message *wm, struct jan AUTO_CLEANUP(GQueue ret_streams, janus_clear_ret_streams) = G_QUEUE_INIT; // return list for multiple subs if (is_pub) { - // random feed ID - while (1) { - feed_id = janus_random(); + if (json_reader_read_member(reader, "id")) { + feed_id = jr_str_int(reader); if (!feed_id) - continue; + return "Invalid feed ID requested"; if (g_hash_table_lookup(room->feeds, &feed_id)) - continue; - break; + return "Feed already exists"; + } + json_reader_end_member(reader); + + // random feed ID? + while (!feed_id) { + feed_id = janus_random(); + if (feed_id && g_hash_table_lookup(room->feeds, &feed_id)) + feed_id = 0; } // feed ID points to the handle diff --git a/t/auto-daemon-tests-websocket.py b/t/auto-daemon-tests-websocket.py index 0c49a2187..7a9db4265 100644 --- a/t/auto-daemon-tests-websocket.py +++ b/t/auto-daemon-tests-websocket.py @@ -355,13 +355,18 @@ class TestVideoroom(unittest.TestCase): return handle - def createPublisher(self, token, session, room, handle, pubs=[], conn_num=0): + def createPublisher(self, token, session, room, handle, pubs=[], conn_num=0, feed_id=0): + body = {"request": "join", "ptype": "publisher", "room": room} + + if feed_id: + body["id"] = feed_id + eventloop.run_until_complete( testIOJanus( self, { "janus": "message", - "body": {"request": "join", "ptype": "publisher", "room": room}, + "body": body, "handle_id": handle, "session_id": session, "token": token, @@ -378,6 +383,8 @@ class TestVideoroom(unittest.TestCase): self.assertNotEqual(feed, session) self.assertNotEqual(feed, room) self.assertNotEqual(feed, handle) + if feed_id: + self.assertEqual(feed_id, feed) self.assertEqual( self._res, { @@ -1818,7 +1825,7 @@ class TestVideoroom(unittest.TestCase): pub_handle = self.createHandle(token, session) self.assertNotEqual(pub_handle, control_handle) - feed = self.createPublisher(token, session, room, pub_handle) + feed = self.createPublisher(token, session, room, pub_handle, feed_id=123) self.assertNotEqual(feed, control_handle) eventloop.run_until_complete(