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_