diff --git a/src/Handler.cpp b/src/Handler.cpp index d2ff7210..6f99c2d7 100644 --- a/src/Handler.cpp +++ b/src/Handler.cpp @@ -98,7 +98,7 @@ namespace mediasoupclient return this->pc->GetStats(); } - void Handler::UpdateIceServers(const json& iceServerUris) + void Handler::UpdateIceServers(const json& iceServersDescription) { MSC_TRACE(); @@ -106,11 +106,25 @@ namespace mediasoupclient configuration.servers.clear(); - for (const auto& iceServerUri : iceServerUris) + for (const auto& iceServerDescription : iceServersDescription) { + if (!iceServerDescription.contains("urls")) { + continue; + } webrtc::PeerConnectionInterface::IceServer iceServer; - - iceServer.uri = iceServerUri.get(); + if (iceServerDescription["urls"].is_string()) { + iceServer.urls = { iceServerDescription["urls"].get() }; + } else if (iceServerDescription["urls"].is_array()) { + iceServer.urls = iceServerDescription["urls"].get>(); + } else { + continue; + } + if (iceServerDescription.contains("username")) { + iceServer.username = iceServerDescription["username"].get(); + } + if (iceServerDescription.contains("credential")) { + iceServer.password = iceServerDescription["credential"].get(); + } configuration.servers.push_back(iceServer); } diff --git a/test/include/fakeParameters.hpp b/test/include/fakeParameters.hpp index ed9b8bc5..f0617f53 100644 --- a/test/include/fakeParameters.hpp +++ b/test/include/fakeParameters.hpp @@ -11,5 +11,6 @@ json generateLocalDtlsParameters(); json generateTransportRemoteParameters(); std::string generateProducerRemoteId(); json generateConsumerRemoteParameters(const std::string& codecMimeType); +json generateIceServers(); #endif diff --git a/test/src/Handler.test.cpp b/test/src/Handler.test.cpp index a3591984..5c2d97a7 100644 --- a/test/src/Handler.test.cpp +++ b/test/src/Handler.test.cpp @@ -8,6 +8,7 @@ static const json TransportRemoteParameters = generateTransportRemoteParameters(); static const json RtpParametersByKind = generateRtpParametersByKind(); +static const json IceServers = generateIceServers(); static mediasoupclient::PeerConnection::Options PeerConnectionOptions; @@ -201,8 +202,13 @@ TEST_CASE("RecvHandler", "[Handler][RecvHandler]") REQUIRE_NOTHROW(recvHandler.RestartIce(iceParameters)); } - SECTION("recvHandler.UpdateIceServers() succeeds") + SECTION("recvHandler.UpdateIceServers() succeeds with empty array") { REQUIRE_NOTHROW(recvHandler.UpdateIceServers(json::array())); } + + SECTION("recvHandler.UpdateIceServers() succeeds with non-empty array") + { + REQUIRE_NOTHROW(recvHandler.UpdateIceServers(IceServers)); + } } diff --git a/test/src/fakeParameters.cpp b/test/src/fakeParameters.cpp index cd91bb11..50d21be5 100644 --- a/test/src/fakeParameters.cpp +++ b/test/src/fakeParameters.cpp @@ -477,3 +477,22 @@ json generateConsumerRemoteParameters(const std::string& codecMimeType) return json::object(); }; + +json generateIceServers() +{ + auto json = R"( + [ + { + "urls" : [ + "turn:t1.server.com", + "turn:t2.server.com" + ], + "username" : "fakeuser", + "credential" : "fakepass" + }, + { + "urls" : "stun:s.server.com" + } + ])"_json; + return json; +};