face: Implement WebSocket channel, face, and factory.

Change-Id: Ic4dbb1abdbbdbec028746ba14b11be8ab9cc1edb
Refs: #1468
diff --git a/core/face-uri.cpp b/core/face-uri.cpp
index 1b2092c..2969e20 100644
--- a/core/face-uri.cpp
+++ b/core/face-uri.cpp
@@ -112,6 +112,14 @@
   m_port = boost::lexical_cast<std::string>(endpoint.port());
 }
 
+FaceUri::FaceUri(const boost::asio::ip::tcp::endpoint& endpoint, const std::string& scheme)
+  : m_scheme(scheme)
+{
+  m_isV6 = endpoint.address().is_v6();
+  m_host = endpoint.address().to_string();
+  m_port = boost::lexical_cast<std::string>(endpoint.port());
+}
+
 #ifdef HAVE_UNIX_SOCKETS
 FaceUri::FaceUri(const boost::asio::local::stream_protocol::endpoint& endpoint)
   : m_isV6(false)
diff --git a/core/face-uri.hpp b/core/face-uri.hpp
index 487f8f8..94474c7 100644
--- a/core/face-uri.hpp
+++ b/core/face-uri.hpp
@@ -79,6 +79,9 @@
   explicit
   FaceUri(const boost::asio::ip::udp::endpoint& endpoint);
 
+  /// construct tcp canonical FaceUri with customized scheme
+  FaceUri(const boost::asio::ip::tcp::endpoint& endpoint, const std::string& scheme);
+
 #ifdef HAVE_UNIX_SOCKETS
   /// construct unix canonical FaceUri
   explicit