|  | // 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_TOOLS_QUIC_TRANSPORT_SIMPLE_SERVER_SESSION_H_ | 
|  | #define QUICHE_QUIC_TOOLS_QUIC_TRANSPORT_SIMPLE_SERVER_SESSION_H_ | 
|  |  | 
|  | #include <memory> | 
|  | #include <vector> | 
|  |  | 
|  | #include "url/origin.h" | 
|  | #include "quic/core/quic_types.h" | 
|  | #include "quic/core/quic_versions.h" | 
|  | #include "quic/platform/api/quic_containers.h" | 
|  | #include "quic/platform/api/quic_flags.h" | 
|  | #include "quic/quic_transport/quic_transport_server_session.h" | 
|  | #include "quic/quic_transport/quic_transport_stream.h" | 
|  |  | 
|  | namespace quic { | 
|  |  | 
|  | // QuicTransport simple server is a non-production server that can be used for | 
|  | // testing QuicTransport.  It has two modes that can be changed using the | 
|  | // command line flags, "echo" and "discard". | 
|  | class QuicTransportSimpleServerSession | 
|  | : public QuicTransportServerSession, | 
|  | QuicTransportServerSession::ServerVisitor { | 
|  | public: | 
|  | enum Mode { | 
|  | // In DISCARD mode, any data on incoming streams is discarded and no | 
|  | // outgoing streams are initiated. | 
|  | DISCARD, | 
|  | // In ECHO mode, any data sent on a bidirectional stream is echoed back. | 
|  | // Any data sent on a unidirectional stream is buffered, and echoed back on | 
|  | // 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( | 
|  | QuicConnection* connection, | 
|  | bool owns_connection, | 
|  | Visitor* owner, | 
|  | const QuicConfig& config, | 
|  | const ParsedQuicVersionVector& supported_versions, | 
|  | const QuicCryptoServerConfig* crypto_config, | 
|  | QuicCompressedCertsCache* compressed_certs_cache, | 
|  | std::vector<url::Origin> accepted_origins); | 
|  | ~QuicTransportSimpleServerSession(); | 
|  |  | 
|  | void OnIncomingDataStream(QuicTransportStream* stream) override; | 
|  | void OnCanCreateNewOutgoingStream(bool unidirectional) override; | 
|  | bool CheckOrigin(url::Origin origin) override; | 
|  | bool ProcessPath(const GURL& url) override; | 
|  | void OnMessageReceived(absl::string_view message) override; | 
|  |  | 
|  | void EchoStreamBack(const std::string& data) { | 
|  | streams_to_echo_back_.push_back(data); | 
|  | MaybeEchoStreamsBack(); | 
|  | } | 
|  |  | 
|  | private: | 
|  | void MaybeEchoStreamsBack(); | 
|  | void MaybeCreateOutgoingBidirectionalStream(); | 
|  |  | 
|  | const bool owns_connection_; | 
|  | size_t pending_outgoing_bidirectional_streams_ = 0u; | 
|  | Mode mode_; | 
|  | std::vector<url::Origin> accepted_origins_; | 
|  | quiche::QuicheCircularDeque<std::string> streams_to_echo_back_; | 
|  | }; | 
|  |  | 
|  | }  // namespace quic | 
|  |  | 
|  | #endif  // QUICHE_QUIC_TOOLS_QUIC_TRANSPORT_SIMPLE_SERVER_SESSION_H_ |