• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "quiche/quic/tools/quic_simple_server_session.h"
6 
7 #include <utility>
8 
9 #include "absl/memory/memory.h"
10 #include "quiche/quic/core/http/quic_server_initiated_spdy_stream.h"
11 #include "quiche/quic/core/http/quic_spdy_session.h"
12 #include "quiche/quic/core/quic_connection.h"
13 #include "quiche/quic/core/quic_stream_priority.h"
14 #include "quiche/quic/core/quic_types.h"
15 #include "quiche/quic/core/quic_utils.h"
16 #include "quiche/quic/platform/api/quic_flags.h"
17 #include "quiche/quic/platform/api/quic_logging.h"
18 #include "quiche/quic/tools/quic_simple_server_stream.h"
19 
20 namespace quic {
21 
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)22 QuicSimpleServerSession::QuicSimpleServerSession(
23     const QuicConfig& config, const ParsedQuicVersionVector& supported_versions,
24     QuicConnection* connection, QuicSession::Visitor* visitor,
25     QuicCryptoServerStreamBase::Helper* helper,
26     const QuicCryptoServerConfig* crypto_config,
27     QuicCompressedCertsCache* compressed_certs_cache,
28     QuicSimpleServerBackend* quic_simple_server_backend)
29     : QuicServerSessionBase(config, supported_versions, connection, visitor,
30                             helper, crypto_config, compressed_certs_cache),
31       quic_simple_server_backend_(quic_simple_server_backend) {
32   QUICHE_DCHECK(quic_simple_server_backend_);
33 }
34 
~QuicSimpleServerSession()35 QuicSimpleServerSession::~QuicSimpleServerSession() { DeleteConnection(); }
36 
37 std::unique_ptr<QuicCryptoServerStreamBase>
CreateQuicCryptoServerStream(const QuicCryptoServerConfig * crypto_config,QuicCompressedCertsCache * compressed_certs_cache)38 QuicSimpleServerSession::CreateQuicCryptoServerStream(
39     const QuicCryptoServerConfig* crypto_config,
40     QuicCompressedCertsCache* compressed_certs_cache) {
41   return CreateCryptoServerStream(crypto_config, compressed_certs_cache, this,
42                                   stream_helper());
43 }
44 
OnStreamFrame(const QuicStreamFrame & frame)45 void QuicSimpleServerSession::OnStreamFrame(const QuicStreamFrame& frame) {
46   if (!IsIncomingStream(frame.stream_id) && !WillNegotiateWebTransport()) {
47     QUIC_LOG(WARNING) << "Client shouldn't send data on server push stream";
48     connection()->CloseConnection(
49         QUIC_INVALID_STREAM_ID, "Client sent data on server push stream",
50         ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
51     return;
52   }
53   QuicSpdySession::OnStreamFrame(frame);
54 }
55 
CreateIncomingStream(QuicStreamId id)56 QuicSpdyStream* QuicSimpleServerSession::CreateIncomingStream(QuicStreamId id) {
57   if (!ShouldCreateIncomingStream(id)) {
58     return nullptr;
59   }
60 
61   QuicSpdyStream* stream = new QuicSimpleServerStream(
62       id, this, BIDIRECTIONAL, quic_simple_server_backend_);
63   ActivateStream(absl::WrapUnique(stream));
64   return stream;
65 }
66 
CreateIncomingStream(PendingStream * pending)67 QuicSpdyStream* QuicSimpleServerSession::CreateIncomingStream(
68     PendingStream* pending) {
69   QuicSpdyStream* stream =
70       new QuicSimpleServerStream(pending, this, quic_simple_server_backend_);
71   ActivateStream(absl::WrapUnique(stream));
72   return stream;
73 }
74 
CreateOutgoingBidirectionalStream()75 QuicSpdyStream* QuicSimpleServerSession::CreateOutgoingBidirectionalStream() {
76   if (!WillNegotiateWebTransport()) {
77     QUIC_BUG(QuicSimpleServerSession CreateOutgoingBidirectionalStream without
78                  WebTransport support)
79         << "QuicSimpleServerSession::CreateOutgoingBidirectionalStream called "
80            "in a session without WebTransport support.";
81     return nullptr;
82   }
83   if (!ShouldCreateOutgoingBidirectionalStream()) {
84     return nullptr;
85   }
86 
87   QuicServerInitiatedSpdyStream* stream = new QuicServerInitiatedSpdyStream(
88       GetNextOutgoingBidirectionalStreamId(), this, BIDIRECTIONAL);
89   ActivateStream(absl::WrapUnique(stream));
90   return stream;
91 }
92 
93 QuicSimpleServerStream*
CreateOutgoingUnidirectionalStream()94 QuicSimpleServerSession::CreateOutgoingUnidirectionalStream() {
95   if (!ShouldCreateOutgoingUnidirectionalStream()) {
96     return nullptr;
97   }
98 
99   QuicSimpleServerStream* stream = new QuicSimpleServerStream(
100       GetNextOutgoingUnidirectionalStreamId(), this, WRITE_UNIDIRECTIONAL,
101       quic_simple_server_backend_);
102   ActivateStream(absl::WrapUnique(stream));
103   return stream;
104 }
105 
106 }  // namespace quic
107