xref: /aosp_15_r20/external/cronet/net/third_party/quiche/src/quiche/quic/core/http/metadata_decoder.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2024 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/metadata_decoder.h"
6 
7 #include <cstddef>
8 #include <utility>
9 
10 #include "absl/strings/str_cat.h"
11 #include "absl/strings/string_view.h"
12 #include "quiche/quic/core/http/quic_header_list.h"
13 #include "quiche/quic/core/quic_error_codes.h"
14 #include "quiche/quic/core/quic_types.h"
15 #include "quiche/quic/platform/api/quic_bug_tracker.h"
16 
17 namespace quic {
18 
MetadataDecoder(QuicStreamId id,size_t max_header_list_size,size_t frame_header_len,size_t payload_length)19 MetadataDecoder::MetadataDecoder(QuicStreamId id, size_t max_header_list_size,
20                                  size_t frame_header_len, size_t payload_length)
21     : qpack_decoder_(/*maximum_dynamic_table_capacity=*/0,
22                      /*maximum_blocked_streams=*/0, &delegate_),
23       accumulator_(id, &qpack_decoder_, &decoder_, max_header_list_size),
24       frame_len_(frame_header_len + payload_length),
25       bytes_remaining_(payload_length) {}
26 
Decode(absl::string_view payload)27 bool MetadataDecoder::Decode(absl::string_view payload) {
28   accumulator_.Decode(payload);
29   bytes_remaining_ -= payload.length();
30   return decoder_.error_code() == QUIC_NO_ERROR;
31 }
32 
EndHeaderBlock()33 bool MetadataDecoder::EndHeaderBlock() {
34   QUIC_BUG_IF(METADATA bytes remaining, bytes_remaining_ != 0)
35       << "More metadata remaining: " << bytes_remaining_;
36 
37   accumulator_.EndHeaderBlock();
38   return !decoder_.header_list_size_limit_exceeded();
39 }
40 
OnHeadersDecoded(QuicHeaderList headers,bool header_list_size_limit_exceeded)41 void MetadataDecoder::MetadataHeadersDecoder::OnHeadersDecoded(
42     QuicHeaderList headers, bool header_list_size_limit_exceeded) {
43   header_list_size_limit_exceeded_ = header_list_size_limit_exceeded;
44   headers_ = std::move(headers);
45 }
46 
OnHeaderDecodingError(QuicErrorCode error_code,absl::string_view error_message)47 void MetadataDecoder::MetadataHeadersDecoder::OnHeaderDecodingError(
48     QuicErrorCode error_code, absl::string_view error_message) {
49   error_code_ = error_code;
50   error_message_ = absl::StrCat("Error decoding metadata: ", error_message);
51 }
52 
53 }  // namespace quic
54