diff --git a/include/nbd_proxy.hpp b/include/nbd_proxy.hpp
index 97c8b57..4431662 100644
--- a/include/nbd_proxy.hpp
+++ b/include/nbd_proxy.hpp
@@ -67,33 +67,33 @@
         acceptor.async_accept(
             [this, self(shared_from_this())](boost::system::error_code ec,
                                              stream_protocol::socket socket) {
-                if (ec)
-                {
-                    BMCWEB_LOG_ERROR << "UNIX socket: async_accept error = "
-                                     << ec.message();
-                    return;
-                }
-                if (peerSocket)
-                {
-                    // Something is wrong - socket shouldn't be acquired at this
-                    // point
-                    BMCWEB_LOG_ERROR
-                        << "Failed to open connection - socket already used";
-                    return;
-                }
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR << "UNIX socket: async_accept error = "
+                                 << ec.message();
+                return;
+            }
+            if (peerSocket)
+            {
+                // Something is wrong - socket shouldn't be acquired at this
+                // point
+                BMCWEB_LOG_ERROR
+                    << "Failed to open connection - socket already used";
+                return;
+            }
 
-                BMCWEB_LOG_DEBUG << "Connection opened";
-                peerSocket = std::move(socket);
-                doRead();
+            BMCWEB_LOG_DEBUG << "Connection opened";
+            peerSocket = std::move(socket);
+            doRead();
 
-                // Trigger Write if any data was sent from server
-                // Initially this is negotiation chunk
-                doWrite();
-            });
+            // Trigger Write if any data was sent from server
+            // Initially this is negotiation chunk
+            doWrite();
+        });
 
-        auto mountHandler = [this, self(shared_from_this())](
-                                const boost::system::error_code ec,
-                                const bool) {
+        auto mountHandler =
+            [this, self(shared_from_this())](const boost::system::error_code ec,
+                                             const bool) {
             if (ec)
             {
                 BMCWEB_LOG_ERROR << "DBus error: cannot call mount method = "
@@ -158,27 +158,27 @@
             ux2wsBuf.prepare(nbdBufferSize),
             [this, self(shared_from_this())](boost::system::error_code ec,
                                              std::size_t bytesRead) {
-                if (ec)
-                {
-                    BMCWEB_LOG_ERROR << "UNIX socket: async_read_some error = "
-                                     << ec.message();
-                    // UNIX socket has been closed by peer, best we can do is to
-                    // break all connections
-                    close();
-                    return;
-                }
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR << "UNIX socket: async_read_some error = "
+                                 << ec.message();
+                // UNIX socket has been closed by peer, best we can do is to
+                // break all connections
+                close();
+                return;
+            }
 
-                // Fetch data from UNIX socket
+            // Fetch data from UNIX socket
 
-                ux2wsBuf.commit(bytesRead);
+            ux2wsBuf.commit(bytesRead);
 
-                // Paste it to WebSocket as binary
-                connection.sendBinary(
-                    boost::beast::buffers_to_string(ux2wsBuf.data()));
-                ux2wsBuf.consume(bytesRead);
+            // Paste it to WebSocket as binary
+            connection.sendBinary(
+                boost::beast::buffers_to_string(ux2wsBuf.data()));
+            ux2wsBuf.consume(bytesRead);
 
-                // Allow further reads
-                doRead();
+            // Allow further reads
+            doRead();
             });
     }
 
@@ -209,19 +209,19 @@
             *peerSocket, ws2uxBuf.data(),
             [this, self(shared_from_this())](boost::system::error_code ec,
                                              std::size_t bytesWritten) {
-                ws2uxBuf.consume(bytesWritten);
-                uxWriteInProgress = false;
-                if (ec)
-                {
-                    BMCWEB_LOG_ERROR << "UNIX: async_write error = "
-                                     << ec.message();
-                    return;
-                }
-                // Retrigger doWrite if there is something in buffer
-                if (ws2uxBuf.size() > 0)
-                {
-                    doWrite();
-                }
+            ws2uxBuf.consume(bytesWritten);
+            uxWriteInProgress = false;
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR << "UNIX: async_write error = "
+                                 << ec.message();
+                return;
+            }
+            // Retrigger doWrite if there is something in buffer
+            if (ws2uxBuf.size() > 0)
+            {
+                doWrite();
+            }
             });
     }
 
@@ -258,143 +258,138 @@
         .onopen([](crow::websocket::Connection& conn) {
             BMCWEB_LOG_DEBUG << "nbd-proxy.onopen(" << &conn << ")";
 
-            auto getUserInfoHandler = [&conn](
-                                          const boost::system::error_code ec,
-                                          const dbus::utility::
-                                              DBusPropertiesMap& userInfo) {
+            auto getUserInfoHandler =
+                [&conn](const boost::system::error_code ec,
+                        const dbus::utility::DBusPropertiesMap& userInfo) {
+            if (ec)
+            {
+                BMCWEB_LOG_ERROR << "GetUserInfo failed...";
+                conn.close("Failed to get user information");
+                return;
+            }
+
+            const std::string* userRolePtr = nullptr;
+            auto userInfoIter = std::find_if(userInfo.begin(), userInfo.end(),
+                                             [](const auto& p) {
+                return p.first == "UserPrivilege";
+            });
+            if (userInfoIter != userInfo.end())
+            {
+                userRolePtr = std::get_if<std::string>(&userInfoIter->second);
+            }
+
+            std::string userRole{};
+            if (userRolePtr != nullptr)
+            {
+                userRole = *userRolePtr;
+                BMCWEB_LOG_DEBUG << "userName = " << conn.getUserName()
+                                 << " userRole = " << *userRolePtr;
+            }
+
+            // Get the user privileges from the role
+            ::redfish::Privileges userPrivileges =
+                ::redfish::getUserPrivileges(userRole);
+
+            const ::redfish::Privileges requiredPrivileges{
+                requiredPrivilegeString};
+
+            if (!userPrivileges.isSupersetOf(requiredPrivileges))
+            {
+                BMCWEB_LOG_DEBUG << "User " << conn.getUserName()
+                                 << " not authorized for nbd connection";
+                conn.close("Unathourized access");
+                return;
+            }
+
+            auto openHandler =
+                [&conn](const boost::system::error_code ec,
+                        const dbus::utility::ManagedObjectType& objects) {
+                const std::string* socketValue = nullptr;
+                const std::string* endpointValue = nullptr;
+                const std::string* endpointObjectPath = nullptr;
+
                 if (ec)
                 {
-                    BMCWEB_LOG_ERROR << "GetUserInfo failed...";
-                    conn.close("Failed to get user information");
+                    BMCWEB_LOG_ERROR << "DBus error: " << ec.message();
+                    conn.close("Failed to create mount point");
                     return;
                 }
 
-                const std::string* userRolePtr = nullptr;
-                auto userInfoIter = std::find_if(
-                    userInfo.begin(), userInfo.end(),
-                    [](const auto& p) { return p.first == "UserPrivilege"; });
-                if (userInfoIter != userInfo.end())
+                for (const auto& [objectPath, interfaces] : objects)
                 {
-                    userRolePtr =
-                        std::get_if<std::string>(&userInfoIter->second);
+                    for (const auto& [interface, properties] : interfaces)
+                    {
+                        if (interface !=
+                            "xyz.openbmc_project.VirtualMedia.MountPoint")
+                        {
+                            continue;
+                        }
+
+                        for (const auto& [name, value] : properties)
+                        {
+                            if (name == "EndpointId")
+                            {
+                                endpointValue =
+                                    std::get_if<std::string>(&value);
+
+                                if (endpointValue == nullptr)
+                                {
+                                    BMCWEB_LOG_ERROR
+                                        << "EndpointId property value is null";
+                                }
+                            }
+                            if (name == "Socket")
+                            {
+                                socketValue = std::get_if<std::string>(&value);
+                                if (socketValue == nullptr)
+                                {
+                                    BMCWEB_LOG_ERROR
+                                        << "Socket property value is null";
+                                }
+                            }
+                        }
+                    }
+
+                    if ((endpointValue != nullptr) &&
+                        (socketValue != nullptr) &&
+                        *endpointValue == conn.req.target())
+                    {
+                        endpointObjectPath = &objectPath.str;
+                        break;
+                    }
                 }
 
-                std::string userRole{};
-                if (userRolePtr != nullptr)
+                if (objects.empty() || endpointObjectPath == nullptr)
                 {
-                    userRole = *userRolePtr;
-                    BMCWEB_LOG_DEBUG << "userName = " << conn.getUserName()
-                                     << " userRole = " << *userRolePtr;
-                }
-
-                // Get the user privileges from the role
-                ::redfish::Privileges userPrivileges =
-                    ::redfish::getUserPrivileges(userRole);
-
-                const ::redfish::Privileges requiredPrivileges{
-                    requiredPrivilegeString};
-
-                if (!userPrivileges.isSupersetOf(requiredPrivileges))
-                {
-                    BMCWEB_LOG_DEBUG << "User " << conn.getUserName()
-                                     << " not authorized for nbd connection";
-                    conn.close("Unathourized access");
+                    BMCWEB_LOG_ERROR << "Cannot find requested EndpointId";
+                    conn.close("Failed to match EndpointId");
                     return;
                 }
 
-                auto openHandler = [&conn](
-                                       const boost::system::error_code ec,
-                                       const dbus::utility::ManagedObjectType&
-                                           objects) {
-                    const std::string* socketValue = nullptr;
-                    const std::string* endpointValue = nullptr;
-                    const std::string* endpointObjectPath = nullptr;
-
-                    if (ec)
+                for (const auto& session : sessions)
+                {
+                    if (session.second->getEndpointId() == conn.req.target())
                     {
-                        BMCWEB_LOG_ERROR << "DBus error: " << ec.message();
-                        conn.close("Failed to create mount point");
+                        BMCWEB_LOG_ERROR
+                            << "Cannot open new connection - socket is in use";
+                        conn.close("Slot is in use");
                         return;
                     }
+                }
 
-                    for (const auto& [objectPath, interfaces] : objects)
-                    {
-                        for (const auto& [interface, properties] : interfaces)
-                        {
-                            if (interface !=
-                                "xyz.openbmc_project.VirtualMedia.MountPoint")
-                            {
-                                continue;
-                            }
+                // If the socket file exists (i.e. after bmcweb crash),
+                // we cannot reuse it.
+                std::remove((*socketValue).c_str());
 
-                            for (const auto& [name, value] : properties)
-                            {
-                                if (name == "EndpointId")
-                                {
-                                    endpointValue =
-                                        std::get_if<std::string>(&value);
+                sessions[&conn] = std::make_shared<NbdProxyServer>(
+                    conn, *socketValue, *endpointValue, *endpointObjectPath);
 
-                                    if (endpointValue == nullptr)
-                                    {
-                                        BMCWEB_LOG_ERROR
-                                            << "EndpointId property value is null";
-                                    }
-                                }
-                                if (name == "Socket")
-                                {
-                                    socketValue =
-                                        std::get_if<std::string>(&value);
-                                    if (socketValue == nullptr)
-                                    {
-                                        BMCWEB_LOG_ERROR
-                                            << "Socket property value is null";
-                                    }
-                                }
-                            }
-                        }
-
-                        if ((endpointValue != nullptr) &&
-                            (socketValue != nullptr) &&
-                            *endpointValue == conn.req.target())
-                        {
-                            endpointObjectPath = &objectPath.str;
-                            break;
-                        }
-                    }
-
-                    if (objects.empty() || endpointObjectPath == nullptr)
-                    {
-                        BMCWEB_LOG_ERROR << "Cannot find requested EndpointId";
-                        conn.close("Failed to match EndpointId");
-                        return;
-                    }
-
-                    for (const auto& session : sessions)
-                    {
-                        if (session.second->getEndpointId() ==
-                            conn.req.target())
-                        {
-                            BMCWEB_LOG_ERROR
-                                << "Cannot open new connection - socket is in use";
-                            conn.close("Slot is in use");
-                            return;
-                        }
-                    }
-
-                    // If the socket file exists (i.e. after bmcweb crash),
-                    // we cannot reuse it.
-                    std::remove((*socketValue).c_str());
-
-                    sessions[&conn] = std::make_shared<NbdProxyServer>(
-                        conn, *socketValue, *endpointValue,
-                        *endpointObjectPath);
-
-                    sessions[&conn]->run();
-                };
-                crow::connections::systemBus->async_method_call(
-                    std::move(openHandler), "xyz.openbmc_project.VirtualMedia",
-                    "/xyz/openbmc_project/VirtualMedia",
-                    "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
+                sessions[&conn]->run();
+            };
+            crow::connections::systemBus->async_method_call(
+                std::move(openHandler), "xyz.openbmc_project.VirtualMedia",
+                "/xyz/openbmc_project/VirtualMedia",
+                "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
             };
 
             crow::connections::systemBus->async_method_call(
@@ -405,18 +400,17 @@
         })
         .onclose(
             [](crow::websocket::Connection& conn, const std::string& reason) {
-                BMCWEB_LOG_DEBUG << "nbd-proxy.onclose(reason = '" << reason
-                                 << "')";
-                auto session = sessions.find(&conn);
-                if (session == sessions.end())
-                {
-                    BMCWEB_LOG_DEBUG << "No session to close";
-                    return;
-                }
-                session->second->close();
-                // Remove reference to session in global map
-                sessions.erase(session);
-            })
+        BMCWEB_LOG_DEBUG << "nbd-proxy.onclose(reason = '" << reason << "')";
+        auto session = sessions.find(&conn);
+        if (session == sessions.end())
+        {
+            BMCWEB_LOG_DEBUG << "No session to close";
+            return;
+        }
+        session->second->close();
+        // Remove reference to session in global map
+        sessions.erase(session);
+        })
         .onmessage([](crow::websocket::Connection& conn,
                       const std::string& data, bool) {
             BMCWEB_LOG_DEBUG << "nbd-proxy.onmessage(len = " << data.length()
