// Copyright 2016 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.

// Defines HpackDecoderListener, the base class of listeners for HTTP header
// lists decoded from an HPACK block.

#ifndef QUICHE_HTTP2_HPACK_DECODER_HPACK_DECODER_LISTENER_H_
#define QUICHE_HTTP2_HPACK_DECODER_HPACK_DECODER_LISTENER_H_

#include "absl/strings/string_view.h"
#include "quiche/http2/hpack/http2_hpack_constants.h"
#include "quiche/common/platform/api/quiche_export.h"

namespace http2 {

class QUICHE_EXPORT HpackDecoderListener {
 public:
  HpackDecoderListener();
  virtual ~HpackDecoderListener();

  // OnHeaderListStart is called at the start of decoding an HPACK block into
  // an HTTP/2 header list. Will only be called once per block, even if it
  // extends into CONTINUATION frames.
  virtual void OnHeaderListStart() = 0;

  // Called for each header name-value pair that is decoded, in the order they
  // appear in the HPACK block. Multiple values for a given key will be emitted
  // as multiple calls to OnHeader.
  virtual void OnHeader(const std::string& name, const std::string& value) = 0;

  // OnHeaderListEnd is called after successfully decoding an HPACK block into
  // an HTTP/2 header list. Will only be called once per block, even if it
  // extends into CONTINUATION frames.
  virtual void OnHeaderListEnd() = 0;

  // OnHeaderErrorDetected is called if an error is detected while decoding.
  // error_message may be used in a GOAWAY frame as the Opaque Data.
  virtual void OnHeaderErrorDetected(absl::string_view error_message) = 0;
};

// A no-op implementation of HpackDecoderListener, useful for ignoring
// callbacks once an error is detected.
class QUICHE_EXPORT HpackDecoderNoOpListener : public HpackDecoderListener {
 public:
  HpackDecoderNoOpListener();
  ~HpackDecoderNoOpListener() override;

  void OnHeaderListStart() override;
  void OnHeader(const std::string& name, const std::string& value) override;
  void OnHeaderListEnd() override;
  void OnHeaderErrorDetected(absl::string_view error_message) override;

  // Returns a listener that ignores all the calls.
  static HpackDecoderNoOpListener* NoOpListener();
};

}  // namespace http2

#endif  // QUICHE_HTTP2_HPACK_DECODER_HPACK_DECODER_LISTENER_H_
