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

#ifndef NET_HTTP2_HPACK_HTTP2_HPACK_CONSTANTS_H_
#define NET_HTTP2_HPACK_HTTP2_HPACK_CONSTANTS_H_

// Enum HpackEntryType identifies the 5 basic types of HPACK Block Entries.
//
// See the spec for details:
// https://http2.github.io/http2-spec/compression.html#rfc.section.6

#include <ostream>

#include "net/http2/platform/api/http2_export.h"
#include "net/http2/platform/api/http2_string.h"

namespace net {

enum class HpackEntryType {
  // Entry is an index into the static or dynamic table. Decoding it has no
  // effect on the dynamic table.
  kIndexedHeader,

  // The entry contains a literal value. The name may be either a literal or a
  // reference to an entry in the static or dynamic table.
  // The entry is added to the dynamic table after decoding.
  kIndexedLiteralHeader,

  // The entry contains a literal value. The name may be either a literal or a
  // reference to an entry in the static or dynamic table.
  // The entry is not added to the dynamic table after decoding, but a proxy
  // may choose to insert the entry into its dynamic table when forwarding
  // to another endpoint.
  kUnindexedLiteralHeader,

  // The entry contains a literal value. The name may be either a literal or a
  // reference to an entry in the static or dynamic table.
  // The entry is not added to the dynamic table after decoding, and a proxy
  // must NOT insert the entry into its dynamic table when forwarding to another
  // endpoint.
  kNeverIndexedLiteralHeader,

  // Entry conveys the size limit of the dynamic table of the encoder to
  // the decoder. May be used to flush the table by sending a zero and then
  // resetting the size back up to the maximum that the encoder will use
  // (within the limits of SETTINGS_HEADER_TABLE_SIZE sent by the
  // decoder to the encoder, with the default of 4096 assumed).
  kDynamicTableSizeUpdate,
};

// Returns the name of the enum member.
HTTP2_EXPORT_PRIVATE Http2String HpackEntryTypeToString(HpackEntryType v);

// Inserts the name of the enum member into |out|.
HTTP2_EXPORT_PRIVATE std::ostream& operator<<(std::ostream& out,
                                              HpackEntryType v);

}  // namespace net

#endif  // NET_HTTP2_HPACK_HTTP2_HPACK_CONSTANTS_H_