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