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