face: support IPv6-only WebSocket channels
Change-Id: Ib9ba27d04611c13882e50995d701fc1b707cea5f
Refs: #4710
diff --git a/daemon/face/websocket-factory.cpp b/daemon/face/websocket-factory.cpp
index 11921cc..6b493de 100644
--- a/daemon/face/websocket-factory.cpp
+++ b/daemon/face/websocket-factory.cpp
@@ -91,28 +91,30 @@
"to disable WebSocket channels or enable at least one channel type."));
}
- if (!enableV4 && enableV6) {
- // websocketpp's IPv6 socket always accepts IPv4 connections.
- BOOST_THROW_EXCEPTION(ConfigFile::Error("NFD does not allow pure IPv6 WebSocket channel."));
+ if (context.isDryRun) {
+ return;
}
- if (!context.isDryRun) {
- if (!wantListen) {
- if (!m_channels.empty()) {
- NFD_LOG_WARN("Cannot close WebSocket channel after initialization");
- }
- return;
+ if (!wantListen) {
+ if (!m_channels.empty()) {
+ NFD_LOG_WARN("Cannot disable WebSocket channels after initialization");
}
+ return;
+ }
- BOOST_ASSERT(enableV4);
- websocket::Endpoint endpoint(enableV6 ? ip::tcp::v6() : ip::tcp::v4(), port);
+ if (enableV4) {
+ websocket::Endpoint endpoint(ip::tcp::v4(), port);
+ auto v4Channel = this->createChannel(endpoint);
+ if (!v4Channel->isListening()) {
+ v4Channel->listen(this->addFace);
+ }
+ }
- auto channel = this->createChannel(endpoint);
- if (!channel->isListening()) {
- channel->listen(this->addFace);
- if (m_channels.size() > 1) {
- NFD_LOG_WARN("Adding WebSocket channel for new endpoint; cannot close existing channels");
- }
+ if (enableV6) {
+ websocket::Endpoint endpoint(ip::tcp::v6(), port);
+ auto v6Channel = this->createChannel(endpoint);
+ if (!v6Channel->isListening()) {
+ v6Channel->listen(this->addFace);
}
}
}