Defines smart pointer types to hold nghttp2_session and nghttp2_session_callbacks objects.

PiperOrigin-RevId: 372112786
Change-Id: I087db189d3b23b4b2d4699814896c52d8443c0a2
diff --git a/http2/adapter/mock_nghttp2_callbacks.cc b/http2/adapter/mock_nghttp2_callbacks.cc
index c3f9e71..4bc1e8e 100644
--- a/http2/adapter/mock_nghttp2_callbacks.cc
+++ b/http2/adapter/mock_nghttp2_callbacks.cc
@@ -7,7 +7,7 @@
 namespace test {
 
 /* static */
-nghttp2_session_callbacks* MockNghttp2Callbacks::GetCallbacks() {
+nghttp2_session_callbacks_unique_ptr MockNghttp2Callbacks::GetCallbacks() {
   nghttp2_session_callbacks* callbacks;
   nghttp2_session_callbacks_new(&callbacks);
 
@@ -107,7 +107,7 @@
             ->OnInvalidFrameRecv(frame, error_code);
       });
 
-  return callbacks;
+  return MakeCallbacksPtr(callbacks);
 }
 
 }  // namespace test
diff --git a/http2/adapter/mock_nghttp2_callbacks.h b/http2/adapter/mock_nghttp2_callbacks.h
index 2d279ad..fcc9c59 100644
--- a/http2/adapter/mock_nghttp2_callbacks.h
+++ b/http2/adapter/mock_nghttp2_callbacks.h
@@ -2,6 +2,7 @@
 #define QUICHE_HTTP2_ADAPTER_MOCK_NGHTTP2_CALLBACKS_H_
 
 #include "absl/strings/string_view.h"
+#include "http2/adapter/nghttp2_util.h"
 #include "third_party/nghttp2/src/lib/includes/nghttp2/nghttp2.h"
 #include "common/platform/api/quiche_test.h"
 
@@ -16,7 +17,7 @@
   MockNghttp2Callbacks() = default;
 
   // The caller takes ownership of the |nghttp2_session_callbacks|.
-  static nghttp2_session_callbacks* GetCallbacks();
+  static nghttp2_session_callbacks_unique_ptr GetCallbacks();
 
   MOCK_METHOD(ssize_t,
               Send,
diff --git a/http2/adapter/nghttp2_session.cc b/http2/adapter/nghttp2_session.cc
index b288037..6d997a9 100644
--- a/http2/adapter/nghttp2_session.cc
+++ b/http2/adapter/nghttp2_session.cc
@@ -6,10 +6,6 @@
 namespace adapter {
 namespace {
 
-void DeleteSession(nghttp2_session* session) {
-  nghttp2_session_del(session);
-}
-
 void DeleteOptions(nghttp2_option* options) {
   nghttp2_option_del(options);
 }
@@ -20,7 +16,7 @@
                                nghttp2_session_callbacks* callbacks,
                                nghttp2_option* options,
                                void* userdata)
-    : session_(nullptr, DeleteSession),
+    : session_(MakeSessionPtr(nullptr)),
       options_(options, DeleteOptions),
       perspective_(perspective) {
   nghttp2_session* session;
diff --git a/http2/adapter/nghttp2_session.h b/http2/adapter/nghttp2_session.h
index 27a2153..bf1e01b 100644
--- a/http2/adapter/nghttp2_session.h
+++ b/http2/adapter/nghttp2_session.h
@@ -2,6 +2,7 @@
 #define QUICHE_HTTP2_ADAPTER_NGHTTP2_SESSION_H_
 
 #include "http2/adapter/http2_session.h"
+#include "http2/adapter/nghttp2_util.h"
 #include "third_party/nghttp2/src/lib/includes/nghttp2/nghttp2.h"
 
 namespace http2 {
@@ -27,10 +28,9 @@
   nghttp2_session* raw_ptr() const { return session_.get(); }
 
  private:
-  using SessionDeleter = void (&)(nghttp2_session*);
   using OptionsDeleter = void (&)(nghttp2_option*);
 
-  std::unique_ptr<nghttp2_session, SessionDeleter> session_;
+  nghttp2_session_unique_ptr session_;
   std::unique_ptr<nghttp2_option, OptionsDeleter> options_;
   Perspective perspective_;
 };
diff --git a/http2/adapter/nghttp2_util.cc b/http2/adapter/nghttp2_util.cc
index c191f4d..f457bb6 100644
--- a/http2/adapter/nghttp2_util.cc
+++ b/http2/adapter/nghttp2_util.cc
@@ -10,6 +10,27 @@
 namespace http2 {
 namespace adapter {
 
+namespace {
+
+void DeleteCallbacks(nghttp2_session_callbacks* callbacks) {
+  nghttp2_session_callbacks_del(callbacks);
+}
+
+void DeleteSession(nghttp2_session* session) {
+  nghttp2_session_del(session);
+}
+
+}  // namespace
+
+nghttp2_session_callbacks_unique_ptr MakeCallbacksPtr(
+    nghttp2_session_callbacks* callbacks) {
+  return nghttp2_session_callbacks_unique_ptr(callbacks, DeleteCallbacks);
+}
+
+nghttp2_session_unique_ptr MakeSessionPtr(nghttp2_session* session) {
+  return nghttp2_session_unique_ptr(session, DeleteSession);
+}
+
 uint8_t* ToUint8Ptr(char* str) { return reinterpret_cast<uint8_t*>(str); }
 uint8_t* ToUint8Ptr(const char* str) {
   return const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(str));
diff --git a/http2/adapter/nghttp2_util.h b/http2/adapter/nghttp2_util.h
index b9c03bb..a8d340a 100644
--- a/http2/adapter/nghttp2_util.h
+++ b/http2/adapter/nghttp2_util.h
@@ -20,6 +20,18 @@
     NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE;
 inline constexpr int kCancelStatus = NGHTTP2_ERR_CANCEL;
 
+using CallbacksDeleter = void (&)(nghttp2_session_callbacks*);
+using SessionDeleter = void (&)(nghttp2_session*);
+
+using nghttp2_session_callbacks_unique_ptr =
+    std::unique_ptr<nghttp2_session_callbacks, CallbacksDeleter>;
+using nghttp2_session_unique_ptr =
+    std::unique_ptr<nghttp2_session, SessionDeleter>;
+
+nghttp2_session_callbacks_unique_ptr MakeCallbacksPtr(
+    nghttp2_session_callbacks* callbacks);
+nghttp2_session_unique_ptr MakeSessionPtr(nghttp2_session* session);
+
 uint8_t* ToUint8Ptr(char* str);
 uint8_t* ToUint8Ptr(const char* str);