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);