Create a shared interface to access QuicTransport*Session::IsSessionReady(). Also slightly alter the logic to make sure that the session does not stop being ready when the connection is closed. gfe-relnote: n/a (not used in production) PiperOrigin-RevId: 274230704 Change-Id: Idfe2d0135e5f35b1974619066743cc9edf8c44a9
diff --git a/quic/quic_transport/quic_transport_client_session.cc b/quic/quic_transport/quic_transport_client_session.cc index 5e2552f..032f61d 100644 --- a/quic/quic_transport/quic_transport_client_session.cc +++ b/quic/quic_transport/quic_transport_client_session.cc
@@ -104,7 +104,7 @@ ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); return; } - if (client_indication_sent_) { + if (ready_) { QUIC_BUG << "Client indication may only be sent once."; connection()->CloseConnection( QUIC_INTERNAL_ERROR, "Attempted to send client indication twice", @@ -121,6 +121,13 @@ client_indication->WriteOrBufferData(SerializeClientIndication(), /*fin=*/true, nullptr); client_indication_sent_ = true; + + // Don't set the ready bit if we closed the connection due to any error + // beforehand. + if (!connection()->connected()) { + return; + } + ready_ = true; } } // namespace quic
diff --git a/quic/quic_transport/quic_transport_client_session.h b/quic/quic_transport/quic_transport_client_session.h index 69e7d8e..32149df 100644 --- a/quic/quic_transport/quic_transport_client_session.h +++ b/quic/quic_transport/quic_transport_client_session.h
@@ -21,11 +21,14 @@ #include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h" #include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" #include "net/third_party/quiche/src/quic/quic_transport/quic_transport_protocol.h" +#include "net/third_party/quiche/src/quic/quic_transport/quic_transport_session_interface.h" namespace quic { // A client session for the QuicTransport protocol. -class QUIC_EXPORT QuicTransportClientSession : public QuicSession { +class QUIC_EXPORT QuicTransportClientSession + : public QuicSession, + public QuicTransportSessionInterface { public: QuicTransportClientSession(QuicConnection* connection, Visitor* owner, @@ -50,10 +53,7 @@ return crypto_stream_.get(); } - bool IsSessionReady() const { - return IsCryptoHandshakeConfirmed() && client_indication_sent_ && - connection()->connected(); - } + bool IsSessionReady() const override { return ready_; } void OnCryptoHandshakeEvent(CryptoHandshakeEvent event) override; @@ -78,6 +78,7 @@ std::unique_ptr<QuicCryptoClientStream> crypto_stream_; url::Origin origin_; bool client_indication_sent_ = false; + bool ready_ = false; }; } // namespace quic
diff --git a/quic/quic_transport/quic_transport_server_session.cc b/quic/quic_transport/quic_transport_server_session.cc index de4db0f..92cffcd 100644 --- a/quic/quic_transport/quic_transport_server_session.cc +++ b/quic/quic_transport/quic_transport_server_session.cc
@@ -158,7 +158,12 @@ if (!parser.Parse()) { return; } - client_indication_processed_ = true; + // Don't set the ready bit if we closed the connection due to any error + // beforehand. + if (!connection()->connected()) { + return; + } + ready_ = true; } } // namespace quic
diff --git a/quic/quic_transport/quic_transport_server_session.h b/quic/quic_transport/quic_transport_server_session.h index ee5cf69..7183ead 100644 --- a/quic/quic_transport/quic_transport_server_session.h +++ b/quic/quic_transport/quic_transport_server_session.h
@@ -11,11 +11,14 @@ #include "net/third_party/quiche/src/quic/core/quic_session.h" #include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" #include "net/third_party/quiche/src/quic/quic_transport/quic_transport_protocol.h" +#include "net/third_party/quiche/src/quic/quic_transport/quic_transport_session_interface.h" namespace quic { // A server session for the QuicTransport protocol. -class QUIC_EXPORT QuicTransportServerSession : public QuicSession { +class QUIC_EXPORT QuicTransportServerSession + : public QuicSession, + public QuicTransportSessionInterface { public: class ServerVisitor { public: @@ -46,10 +49,7 @@ return crypto_stream_.get(); } - bool IsSessionReady() const { - return IsCryptoHandshakeConfirmed() && client_indication_processed_ && - connection()->connected(); - } + bool IsSessionReady() const override { return ready_; } QuicStream* CreateIncomingStream(QuicStreamId id) override; QuicStream* CreateIncomingStream(PendingStream* /*pending*/) override { @@ -94,7 +94,7 @@ void ProcessClientIndication(QuicStringPiece indication); std::unique_ptr<QuicCryptoServerStream> crypto_stream_; - bool client_indication_processed_ = false; + bool ready_ = false; ServerVisitor* visitor_; };
diff --git a/quic/quic_transport/quic_transport_session_interface.h b/quic/quic_transport/quic_transport_session_interface.h new file mode 100644 index 0000000..971fa5b --- /dev/null +++ b/quic/quic_transport/quic_transport_session_interface.h
@@ -0,0 +1,25 @@ +// Copyright (c) 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef QUICHE_QUIC_QUIC_TRANSPORT_QUIC_TRANSPORT_SESSION_INTERFACE_H_ +#define QUICHE_QUIC_QUIC_TRANSPORT_QUIC_TRANSPORT_SESSION_INTERFACE_H_ + +namespace quic { + +// Shared interface between QuicTransportClientSession and +// QuicTransportServerSession. +class QuicTransportSessionInterface { + public: + virtual ~QuicTransportSessionInterface() {} + + // Indicates whether the client indication has been sent/received and the + // connection is thus ready to send/receive application data. Note that the + // expectation for this API is that once it becomes true, it will never + // transition to false. + virtual bool IsSessionReady() const = 0; +}; + +} // namespace quic + +#endif // QUICHE_QUIC_QUIC_TRANSPORT_QUIC_TRANSPORT_SESSION_INTERFACE_H_