diff --git a/include/dbus_monitor.hpp b/include/dbus_monitor.hpp
index 2682717..25f0c7f 100644
--- a/include/dbus_monitor.hpp
+++ b/include/dbus_monitor.hpp
@@ -114,141 +114,140 @@
         .privileges({{"Login"}})
         .websocket()
         .onopen([&](crow::websocket::Connection& conn) {
-            BMCWEB_LOG_DEBUG("Connection {} opened", logPtr(&conn));
-            sessions.try_emplace(&conn);
-        })
+        BMCWEB_LOG_DEBUG("Connection {} opened", logPtr(&conn));
+        sessions.try_emplace(&conn);
+    })
         .onclose([&](crow::websocket::Connection& conn, const std::string&) {
-            sessions.erase(&conn);
-        })
+        sessions.erase(&conn);
+    })
         .onmessage([&](crow::websocket::Connection& conn,
                        const std::string& data, bool) {
-            const auto sessionPair = sessions.find(&conn);
-            if (sessionPair == sessions.end())
+        const auto sessionPair = sessions.find(&conn);
+        if (sessionPair == sessions.end())
+        {
+            conn.close("Internal error");
+        }
+        DbusWebsocketSession& thisSession = sessionPair->second;
+        BMCWEB_LOG_DEBUG("Connection {} received {}", logPtr(&conn), data);
+        nlohmann::json j = nlohmann::json::parse(data, nullptr, false);
+        if (j.is_discarded())
+        {
+            BMCWEB_LOG_ERROR("Unable to parse json data for monitor");
+            conn.close("Unable to parse json request");
+            return;
+        }
+        nlohmann::json::iterator interfaces = j.find("interfaces");
+        if (interfaces != j.end())
+        {
+            thisSession.interfaces.reserve(interfaces->size());
+            for (auto& interface : *interfaces)
             {
-                conn.close("Internal error");
+                const std::string* str =
+                    interface.get_ptr<const std::string*>();
+                if (str != nullptr)
+                {
+                    thisSession.interfaces.insert(*str);
+                }
             }
-            DbusWebsocketSession& thisSession = sessionPair->second;
-            BMCWEB_LOG_DEBUG("Connection {} received {}", logPtr(&conn), data);
-            nlohmann::json j = nlohmann::json::parse(data, nullptr, false);
-            if (j.is_discarded())
+        }
+
+        nlohmann::json::iterator paths = j.find("paths");
+        if (paths == j.end())
+        {
+            BMCWEB_LOG_ERROR("Unable to find paths in json data");
+            conn.close("Unable to find paths in json data");
+            return;
+        }
+
+        size_t interfaceCount = thisSession.interfaces.size();
+        if (interfaceCount == 0)
+        {
+            interfaceCount = 1;
+        }
+        // Reserve our matches upfront.  For each path there is 1 for
+        // interfacesAdded, and InterfaceCount number for
+        // PropertiesChanged
+        thisSession.matches.reserve(thisSession.matches.size() +
+                                    paths->size() * (1U + interfaceCount));
+
+        // These regexes derived on the rules here:
+        // https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names
+        static std::regex validPath("^/([A-Za-z0-9_]+/?)*$");
+        static std::regex validInterface(
+            "^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)+$");
+
+        for (const auto& thisPath : *paths)
+        {
+            const std::string* thisPathString =
+                thisPath.get_ptr<const std::string*>();
+            if (thisPathString == nullptr)
             {
-                BMCWEB_LOG_ERROR("Unable to parse json data for monitor");
-                conn.close("Unable to parse json request");
+                BMCWEB_LOG_ERROR("subscribe path isn't a string?");
+                conn.close();
                 return;
             }
-            nlohmann::json::iterator interfaces = j.find("interfaces");
-            if (interfaces != j.end())
+            if (!std::regex_match(*thisPathString, validPath))
             {
-                thisSession.interfaces.reserve(interfaces->size());
-                for (auto& interface : *interfaces)
-                {
-                    const std::string* str =
-                        interface.get_ptr<const std::string*>();
-                    if (str != nullptr)
-                    {
-                        thisSession.interfaces.insert(*str);
-                    }
-                }
-            }
-
-            nlohmann::json::iterator paths = j.find("paths");
-            if (paths == j.end())
-            {
-                BMCWEB_LOG_ERROR("Unable to find paths in json data");
-                conn.close("Unable to find paths in json data");
+                BMCWEB_LOG_ERROR("Invalid path name {}", *thisPathString);
+                conn.close();
                 return;
             }
-
-            size_t interfaceCount = thisSession.interfaces.size();
-            if (interfaceCount == 0)
+            std::string propertiesMatchString =
+                ("type='signal',"
+                 "interface='org.freedesktop.DBus.Properties',"
+                 "path_namespace='" +
+                 *thisPathString +
+                 "',"
+                 "member='PropertiesChanged'");
+            // If interfaces weren't specified, add a single match for all
+            // interfaces
+            if (thisSession.interfaces.empty())
             {
-                interfaceCount = 1;
-            }
-            // Reserve our matches upfront.  For each path there is 1 for
-            // interfacesAdded, and InterfaceCount number for
-            // PropertiesChanged
-            thisSession.matches.reserve(thisSession.matches.size() +
-                                        paths->size() * (1U + interfaceCount));
+                BMCWEB_LOG_DEBUG("Creating match {}", propertiesMatchString);
 
-            // These regexes derived on the rules here:
-            // https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names
-            static std::regex validPath("^/([A-Za-z0-9_]+/?)*$");
-            static std::regex validInterface(
-                "^[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)+$");
-
-            for (const auto& thisPath : *paths)
-            {
-                const std::string* thisPathString =
-                    thisPath.get_ptr<const std::string*>();
-                if (thisPathString == nullptr)
-                {
-                    BMCWEB_LOG_ERROR("subscribe path isn't a string?");
-                    conn.close();
-                    return;
-                }
-                if (!std::regex_match(*thisPathString, validPath))
-                {
-                    BMCWEB_LOG_ERROR("Invalid path name {}", *thisPathString);
-                    conn.close();
-                    return;
-                }
-                std::string propertiesMatchString =
-                    ("type='signal',"
-                     "interface='org.freedesktop.DBus.Properties',"
-                     "path_namespace='" +
-                     *thisPathString +
-                     "',"
-                     "member='PropertiesChanged'");
-                // If interfaces weren't specified, add a single match for all
-                // interfaces
-                if (thisSession.interfaces.empty())
-                {
-                    BMCWEB_LOG_DEBUG("Creating match {}",
-                                     propertiesMatchString);
-
-                    thisSession.matches.emplace_back(
-                        std::make_unique<sdbusplus::bus::match_t>(
-                            *crow::connections::systemBus,
-                            propertiesMatchString, onPropertyUpdate, &conn));
-                }
-                else
-                {
-                    // If interfaces were specified, add a match for each
-                    // interface
-                    for (const std::string& interface : thisSession.interfaces)
-                    {
-                        if (!std::regex_match(interface, validInterface))
-                        {
-                            BMCWEB_LOG_ERROR("Invalid interface name {}",
-                                             interface);
-                            conn.close();
-                            return;
-                        }
-                        std::string ifaceMatchString = propertiesMatchString;
-                        ifaceMatchString += ",arg0='";
-                        ifaceMatchString += interface;
-                        ifaceMatchString += "'";
-                        BMCWEB_LOG_DEBUG("Creating match {}", ifaceMatchString);
-                        thisSession.matches.emplace_back(
-                            std::make_unique<sdbusplus::bus::match_t>(
-                                *crow::connections::systemBus, ifaceMatchString,
-                                onPropertyUpdate, &conn));
-                    }
-                }
-                std::string objectManagerMatchString =
-                    ("type='signal',"
-                     "interface='org.freedesktop.DBus.ObjectManager',"
-                     "path_namespace='" +
-                     *thisPathString +
-                     "',"
-                     "member='InterfacesAdded'");
-                BMCWEB_LOG_DEBUG("Creating match {}", objectManagerMatchString);
                 thisSession.matches.emplace_back(
                     std::make_unique<sdbusplus::bus::match_t>(
-                        *crow::connections::systemBus, objectManagerMatchString,
+                        *crow::connections::systemBus, propertiesMatchString,
                         onPropertyUpdate, &conn));
             }
-        });
+            else
+            {
+                // If interfaces were specified, add a match for each
+                // interface
+                for (const std::string& interface : thisSession.interfaces)
+                {
+                    if (!std::regex_match(interface, validInterface))
+                    {
+                        BMCWEB_LOG_ERROR("Invalid interface name {}",
+                                         interface);
+                        conn.close();
+                        return;
+                    }
+                    std::string ifaceMatchString = propertiesMatchString;
+                    ifaceMatchString += ",arg0='";
+                    ifaceMatchString += interface;
+                    ifaceMatchString += "'";
+                    BMCWEB_LOG_DEBUG("Creating match {}", ifaceMatchString);
+                    thisSession.matches.emplace_back(
+                        std::make_unique<sdbusplus::bus::match_t>(
+                            *crow::connections::systemBus, ifaceMatchString,
+                            onPropertyUpdate, &conn));
+                }
+            }
+            std::string objectManagerMatchString =
+                ("type='signal',"
+                 "interface='org.freedesktop.DBus.ObjectManager',"
+                 "path_namespace='" +
+                 *thisPathString +
+                 "',"
+                 "member='InterfacesAdded'");
+            BMCWEB_LOG_DEBUG("Creating match {}", objectManagerMatchString);
+            thisSession.matches.emplace_back(
+                std::make_unique<sdbusplus::bus::match_t>(
+                    *crow::connections::systemBus, objectManagerMatchString,
+                    onPropertyUpdate, &conn));
+        }
+    });
 }
 } // namespace dbus_monitor
 } // namespace crow
