Add support for multiple consoles

This drop adds support for multiple consoles. The following changes are
made to achieve this.
- Kept the "/console0" route for backward compatibility
- Added a new route "/console/<str>" to support multiple consoles. All
  new consoles must use this route string.

Testing:
- Make sure that old console path /console0 is working.
 [INFO "http_connection.hpp":209] Request:  0x1bc2e60 HTTP/1.1
     GET /console0 ::ffff:x.x.xx.xxx
 [DEBUG "routing.hpp":1240] Matched rule (upgrade) '/console0' 1 / 2
 [DEBUG "obmc_console.hpp":212] Connection 0x1bdb67c opened
 [DEBUG "obmc_console.hpp":241] Console Object path =
    /xyz/openbmc_project/console/default service =
    xyz.openbmc_project.Console.default Request target = /console0
 [DEBUG "obmc_console.hpp":198] Console web socket path: /console0
    Console unix FD: 12 duped FD: 13
 [DEBUG "obmc_console.hpp":82] Reading from socket
 [DEBUG "obmc_console.hpp":162] Remove connection 0x1bdb67c from
    obmc console

- Make sure that new path for default console working
 [INFO "http_connection.hpp":209] Request:  0x1bd76a8 HTTP/1.1
    GET /console/default ::ffff:x.x.xx.xxx
 [DEBUG "routing.hpp":1240] Matched rule (upgrade) '/console/<str>'
     1 / 2
 [DEBUG "obmc_console.hpp":212] Connection 0x1baf82c opened
 [DEBUG "obmc_console.hpp":241] Console Object path =
    /xyz/openbmc_project/console/default service =
    xyz.openbmc_project.Console.default Request
    target = /console/default
 [DEBUG "obmc_console.hpp":198] Console web socket path:
    /console/default Console unix FD: 12 duped FD: 13
 [DEBUG "obmc_console.hpp":82] Reading from socket
 [INFO "obmc_console.hpp":154] Closing websocket. Reason:
 [DEBUG "obmc_console.hpp":162] Remove connection 0x1baf82c from
    obmc console

- Make sure that path for hypervisor console is working.
 [INFO "http_connection.hpp":209] Request:  0x1bc2e60 HTTP/1.1
    GET /console/hypervisor ::ffff:x.x.xx.xxx
 [DEBUG "routing.hpp":1240] Matched rule (upgrade) '/console/<str>'
     1 / 2
 [DEBUG "obmc_console.hpp":212] Connection 0x1bc5234 opened
 [DEBUG "obmc_console.hpp":241] Console Object path =
    /xyz/openbmc_project/console/hypervisor service =
    xyz.openbmc_project.Console.hypervisor Request
    target = /console/hypervisor
 [DEBUG "obmc_console.hpp":198] Console web socket path:
    /console/hypervisor Console unix FD: 12 duped FD: 13
 [DEBUG "obmc_console.hpp":82] Reading from socket
 [INFO "obmc_console.hpp":154] Closing websocket. Reason:
 [DEBUG "obmc_console.hpp":162] Remove connection 0x1bc5234 from
    obmc console

- Make sure that bad console path is failing properly due to DBUS error.
 [INFO "http_connection.hpp":209] Request:  0x1bd76a8 HTTP/1.1
    GET /console/badconsoleid ::ffff:x.x.xx.xxx
 [DEBUG "routing.hpp":1240] Matched rule (upgrade) '/console/<str>'
     1 / 2
 [DEBUG "obmc_console.hpp":212] Connection 0x1bdb67c opened
 [DEBUG "obmc_console.hpp":241] Console Object path =
    /xyz/openbmc_project/console/badconsoleid service =
    xyz.openbmc_project.Console.badconsoleid Request
    target = /console/badconsoleid
 [ERROR "obmc_console.hpp":174] Failed to call console Connect()
    method DBUS error: No route to host

Change-Id: I9b617bc51e3ddc605dd7f4d213c805d05d2cfead
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
Signed-off-by: Ed Tanous <edtanous@google.com>
diff --git a/http/websocket.hpp b/http/websocket.hpp
index e61f58b..0faa8c6 100644
--- a/http/websocket.hpp
+++ b/http/websocket.hpp
@@ -45,7 +45,7 @@
     virtual void resumeRead() = 0;
     virtual boost::asio::io_context& getIoContext() = 0;
     virtual ~Connection() = default;
-
+    virtual boost::urls::url_view url() = 0;
     boost::beast::http::request<boost::beast::http::string_body> req;
 };
 
@@ -54,8 +54,8 @@
 {
   public:
     ConnectionImpl(
-        const crow::Request& reqIn, Adaptor adaptorIn,
-        std::function<void(Connection&)> openHandlerIn,
+        const crow::Request& reqIn, boost::urls::url_view urlViewIn,
+        Adaptor adaptorIn, std::function<void(Connection&)> openHandlerIn,
         std::function<void(Connection&, const std::string&, bool)>
             messageHandlerIn,
         std::function<void(crow::websocket::Connection&, std::string_view,
@@ -65,7 +65,7 @@
         std::function<void(Connection&, const std::string&)> closeHandlerIn,
         std::function<void(Connection&)> errorHandlerIn) :
         Connection(reqIn),
-        ws(std::move(adaptorIn)), inBuffer(inString, 131088),
+        uri(urlViewIn), ws(std::move(adaptorIn)), inBuffer(inString, 131088),
         openHandler(std::move(openHandlerIn)),
         messageHandler(std::move(messageHandlerIn)),
         messageExHandler(std::move(messageExHandlerIn)),
@@ -215,6 +215,11 @@
             });
     }
 
+    boost::urls::url_view url() override
+    {
+        return uri;
+    }
+
     void acceptDone()
     {
         BMCWEB_LOG_DEBUG << "Websocket accepted connection";
@@ -338,6 +343,8 @@
         doRead();
     }
 
+    boost::urls::url uri;
+
     boost::beast::websocket::stream<Adaptor, false> ws;
 
     bool readingDefered = false;