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_