xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2014 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/core/http/quic_spdy_client_session_base.h"
6 
7 #include <string>
8 
9 #include "quiche/quic/core/quic_utils.h"
10 #include "quiche/quic/platform/api/quic_flags.h"
11 #include "quiche/quic/platform/api/quic_logging.h"
12 
13 using spdy::Http2HeaderBlock;
14 
15 namespace quic {
16 
QuicSpdyClientSessionBase(QuicConnection * connection,QuicSession::Visitor * visitor,const QuicConfig & config,const ParsedQuicVersionVector & supported_versions)17 QuicSpdyClientSessionBase::QuicSpdyClientSessionBase(
18     QuicConnection* connection, QuicSession::Visitor* visitor,
19     const QuicConfig& config, const ParsedQuicVersionVector& supported_versions)
20     : QuicSpdySession(connection, visitor, config, supported_versions) {}
21 
~QuicSpdyClientSessionBase()22 QuicSpdyClientSessionBase::~QuicSpdyClientSessionBase() {
23   DeleteConnection();
24 }
25 
OnConfigNegotiated()26 void QuicSpdyClientSessionBase::OnConfigNegotiated() {
27   QuicSpdySession::OnConfigNegotiated();
28 }
29 
OnStreamClosed(QuicStreamId stream_id)30 void QuicSpdyClientSessionBase::OnStreamClosed(QuicStreamId stream_id) {
31   QuicSpdySession::OnStreamClosed(stream_id);
32   if (!VersionUsesHttp3(transport_version())) {
33     headers_stream()->MaybeReleaseSequencerBuffer();
34   }
35 }
36 
ShouldReleaseHeadersStreamSequencerBuffer()37 bool QuicSpdyClientSessionBase::ShouldReleaseHeadersStreamSequencerBuffer() {
38   return !HasActiveRequestStreams();
39 }
40 
ShouldKeepConnectionAlive() const41 bool QuicSpdyClientSessionBase::ShouldKeepConnectionAlive() const {
42   return QuicSpdySession::ShouldKeepConnectionAlive() ||
43          num_outgoing_draining_streams() > 0;
44 }
45 
OnSettingsFrame(const SettingsFrame & frame)46 bool QuicSpdyClientSessionBase::OnSettingsFrame(const SettingsFrame& frame) {
47   if (!was_zero_rtt_rejected()) {
48     if (max_outbound_header_list_size() != std::numeric_limits<size_t>::max() &&
49         frame.values.find(SETTINGS_MAX_FIELD_SECTION_SIZE) ==
50             frame.values.end()) {
51       CloseConnectionWithDetails(
52           QUIC_HTTP_ZERO_RTT_RESUMPTION_SETTINGS_MISMATCH,
53           "Server accepted 0-RTT but omitted non-default "
54           "SETTINGS_MAX_FIELD_SECTION_SIZE");
55       return false;
56     }
57 
58     if (qpack_encoder()->maximum_blocked_streams() != 0 &&
59         frame.values.find(SETTINGS_QPACK_BLOCKED_STREAMS) ==
60             frame.values.end()) {
61       CloseConnectionWithDetails(
62           QUIC_HTTP_ZERO_RTT_RESUMPTION_SETTINGS_MISMATCH,
63           "Server accepted 0-RTT but omitted non-default "
64           "SETTINGS_QPACK_BLOCKED_STREAMS");
65       return false;
66     }
67 
68     if (qpack_encoder()->MaximumDynamicTableCapacity() != 0 &&
69         frame.values.find(SETTINGS_QPACK_MAX_TABLE_CAPACITY) ==
70             frame.values.end()) {
71       CloseConnectionWithDetails(
72           QUIC_HTTP_ZERO_RTT_RESUMPTION_SETTINGS_MISMATCH,
73           "Server accepted 0-RTT but omitted non-default "
74           "SETTINGS_QPACK_MAX_TABLE_CAPACITY");
75       return false;
76     }
77   }
78 
79   if (!QuicSpdySession::OnSettingsFrame(frame)) {
80     return false;
81   }
82   std::string settings_frame = HttpEncoder::SerializeSettingsFrame(frame);
83   auto serialized_data = std::make_unique<ApplicationState>(
84       settings_frame.data(), settings_frame.data() + settings_frame.length());
85   GetMutableCryptoStream()->SetServerApplicationStateForResumption(
86       std::move(serialized_data));
87   return true;
88 }
89 
90 }  // namespace quic
91