| // 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_ |