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