xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/core/http/quic_header_list.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright (c) 2016 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_header_list.h"
6 
7 #include <limits>
8 #include <string>
9 
10 #include "absl/strings/string_view.h"
11 #include "quiche/quic/core/qpack/qpack_header_table.h"
12 #include "quiche/quic/core/quic_packets.h"
13 #include "quiche/quic/platform/api/quic_flags.h"
14 
15 namespace quic {
16 
QuicHeaderList()17 QuicHeaderList::QuicHeaderList()
18     : max_header_list_size_(std::numeric_limits<size_t>::max()),
19       current_header_list_size_(0),
20       uncompressed_header_bytes_(0),
21       compressed_header_bytes_(0) {}
22 
23 QuicHeaderList::QuicHeaderList(QuicHeaderList&& other) = default;
24 
25 QuicHeaderList::QuicHeaderList(const QuicHeaderList& other) = default;
26 
27 QuicHeaderList& QuicHeaderList::operator=(const QuicHeaderList& other) =
28     default;
29 
30 QuicHeaderList& QuicHeaderList::operator=(QuicHeaderList&& other) = default;
31 
~QuicHeaderList()32 QuicHeaderList::~QuicHeaderList() {}
33 
OnHeaderBlockStart()34 void QuicHeaderList::OnHeaderBlockStart() {
35   QUIC_BUG_IF(quic_bug_12518_1, current_header_list_size_ != 0)
36       << "OnHeaderBlockStart called more than once!";
37 }
38 
OnHeader(absl::string_view name,absl::string_view value)39 void QuicHeaderList::OnHeader(absl::string_view name, absl::string_view value) {
40   // Avoid infinite buffering of headers. No longer store headers
41   // once the current headers are over the limit.
42   if (current_header_list_size_ < max_header_list_size_) {
43     current_header_list_size_ += name.size();
44     current_header_list_size_ += value.size();
45     current_header_list_size_ += kQpackEntrySizeOverhead;
46     header_list_.emplace_back(std::string(name), std::string(value));
47   }
48 }
49 
OnHeaderBlockEnd(size_t uncompressed_header_bytes,size_t compressed_header_bytes)50 void QuicHeaderList::OnHeaderBlockEnd(size_t uncompressed_header_bytes,
51                                       size_t compressed_header_bytes) {
52   uncompressed_header_bytes_ = uncompressed_header_bytes;
53   compressed_header_bytes_ = compressed_header_bytes;
54   if (current_header_list_size_ > max_header_list_size_) {
55     Clear();
56   }
57 }
58 
Clear()59 void QuicHeaderList::Clear() {
60   header_list_.clear();
61   current_header_list_size_ = 0;
62   uncompressed_header_bytes_ = 0;
63   compressed_header_bytes_ = 0;
64 }
65 
DebugString() const66 std::string QuicHeaderList::DebugString() const {
67   std::string s = "{ ";
68   for (const auto& p : *this) {
69     s.append(p.first + "=" + p.second + ", ");
70   }
71   s.append("}");
72   return s;
73 }
74 
75 }  // namespace quic
76