RTCConfiguration.cpp [plain text]
#include "config.h"
#include "RTCConfiguration.h"
#if ENABLE(WEB_RTC)
#include "ArrayValue.h"
#include "Dictionary.h"
#include "ExceptionCode.h"
#include "URL.h"
namespace WebCore {
static bool validateIceServerURL(const String& iceURL)
{
URL url(URL(), iceURL);
if (url.isEmpty() || !url.isValid() || !(url.protocolIs("turn") || url.protocolIs("stun")))
return false;
return true;
}
static RefPtr<RTCIceServer> parseIceServer(const Dictionary& iceServer, ExceptionCode& ec)
{
String credential, username;
iceServer.get("credential", credential);
iceServer.get("username", username);
Vector<String> urlsList;
String urlString;
iceServer.get("urls", urlString);
if (urlString.isEmpty()) {
ec = INVALID_ACCESS_ERR;
return nullptr;
}
if (urlString.find(',') != notFound && iceServer.get("urls", urlsList) && urlsList.size()) {
for (auto iter = urlsList.begin(); iter != urlsList.end(); ++iter) {
if (!validateIceServerURL(*iter)) {
ec = INVALID_ACCESS_ERR;
return nullptr;
}
}
} else {
if (!validateIceServerURL(urlString)) {
ec = INVALID_ACCESS_ERR;
return nullptr;
}
urlsList.append(urlString);
}
return RTCIceServer::create(urlsList, credential, username);
}
RefPtr<RTCConfiguration> RTCConfiguration::create(const Dictionary& configuration, ExceptionCode& ec)
{
if (configuration.isUndefinedOrNull())
return nullptr;
RefPtr<RTCConfiguration> rtcConfiguration = adoptRef(new RTCConfiguration());
rtcConfiguration->initialize(configuration, ec);
if (ec)
return nullptr;
return rtcConfiguration;
}
RTCConfiguration::RTCConfiguration()
{
}
void RTCConfiguration::initialize(const Dictionary& configuration, ExceptionCode& ec)
{
ArrayValue iceServers;
bool ok = configuration.get("iceServers", iceServers);
if (!ok || iceServers.isUndefinedOrNull()) {
ec = TYPE_MISMATCH_ERR;
return;
}
size_t numberOfServers;
ok = iceServers.length(numberOfServers);
if (!ok || !numberOfServers) {
ec = !ok ? TYPE_MISMATCH_ERR : INVALID_ACCESS_ERR;
return;
}
for (size_t i = 0; i < numberOfServers; ++i) {
Dictionary iceServerDict;
ok = iceServers.get(i, iceServerDict);
if (!ok) {
ec = TYPE_MISMATCH_ERR;
return;
}
RefPtr<RTCIceServer> iceServer = parseIceServer(iceServerDict, ec);
if (!iceServer)
return;
m_iceServers.append(WTFMove(iceServer));
}
String iceTransportPolicy;
if (configuration.get("iceTransportPolicy", iceTransportPolicy)) {
if (iceTransportPolicy == "relay")
m_iceTransportPolicy = IceTransportPolicy::Relay;
else if (iceTransportPolicy == "all")
m_iceTransportPolicy = IceTransportPolicy::All;
else {
ec = TypeError;
return;
}
}
String bundlePolicy;
if (configuration.get("bundlePolicy", bundlePolicy)) {
if (bundlePolicy == "balanced")
m_bundlePolicy = BundlePolicy::Balanced;
else if (bundlePolicy == "max-compat")
m_bundlePolicy = BundlePolicy::MaxCompat;
else if (bundlePolicy == "max-bundle")
m_bundlePolicy = BundlePolicy::MaxBundle;
else
ec = TypeError;
}
}
}
#endif // ENABLE(WEB_RTC)