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