// 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"

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
