| // Copyright 2024 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "quiche/quic/core/http/metadata_decoder.h" |
| |
| #include <cstddef> |
| #include <utility> |
| |
| #include "absl/strings/str_cat.h" |
| #include "absl/strings/string_view.h" |
| #include "quiche/quic/core/http/quic_header_list.h" |
| #include "quiche/quic/core/quic_error_codes.h" |
| #include "quiche/quic/core/quic_types.h" |
| #include "quiche/quic/platform/api/quic_bug_tracker.h" |
| |
| namespace quic { |
| |
| MetadataDecoder::MetadataDecoder(QuicStreamId id, size_t max_header_list_size, |
| size_t frame_header_len, size_t payload_length) |
| : qpack_decoder_(/*maximum_dynamic_table_capacity=*/0, |
| /*maximum_blocked_streams=*/0, &delegate_), |
| accumulator_(id, &qpack_decoder_, &decoder_, max_header_list_size), |
| frame_len_(frame_header_len + payload_length), |
| bytes_remaining_(payload_length) {} |
| |
| bool MetadataDecoder::Decode(absl::string_view payload) { |
| accumulator_.Decode(payload); |
| bytes_remaining_ -= payload.length(); |
| return decoder_.error_code() == QUIC_NO_ERROR; |
| } |
| |
| bool MetadataDecoder::EndHeaderBlock() { |
| QUIC_BUG_IF(METADATA bytes remaining, bytes_remaining_ != 0) |
| << "More metadata remaining: " << bytes_remaining_; |
| |
| accumulator_.EndHeaderBlock(); |
| return !decoder_.header_list_size_limit_exceeded(); |
| } |
| |
| void MetadataDecoder::MetadataHeadersDecoder::OnHeadersDecoded( |
| QuicHeaderList headers, bool header_list_size_limit_exceeded) { |
| header_list_size_limit_exceeded_ = header_list_size_limit_exceeded; |
| headers_ = std::move(headers); |
| } |
| |
| void MetadataDecoder::MetadataHeadersDecoder::OnHeaderDecodingError( |
| QuicErrorCode error_code, absl::string_view error_message) { |
| error_code_ = error_code; |
| error_message_ = absl::StrCat("Error decoding metadata: ", error_message); |
| } |
| |
| } // namespace quic |