text: /* Copyright (c) 2017 - 2021 LiteSpeed Technologies Inc.  See LICENSE. */
  /*
   * lsquic_hq.h -- HTTP/3 (originally "HTTP over QUIC" or HQ) types
   */
  
  #ifndef LSQUIC_HQ_H
  #define LSQUIC_HQ_H 1
  
  struct lsquic_ext_http_prio;
  
  /* [draft-ietf-quic-http-27] Section 11.2.1 */
  enum hq_frame_type
  {
      HQFT_DATA           = 0,
      HQFT_HEADERS        = 1,
      HQFT_CANCEL_PUSH    = 3,
      HQFT_SETTINGS       = 4,
      HQFT_PUSH_PROMISE   = 5,
      HQFT_GOAWAY         = 7,
      HQFT_MAX_PUSH_ID    = 0xD,
      /* These made me expand shf_frame_type to 4 bytes from 1.  If at some
       * point we have to support a frame that is wider than 4 byte, it will
       * be time to bite the bullet and use our own enum for these types
       * (just like we do for transport parameters).  A simpler alternative
       * would be to drop the enum and use #define's, but it would stink...
       */
      HQFT_PRIORITY_UPDATE_STREAM= 0xF0700,
      HQFT_PRIORITY_UPDATE_PUSH  = 0xF0701,
      /* This frame is made up and its type is never written to stream.
       * Nevertheless, just to be on the safe side, give it a value as
       * described in [draft-ietf-quic-http-20] Section 4.2.10.
       */
      HQFT_PUSH_PREAMBLE  = 0x1F * 3 + 0x21,
  };
  
  
  enum hq_setting_id
  {
      HQSID_QPACK_MAX_TABLE_CAPACITY  = 1,
      HQSID_MAX_HEADER_LIST_SIZE      = 6,
      HQSID_QPACK_BLOCKED_STREAMS     = 7,
  };
  
  /* As of 12/18/2018: */
  #define HQ_DF_QPACK_MAX_TABLE_CAPACITY 0
  #define HQ_DF_MAX_HEADER_LIST_SIZE 0
  #define HQ_DF_QPACK_BLOCKED_STREAMS 0
  
  
  /* [draft-ietf-quic-http-19] Section 10.6,
   * [draft-ietf-quic-qpack-07] Section 8.2
   */
  enum hq_uni_stream_type
  {
      HQUST_CONTROL   = 0,
      HQUST_PUSH      = 1,
      HQUST_QPACK_ENC = 2,
      HQUST_QPACK_DEC = 3,
  };
  
  
  /* [draft-ietf-quic-http-23] Section 8.1 and
   * [draft-ietf-quic-qpack-08], Section 8.3
   */
  enum http_error_code
  {
      HEC_NO_ERROR                =  0x100,
      HEC_GENERAL_PROTOCOL_ERROR  =  0x101,
      HEC_INTERNAL_ERROR          =  0x102,
      HEC_STREAM_CREATION_ERROR   =  0x103,
      HEC_CLOSED_CRITICAL_STREAM  =  0x104,
      HEC_FRAME_UNEXPECTED        =  0x105,
      HEC_FRAME_ERROR             =  0x106,
      HEC_EXCESSIVE_LOAD          =  0x107,
      HEC_ID_ERROR                =  0x108,
      HEC_SETTINGS_ERROR          =  0x109,
      HEC_MISSING_SETTINGS        =  0x10A,
      HEC_REQUEST_REJECTED        =  0x10B,
      HEC_REQUEST_CANCELLED       =  0x10C,
      HEC_REQUEST_INCOMPLETE      =  0x10D,
      HEC_CONNECT_ERROR           =  0x10F,
      HEC_VERSION_FALLBACK        =  0x110,
      HEC_QPACK_DECOMPRESSION_FAILED  = 0x200,
      HEC_QPACK_ENCODER_STREAM_ERROR  = 0x201,
      HEC_QPACK_DECODER_STREAM_ERROR  = 0x202,
  };
  
  
  enum ppc_flags
  {
      PPC_URG_NAME = 1 << 0,
      PPC_INC_NAME = 1 << 1,
      PPC_URG_SET  = 1 << 2,      /* 'urgency' is set */
      PPC_INC_SET  = 1 << 3,      /* 'incremental' is set */
  };
  
  
  int
  lsquic_http_parse_pfv (const char *, size_t, enum ppc_flags * /* optional */,
                             struct lsquic_ext_http_prio *, char *str, size_t);
  
  #endif
  