Manage Request with shared_ptr
This is an attempt to solve a class of use-after-move bugs on the
Request objects which have popped up several times. This more clearly
identifies code which owns the Request objects and has a need to keep it
alive. Currently it's just the `Connection` (or `HTTP2Connection`)
(which needs to access Request headers while sending the response), and
the `validatePrivilege()` function (which needs to temporarily own the
Request while doing an asynchronous D-Bus call). Route handlers are
provided a non-owning `Request&` for immediate use and required to not
hold the `Request&` for future use.
Tested: Redfish validator passes (with a few unrelated fails).
Redfish URLs are sent to a browser as HTML instead of raw JSON.
Change-Id: Id581fda90b6bceddd08a5dc7ff0a04b91e7394bf
Signed-off-by: Jonathan Doman <jonathan.doman@intel.com>
Signed-off-by: Ed Tanous <ed@tanous.net>
diff --git a/test/http/http2_connection_test.cpp b/test/http/http2_connection_test.cpp
index 34dc7cd..0385ed6 100644
--- a/test/http/http2_connection_test.cpp
+++ b/test/http/http2_connection_test.cpp
@@ -38,16 +38,17 @@
struct FakeHandler
{
bool called = false;
- void handle(Request& req,
+ void handle(const std::shared_ptr<Request>& req,
const std::shared_ptr<bmcweb::AsyncResp>& asyncResp)
{
called = true;
- EXPECT_EQ(req.url().buffer(), "/redfish/v1/");
- EXPECT_EQ(req.methodString(), "GET");
- EXPECT_EQ(req.getHeaderValue(boost::beast::http::field::user_agent),
+ EXPECT_EQ(req->url().buffer(), "/redfish/v1/");
+ EXPECT_EQ(req->methodString(), "GET");
+ EXPECT_EQ(req->getHeaderValue(boost::beast::http::field::user_agent),
"curl/8.5.0");
- EXPECT_EQ(req.getHeaderValue(boost::beast::http::field::accept), "*/*");
- EXPECT_EQ(req.getHeaderValue(":authority"), "localhost:18080");
+ EXPECT_EQ(req->getHeaderValue(boost::beast::http::field::accept),
+ "*/*");
+ EXPECT_EQ(req->getHeaderValue(":authority"), "localhost:18080");
asyncResp->res.write("StringOutput");
}
};