Adds HTTP/2 trace logging functionality to OgHttp2Session.
Disabled by default. Can be enabled by defining a preprocessor macro.
PiperOrigin-RevId: 400780285
diff --git a/http2/adapter/oghttp2_session.cc b/http2/adapter/oghttp2_session.cc
index 149a026..eee9c3c 100644
--- a/http2/adapter/oghttp2_session.cc
+++ b/http2/adapter/oghttp2_session.cc
@@ -14,6 +14,14 @@
namespace {
+// #define OGHTTP2_DEBUG_TRACE 1
+
+#ifdef OGHTTP2_DEBUG_TRACE
+const bool kTraceLoggingEnabled = true;
+#else
+const bool kTraceLoggingEnabled = false;
+#endif
+
const uint32_t kMaxAllowedMetadataFrameSize = 65536u;
// TODO(birenroy): Consider incorporating spdy::FlagsSerializionVisitor here.
@@ -111,6 +119,15 @@
uint8_t flags_ = 0;
};
+absl::string_view TracePerspectiveAsString(Perspective p) {
+ switch (p) {
+ case Perspective::kClient:
+ return "OGHTTP2_CLIENT";
+ case Perspective::kServer:
+ return "OGHTTP2_SERVER";
+ }
+}
+
} // namespace
void OgHttp2Session::PassthroughHeadersHandler::OnHeaderBlockStart() {
@@ -143,6 +160,12 @@
OgHttp2Session::OgHttp2Session(Http2VisitorInterface& visitor, Options options)
: visitor_(visitor),
+ receive_logger_(
+ this, TracePerspectiveAsString(options.perspective),
+ []() { return kTraceLoggingEnabled; }, this),
+ send_logger_(
+ TracePerspectiveAsString(options.perspective),
+ []() { return kTraceLoggingEnabled; }, this),
headers_handler_(*this, visitor),
connection_window_manager_(kInitialFlowControlWindowSize,
[this](size_t window_update_delta) {
@@ -150,7 +173,7 @@
window_update_delta);
}),
options_(options) {
- decoder_.set_visitor(this);
+ decoder_.set_visitor(&receive_logger_);
decoder_.set_extension_visitor(this);
if (options_.perspective == Perspective::kServer) {
remaining_preface_ = {spdy::kHttp2ConnectionHeaderPrefix,
@@ -332,6 +355,7 @@
frame_ptr->Visit(&c);
visitor_.OnBeforeFrameSent(c.frame_type(), c.stream_id(), c.length(),
c.flags());
+ frame_ptr->Visit(&send_logger_);
spdy::SpdySerializedFrame frame = framer_.SerializeFrame(*frame_ptr);
const int64_t result = visitor_.OnReadyToSend(absl::string_view(frame));
if (result < 0) {
diff --git a/http2/adapter/oghttp2_session.h b/http2/adapter/oghttp2_session.h
index 0160b7d..a8beb0b 100644
--- a/http2/adapter/oghttp2_session.h
+++ b/http2/adapter/oghttp2_session.h
@@ -10,6 +10,7 @@
#include "http2/adapter/http2_util.h"
#include "http2/adapter/http2_visitor_interface.h"
#include "http2/adapter/window_manager.h"
+#include "http2/core/http2_trace_logging.h"
#include "http2/core/priority_write_scheduler.h"
#include "common/platform/api/quiche_bug_tracker.h"
#include "common/platform/api/quiche_export.h"
@@ -261,6 +262,11 @@
// Receives events when inbound frames are parsed.
Http2VisitorInterface& visitor_;
+ // Logs received frames when enabled.
+ Http2TraceLogger receive_logger_;
+ // Logs sent frames when enabled.
+ Http2FrameLogger send_logger_;
+
// Encodes outbound frames.
spdy::SpdyFramer framer_{spdy::SpdyFramer::ENABLE_COMPRESSION};