diff --git a/include/obmc_console.hpp b/include/obmc_console.hpp
index fc99d41..d5eaf81 100644
--- a/include/obmc_console.hpp
+++ b/include/obmc_console.hpp
@@ -45,23 +45,23 @@
     hostSocket->async_write_some(
         boost::asio::buffer(inputBuffer.data(), inputBuffer.size()),
         [](boost::beast::error_code ec, std::size_t bytesWritten) {
-            doingWrite = false;
-            inputBuffer.erase(0, bytesWritten);
+        doingWrite = false;
+        inputBuffer.erase(0, bytesWritten);
 
-            if (ec == boost::asio::error::eof)
+        if (ec == boost::asio::error::eof)
+        {
+            for (crow::websocket::Connection* session : sessions)
             {
-                for (crow::websocket::Connection* session : sessions)
-                {
-                    session->close("Error in reading to host port");
-                }
-                return;
+                session->close("Error in reading to host port");
             }
-            if (ec)
-            {
-                BMCWEB_LOG_ERROR << "Error in host serial write " << ec;
-                return;
-            }
-            doWrite();
+            return;
+        }
+        if (ec)
+        {
+            BMCWEB_LOG_ERROR << "Error in host serial write " << ec;
+            return;
+        }
+        doWrite();
         });
 }
 
@@ -77,23 +77,22 @@
     hostSocket->async_read_some(
         boost::asio::buffer(outputBuffer.data(), outputBuffer.size()),
         [](const boost::system::error_code& ec, std::size_t bytesRead) {
-            BMCWEB_LOG_DEBUG << "read done.  Read " << bytesRead << " bytes";
-            if (ec)
-            {
-                BMCWEB_LOG_ERROR << "Couldn't read from host serial port: "
-                                 << ec;
-                for (crow::websocket::Connection* session : sessions)
-                {
-                    session->close("Error in connecting to host port");
-                }
-                return;
-            }
-            std::string_view payload(outputBuffer.data(), bytesRead);
+        BMCWEB_LOG_DEBUG << "read done.  Read " << bytesRead << " bytes";
+        if (ec)
+        {
+            BMCWEB_LOG_ERROR << "Couldn't read from host serial port: " << ec;
             for (crow::websocket::Connection* session : sessions)
             {
-                session->sendBinary(payload);
+                session->close("Error in connecting to host port");
             }
-            doRead();
+            return;
+        }
+        std::string_view payload(outputBuffer.data(), bytesRead);
+        for (crow::websocket::Connection* session : sessions)
+        {
+            session->sendBinary(payload);
+        }
+        doRead();
         });
 }
 
@@ -118,20 +117,21 @@
     BMCWEB_ROUTE(app, "/console0")
         .privileges({{"ConfigureComponents", "ConfigureManager"}})
         .websocket()
-        .onopen([](crow::websocket::Connection& conn) {
-            BMCWEB_LOG_DEBUG << "Connection " << &conn << " opened";
+        .onopen(
+            [](crow::websocket::Connection& conn) {
+        BMCWEB_LOG_DEBUG << "Connection " << &conn << " opened";
 
-            sessions.insert(&conn);
-            if (hostSocket == nullptr)
-            {
-                const std::string consoleName("\0obmc-console", 13);
-                boost::asio::local::stream_protocol::endpoint ep(consoleName);
+        sessions.insert(&conn);
+        if (hostSocket == nullptr)
+        {
+            const std::string consoleName("\0obmc-console", 13);
+            boost::asio::local::stream_protocol::endpoint ep(consoleName);
 
-                hostSocket = std::make_unique<
-                    boost::asio::local::stream_protocol::socket>(
+            hostSocket =
+                std::make_unique<boost::asio::local::stream_protocol::socket>(
                     conn.getIoContext());
-                hostSocket->async_connect(ep, connectHandler);
-            }
+            hostSocket->async_connect(ep, connectHandler);
+        }
         })
         .onclose([](crow::websocket::Connection& conn,
                     [[maybe_unused]] const std::string& reason) {
