Add an extra endpoint to the QuicTransport simple server called
/receive-bidirectional. This creates a server-initiated bidirectional stream
every time an incoming stream is received from the client.
This will be used to test receiving bidirectional streams in Chrome.
PiperOrigin-RevId: 332362367
Change-Id: I5b88c266b51b079126691bd6ae52e46795d7297a
diff --git a/quic/tools/quic_transport_simple_server_session.cc b/quic/tools/quic_transport_simple_server_session.cc
index 49c86e5..d07da11 100644
--- a/quic/tools/quic_transport_simple_server_session.cc
+++ b/quic/tools/quic_transport_simple_server_session.cc
@@ -176,6 +176,12 @@
break;
}
break;
+
+ case OUTGOING_BIDIRECTIONAL:
+ stream->set_visitor(std::make_unique<DiscardVisitor>(stream));
+ ++pending_outgoing_bidirectional_streams_;
+ MaybeCreateOutgoingBidirectionalStream();
+ break;
}
}
@@ -183,6 +189,8 @@
bool unidirectional) {
if (mode_ == ECHO && unidirectional) {
MaybeEchoStreamsBack();
+ } else if (mode_ == OUTGOING_BIDIRECTIONAL && !unidirectional) {
+ MaybeCreateOutgoingBidirectionalStream();
}
}
@@ -208,6 +216,10 @@
mode_ = ECHO;
return true;
}
+ if (url.path() == "/receive-bidirectional") {
+ mode_ = OUTGOING_BIDIRECTIONAL;
+ return true;
+ }
QUIC_DLOG(WARNING) << "Unknown path requested: " << url.path();
return false;
@@ -246,4 +258,21 @@
}
}
+void QuicTransportSimpleServerSession::
+ MaybeCreateOutgoingBidirectionalStream() {
+ while (pending_outgoing_bidirectional_streams_ > 0 &&
+ CanOpenNextOutgoingBidirectionalStream()) {
+ auto stream_owned = std::make_unique<QuicTransportStream>(
+ GetNextOutgoingBidirectionalStreamId(), this, this);
+ QuicTransportStream* stream = stream_owned.get();
+ ActivateStream(std::move(stream_owned));
+ QUIC_DVLOG(1) << "Opened outgoing bidirectional stream " << stream->id();
+ stream->set_visitor(std::make_unique<BidirectionalEchoVisitor>(stream));
+ if (!stream->Write("hello")) {
+ QUIC_DVLOG(1) << "Write failed.";
+ }
+ --pending_outgoing_bidirectional_streams_;
+ }
+}
+
} // namespace quic
diff --git a/quic/tools/quic_transport_simple_server_session.h b/quic/tools/quic_transport_simple_server_session.h
index 7a5fb09..7cfd197 100644
--- a/quic/tools/quic_transport_simple_server_session.h
+++ b/quic/tools/quic_transport_simple_server_session.h
@@ -34,6 +34,13 @@
// a server-initiated unidirectional stream that is sent as soon as a FIN is
// received on the incoming stream.
ECHO,
+ // In OUTGOING_BIDIRECTIONAL mode, a server-originated bidirectional stream
+ // is created on receipt of a unidirectional stream. The contents of the
+ // unidirectional stream are disregarded. The bidirectional stream initially
+ // sends "hello", then any received data is echoed back.
+ // TODO(ricea): Maybe this should be replaced by a more general mechanism
+ // where commands on the unidirectional stream trigger different behaviour?
+ OUTGOING_BIDIRECTIONAL,
};
QuicTransportSimpleServerSession(
@@ -60,8 +67,10 @@
private:
void MaybeEchoStreamsBack();
+ void MaybeCreateOutgoingBidirectionalStream();
const bool owns_connection_;
+ size_t pending_outgoing_bidirectional_streams_ = 0u;
Mode mode_;
std::vector<url::Origin> accepted_origins_;
QuicCircularDeque<std::string> streams_to_echo_back_;