Change the completionhandler to accept Res

These modifications are from WIP:Redfish:Query parameters:Only
(https://gerrit.openbmc-project.xyz/c/openbmc/bmcweb/+/47474). And they
will be used in Redfish:Query Parameters:Only.
(https://gerrit.openbmc-project.xyz/c/openbmc/bmcweb/+/38952)
The code changed the completion handle to accept Res to be able to
recall handle with a new Response object.
AsyncResp owns a new res, so there is no need to pass in a res.

Tested:
1.Basic and Token auth both still work.
2.Use scripts/websocket_test.py to test websockets. It is still work
correctly.
python3 websocket_test.py --host 127.0.0.1:2443
This modification is a public part, so you can use any URL to test
this function. The response is the same as before.

Signed-off-by: zhanghaicheng <zhanghch05@inspur.com>
Change-Id: I570e32fb47a9a90fe111fcd1f4054060cd21def3
diff --git a/http/http_response.hpp b/http/http_response.hpp
index a983d4a..c99b2c3 100644
--- a/http/http_response.hpp
+++ b/http/http_response.hpp
@@ -39,6 +39,8 @@
     Response() : stringResponse(response_type{})
     {}
 
+    Response(Response&& res) = delete;
+
     Response& operator=(const Response& r) = delete;
 
     Response& operator=(Response&& r) noexcept
@@ -113,37 +115,53 @@
     {
         if (completed)
         {
-            BMCWEB_LOG_ERROR << "Response was ended twice";
+            BMCWEB_LOG_ERROR << this << " Response was ended twice";
             return;
         }
         completed = true;
-        BMCWEB_LOG_DEBUG << "calling completion handler";
+        BMCWEB_LOG_DEBUG << this << " calling completion handler";
         if (completeRequestHandler)
         {
-            BMCWEB_LOG_DEBUG << "completion handler was valid";
-            completeRequestHandler();
+            BMCWEB_LOG_DEBUG << this << " completion handler was valid";
+            completeRequestHandler(*this);
         }
     }
 
-    void end(std::string_view bodyPart)
-    {
-        write(bodyPart);
-        end();
-    }
-
     bool isAlive()
     {
         return isAliveHelper && isAliveHelper();
     }
 
-    void setCompleteRequestHandler(std::function<void()> newHandler)
+    void setCompleteRequestHandler(std::function<void(Response&)>&& handler)
     {
-        completeRequestHandler = std::move(newHandler);
+        BMCWEB_LOG_DEBUG << this << " setting completion handler";
+        completeRequestHandler = std::move(handler);
+    }
+
+    std::function<void(Response&)> releaseCompleteRequestHandler()
+    {
+        BMCWEB_LOG_DEBUG << this << " releasing completion handler"
+                         << static_cast<bool>(completeRequestHandler);
+        std::function<void(Response&)> ret = completeRequestHandler;
+        completeRequestHandler = nullptr;
+        return ret;
+    }
+
+    void setIsAliveHelper(std::function<bool()>&& handler)
+    {
+        isAliveHelper = std::move(handler);
+    }
+
+    std::function<bool()> releaseIsAliveHelper()
+    {
+        std::function<bool()> ret = std::move(isAliveHelper);
+        isAliveHelper = nullptr;
+        return ret;
     }
 
   private:
-    bool completed{};
-    std::function<void()> completeRequestHandler;
+    bool completed = false;
+    std::function<void(Response&)> completeRequestHandler;
     std::function<bool()> isAliveHelper;
 
     // In case of a JSON object, set the Content-Type header