diff --git a/http/app.hpp b/http/app.hpp
index 60c2215..d47cd89 100644
--- a/http/app.hpp
+++ b/http/app.hpp
@@ -116,8 +116,8 @@
         }
         else
         {
-            sslServer =
-                std::make_unique<ssl_server_t>(this, socketFd, sslContext, io);
+            sslServer = std::make_unique<ssl_server_t>(this, socketFd,
+                                                       sslContext, io);
         }
         sslServer->run();
 
diff --git a/http/http_client.hpp b/http/http_client.hpp
index 4201499..8161eb1 100644
--- a/http/http_client.hpp
+++ b/http/http_client.hpp
@@ -536,7 +536,6 @@
     void afterSslShutdown(const std::shared_ptr<ConnectionInfo>& /*self*/,
                           bool retry, const boost::system::error_code& ec)
     {
-
         if (ec)
         {
             BMCWEB_LOG_ERROR << host << ":" << std::to_string(port)
diff --git a/http/http_connection.hpp b/http/http_connection.hpp
index 47f9432..c8ae1fd 100644
--- a/http/http_connection.hpp
+++ b/http/http_connection.hpp
@@ -45,8 +45,8 @@
 static int connectionCount = 0;
 
 // request body limit size set by the bmcwebHttpReqBodyLimitMb option
-constexpr uint64_t httpReqBodyLimit =
-    1024UL * 1024UL * bmcwebHttpReqBodyLimitMb;
+constexpr uint64_t httpReqBodyLimit = 1024UL * 1024UL *
+                                      bmcwebHttpReqBodyLimitMb;
 
 constexpr uint64_t loggedOutPostBodyLimit = 4096;
 
diff --git a/http/http_response.hpp b/http/http_response.hpp
index 5cbdb28..2af12c9 100644
--- a/http/http_response.hpp
+++ b/http/http_response.hpp
@@ -37,8 +37,7 @@
         stringResponse->set(key, value);
     }
 
-    Response() : stringResponse(response_type{})
-    {}
+    Response() : stringResponse(response_type{}) {}
 
     Response(Response&& res) noexcept :
         stringResponse(std::move(res.stringResponse)),
diff --git a/http/http_server.hpp b/http/http_server.hpp
index 3949a46..afa4514 100644
--- a/http/http_server.hpp
+++ b/http/http_server.hpp
@@ -67,8 +67,8 @@
         gmtime_r(&lastTimeT, &myTm);
 
         dateStr.resize(100);
-        size_t dateStrSz =
-            strftime(&dateStr[0], 99, "%a, %d %b %Y %H:%M:%S GMT", &myTm);
+        size_t dateStrSz = strftime(&dateStr[0], 99,
+                                    "%a, %d %b %Y %H:%M:%S GMT", &myTm);
         dateStr.resize(dateStrSz);
     }
 
diff --git a/http/logging.hpp b/http/logging.hpp
index 6543b73..ed0c7f7 100644
--- a/http/logging.hpp
+++ b/http/logging.hpp
@@ -65,8 +65,8 @@
 
         gmtime_r(&t, &myTm);
 
-        size_t sz =
-            strftime(date.data(), date.size(), "%Y-%m-%d %H:%M:%S", &myTm);
+        size_t sz = strftime(date.data(), date.size(), "%Y-%m-%d %H:%M:%S",
+                             &myTm);
         date.resize(sz);
         return date;
     }
@@ -93,7 +93,7 @@
 
     //
     template <typename T>
-    Logger& operator<<([[maybe_unused]] T const& value)
+    Logger& operator<<([[maybe_unused]] const T& value)
     {
         // Somewhere in the code we're implicitly casting an array to a
         // pointer in logging code. It's non-trivial to find,
diff --git a/http/routing.hpp b/http/routing.hpp
index 18d3c2a..5bf6902 100644
--- a/http/routing.hpp
+++ b/http/routing.hpp
@@ -34,8 +34,7 @@
 class BaseRule
 {
   public:
-    explicit BaseRule(const std::string& thisRule) : rule(thisRule)
-    {}
+    explicit BaseRule(const std::string& thisRule) : rule(thisRule) {}
 
     virtual ~BaseRule() = default;
 
@@ -183,8 +182,7 @@
     template <typename Req, typename... Args>
     struct ReqHandlerWrapper
     {
-        explicit ReqHandlerWrapper(Func fIn) : f(std::move(fIn))
-        {}
+        explicit ReqHandlerWrapper(Func fIn) : f(std::move(fIn)) {}
 
         void operator()(const Request& req,
                         const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
@@ -284,11 +282,9 @@
     using self_t = WebSocketRule;
 
   public:
-    explicit WebSocketRule(const std::string& ruleIn) : BaseRule(ruleIn)
-    {}
+    explicit WebSocketRule(const std::string& ruleIn) : BaseRule(ruleIn) {}
 
-    void validate() override
-    {}
+    void validate() override {}
 
     void handle(const Request& /*req*/,
                 const std::shared_ptr<bmcweb::AsyncResp>& asyncResp,
@@ -453,8 +449,7 @@
 class DynamicRule : public BaseRule, public RuleParameterTraits<DynamicRule>
 {
   public:
-    explicit DynamicRule(const std::string& ruleIn) : BaseRule(ruleIn)
-    {}
+    explicit DynamicRule(const std::string& ruleIn) : BaseRule(ruleIn) {}
 
     void validate() override
     {
@@ -514,8 +509,7 @@
   public:
     using self_t = TaggedRule<Args...>;
 
-    explicit TaggedRule(const std::string& ruleIn) : BaseRule(ruleIn)
-    {}
+    explicit TaggedRule(const std::string& ruleIn) : BaseRule(ruleIn) {}
 
     void validate() override
     {
@@ -584,8 +578,7 @@
         }
     };
 
-    Trie() : nodes(1)
-    {}
+    Trie() : nodes(1) {}
 
   private:
     void optimizeNode(Node* node)
@@ -1015,8 +1008,8 @@
             // Make sure it's safe to deference the array at that index
             static_assert(maxVerbIndex <
                           std::tuple_size_v<decltype(perMethods)>);
-            FindRoute route =
-                findRouteByIndex(req.url().encoded_path(), perMethodIndex);
+            FindRoute route = findRouteByIndex(req.url().encoded_path(),
+                                               perMethodIndex);
             if (route.rule == nullptr)
             {
                 continue;
@@ -1246,8 +1239,8 @@
             // route
             if (foundRoute.allowHeader.empty())
             {
-                foundRoute.route =
-                    findRouteByIndex(req.url().encoded_path(), notFoundIndex);
+                foundRoute.route = findRouteByIndex(req.url().encoded_path(),
+                                                    notFoundIndex);
             }
             else
             {
@@ -1260,7 +1253,6 @@
         // Fill in the allow header if it's valid
         if (!foundRoute.allowHeader.empty())
         {
-
             asyncResp->res.addHeader(boost::beast::http::field::allow,
                                      foundRoute.allowHeader);
         }
@@ -1332,8 +1324,7 @@
         Trie trie;
         // rule index 0 has special meaning; preallocate it to avoid
         // duplication.
-        PerMethod() : rules(1)
-        {}
+        PerMethod() : rules(1) {}
     };
 
     std::array<PerMethod, methodNotAllowedIndex + 1> perMethods;
diff --git a/http/utility.hpp b/http/utility.hpp
index 75c84c2..7a85519 100644
--- a/http/utility.hpp
+++ b/http/utility.hpp
@@ -123,8 +123,8 @@
             {
                 return 0;
             }
-            std::string_view tag =
-                url.substr(urlSegmentIndex, urlIndex + 1 - urlSegmentIndex);
+            std::string_view tag = url.substr(urlSegmentIndex,
+                                              urlIndex + 1 - urlSegmentIndex);
 
             // Note, this is a really lame way to do std::pow(6, paramIndex)
             // std::pow doesn't work in constexpr in clang.
diff --git a/http/websocket.hpp b/http/websocket.hpp
index 8774200..e61f58b 100644
--- a/http/websocket.hpp
+++ b/http/websocket.hpp
@@ -27,8 +27,7 @@
 struct Connection : std::enable_shared_from_this<Connection>
 {
   public:
-    explicit Connection(const crow::Request& reqIn) : req(reqIn.req)
-    {}
+    explicit Connection(const crow::Request& reqIn) : req(reqIn.req) {}
 
     Connection(const Connection&) = delete;
     Connection(Connection&&) = delete;
