Minor changes to make WebTransport over HTTP/3 integration work.
* QuicSpdyClientSession/Stream are now exported into Chrome proper.
* QuicSpdySession sets up a datagram queue observer
* QuicSpdySession provides a virtual method for overriding quic_h3_datagram feature flag.
PiperOrigin-RevId: 367333659
Change-Id: I9c7918c0e6e08c7864179cc36517eabbc5157b13
diff --git a/quic/core/http/quic_spdy_client_session.h b/quic/core/http/quic_spdy_client_session.h
index 345c014..88df049 100644
--- a/quic/core/http/quic_spdy_client_session.h
+++ b/quic/core/http/quic_spdy_client_session.h
@@ -20,7 +20,8 @@
class QuicConnection;
class QuicServerId;
-class QUIC_NO_EXPORT QuicSpdyClientSession : public QuicSpdyClientSessionBase {
+class QUIC_EXPORT_PRIVATE QuicSpdyClientSession
+ : public QuicSpdyClientSessionBase {
public:
// Takes ownership of |connection|. Caller retains ownership of
// |promised_by_url|.
diff --git a/quic/core/http/quic_spdy_client_stream.h b/quic/core/http/quic_spdy_client_stream.h
index b62f496..2318465 100644
--- a/quic/core/http/quic_spdy_client_stream.h
+++ b/quic/core/http/quic_spdy_client_stream.h
@@ -19,7 +19,7 @@
// All this does right now is send an SPDY request, and aggregate the
// SPDY response.
-class QUIC_NO_EXPORT QuicSpdyClientStream : public QuicSpdyStream {
+class QUIC_EXPORT_PRIVATE QuicSpdyClientStream : public QuicSpdyStream {
public:
QuicSpdyClientStream(QuicStreamId id,
QuicSpdyClientSession* session,
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc
index 37db9ac..1694810 100644
--- a/quic/core/http/quic_spdy_session.cc
+++ b/quic/core/http/quic_spdy_session.cc
@@ -474,7 +474,8 @@
VersionUsesHttp3(connection->transport_version())
? static_cast<QuicStreamCount>(
kHttp3StaticUnidirectionalStreamCount)
- : 0u),
+ : 0u,
+ std::make_unique<DatagramObserver>(this)),
send_control_stream_(nullptr),
receive_control_stream_(nullptr),
qpack_encoder_receive_stream_(nullptr),
@@ -553,7 +554,7 @@
qpack_maximum_blocked_streams_;
settings_.values[SETTINGS_MAX_FIELD_SECTION_SIZE] =
max_inbound_header_list_size_;
- if (GetQuicReloadableFlag(quic_h3_datagram) && version().UsesHttp3()) {
+ if (ShouldNegotiateHttp3Datagram() && version().UsesHttp3()) {
QUIC_RELOADABLE_FLAG_COUNT(quic_h3_datagram);
settings_.values[SETTINGS_H3_DATAGRAM] = 1;
}
@@ -923,7 +924,7 @@
}
bool QuicSpdySession::WillNegotiateWebTransport() {
- return GetQuicReloadableFlag(quic_h3_datagram) && version().UsesHttp3() &&
+ return ShouldNegotiateHttp3Datagram() && version().UsesHttp3() &&
ShouldNegotiateWebTransport();
}
@@ -1168,7 +1169,7 @@
id));
return false;
case SETTINGS_H3_DATAGRAM: {
- if (!GetQuicReloadableFlag(quic_h3_datagram)) {
+ if (!ShouldNegotiateHttp3Datagram()) {
break;
}
QUIC_DVLOG(1) << ENDPOINT << "SETTINGS_H3_DATAGRAM received with value "
@@ -1855,6 +1856,20 @@
return stream;
}
+void QuicSpdySession::OnDatagramProcessed(
+ absl::optional<MessageStatus> /*status*/) {
+ // TODO(b/184598230): make this work with multiple datagram flows.
+}
+
+void QuicSpdySession::DatagramObserver::OnDatagramProcessed(
+ absl::optional<MessageStatus> status) {
+ session_->OnDatagramProcessed(status);
+}
+
+bool QuicSpdySession::ShouldNegotiateHttp3Datagram() {
+ return GetQuicReloadableFlag(quic_h3_datagram);
+}
+
#undef ENDPOINT // undef for jumbo builds
} // namespace quic
diff --git a/quic/core/http/quic_spdy_session.h b/quic/core/http/quic_spdy_session.h
index e0bf096..b200484 100644
--- a/quic/core/http/quic_spdy_session.h
+++ b/quic/core/http/quic_spdy_session.h
@@ -553,11 +553,28 @@
// QuicConnectionVisitorInterface method.
void BeforeConnectionCloseSent() override;
+ // Called whenever a datagram is dequeued or dropped from datagram_queue().
+ virtual void OnDatagramProcessed(absl::optional<MessageStatus> status);
+
+ // Returns true if HTTP/3 datagram extension should be supported.
+ virtual bool ShouldNegotiateHttp3Datagram();
+
private:
friend class test::QuicSpdySessionPeer;
class SpdyFramerVisitor;
+ // Proxies OnDatagramProcessed() calls to the session.
+ class QUIC_EXPORT_PRIVATE DatagramObserver
+ : public QuicDatagramQueue::Observer {
+ public:
+ explicit DatagramObserver(QuicSpdySession* session) : session_(session) {}
+ void OnDatagramProcessed(absl::optional<MessageStatus> status) override;
+
+ private:
+ QuicSpdySession* session_; // not owned
+ };
+
struct QUIC_EXPORT_PRIVATE BufferedWebTransportStream {
WebTransportSessionId session_id;
QuicStreamId stream_id;