|  | // Copyright (c) 2012 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. | 
|  |  | 
|  | // A toy server specific QuicSession subclass. | 
|  |  | 
|  | #ifndef QUICHE_QUIC_TOOLS_QUIC_SIMPLE_SERVER_SESSION_H_ | 
|  | #define QUICHE_QUIC_TOOLS_QUIC_SIMPLE_SERVER_SESSION_H_ | 
|  |  | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <list> | 
|  | #include <memory> | 
|  | #include <set> | 
|  | #include <string> | 
|  | #include <utility> | 
|  | #include <vector> | 
|  |  | 
|  | #include "quiche/quic/core/http/quic_server_session_base.h" | 
|  | #include "quiche/quic/core/http/quic_spdy_session.h" | 
|  | #include "quiche/quic/core/quic_crypto_server_stream_base.h" | 
|  | #include "quiche/quic/core/quic_packets.h" | 
|  | #include "quiche/quic/tools/quic_backend_response.h" | 
|  | #include "quiche/quic/tools/quic_simple_server_backend.h" | 
|  | #include "quiche/quic/tools/quic_simple_server_stream.h" | 
|  | #include "quiche/common/http/http_header_block.h" | 
|  |  | 
|  | namespace quic { | 
|  |  | 
|  | namespace test { | 
|  | class QuicSimpleServerSessionPeer; | 
|  | }  // namespace test | 
|  |  | 
|  | class QuicSimpleServerSession : public QuicServerSessionBase { | 
|  | public: | 
|  | // Takes ownership of |connection|. | 
|  | QuicSimpleServerSession(const QuicConfig& config, | 
|  | const ParsedQuicVersionVector& supported_versions, | 
|  | QuicConnection* connection, | 
|  | QuicSession::Visitor* visitor, | 
|  | QuicCryptoServerStreamBase::Helper* helper, | 
|  | const QuicCryptoServerConfig* crypto_config, | 
|  | QuicCompressedCertsCache* compressed_certs_cache, | 
|  | QuicSimpleServerBackend* quic_simple_server_backend); | 
|  | QuicSimpleServerSession(const QuicSimpleServerSession&) = delete; | 
|  | QuicSimpleServerSession& operator=(const QuicSimpleServerSession&) = delete; | 
|  |  | 
|  | ~QuicSimpleServerSession() override; | 
|  |  | 
|  | // Override base class to detact client sending data on server push stream. | 
|  | void OnStreamFrame(const QuicStreamFrame& frame) override; | 
|  |  | 
|  | protected: | 
|  | // QuicSession methods: | 
|  | QuicSpdyStream* CreateIncomingStream(QuicStreamId id) override; | 
|  | QuicSpdyStream* CreateIncomingStream(PendingStream* pending) override; | 
|  | QuicSpdyStream* CreateOutgoingBidirectionalStream() override; | 
|  | QuicSimpleServerStream* CreateOutgoingUnidirectionalStream() override; | 
|  |  | 
|  | // QuicServerSessionBaseMethod: | 
|  | std::unique_ptr<QuicCryptoServerStreamBase> CreateQuicCryptoServerStream( | 
|  | const QuicCryptoServerConfig* crypto_config, | 
|  | QuicCompressedCertsCache* compressed_certs_cache) override; | 
|  |  | 
|  | // Overridden to handle conversion from bidi pending stream. | 
|  | QuicStream* ProcessBidirectionalPendingStream( | 
|  | PendingStream* pending) override; | 
|  |  | 
|  | QuicSimpleServerBackend* server_backend() { | 
|  | return quic_simple_server_backend_; | 
|  | } | 
|  |  | 
|  | WebTransportHttp3VersionSet LocallySupportedWebTransportVersions() | 
|  | const override { | 
|  | return quic_simple_server_backend_->SupportsWebTransport() | 
|  | ? kDefaultSupportedWebTransportVersions | 
|  | : WebTransportHttp3VersionSet(); | 
|  | } | 
|  | HttpDatagramSupport LocalHttpDatagramSupport() override { | 
|  | if (ShouldNegotiateWebTransport()) { | 
|  | return HttpDatagramSupport::kRfcAndDraft04; | 
|  | } | 
|  | return QuicServerSessionBase::LocalHttpDatagramSupport(); | 
|  | } | 
|  |  | 
|  | private: | 
|  | friend class test::QuicSimpleServerSessionPeer; | 
|  |  | 
|  | QuicSimpleServerBackend* quic_simple_server_backend_;  // Not owned. | 
|  | }; | 
|  |  | 
|  | }  // namespace quic | 
|  |  | 
|  | #endif  // QUICHE_QUIC_TOOLS_QUIC_SIMPLE_SERVER_SESSION_H_ |