content: {-# LANGUAGE OverloadedStrings #-}
  
  -- | Framing in HTTP\/2(<https://www.rfc-editor.org/rfc/rfc9113>).
  module Network.HTTP2.Frame (
      -- * Frame
      Frame (..),
      FrameHeader (..),
      FramePayload (..),
      HeaderBlockFragment,
      Padding,
      isPaddingDefined,
  
      -- * Encoding
      encodeFrame,
      encodeFrameChunks,
      encodeFrameHeader,
      encodeFrameHeaderBuf,
      encodeFramePayload,
      EncodeInfo (..),
      encodeInfo,
      module Network.HTTP2.Frame.Decode,
  
      -- * Frame type
      FrameType (
          FrameType,
          FrameData,
          FrameHeaders,
          FramePriority,
          FrameRSTStream,
          FrameSettings,
          FramePushPromise,
          FramePing,
          FrameGoAway,
          FrameWindowUpdate,
          FrameContinuation
      ),
      fromFrameType,
      toFrameType,
      minFrameType,
      maxFrameType,
      framePayloadToFrameType,
  
      -- * Priority
      Priority (..),
      Weight,
  
      -- * Stream identifier
      StreamId,
      isControl,
      isClientInitiated,
      isServerInitiated,
  
      -- * Stream identifier related
      testExclusive,
      setExclusive,
      clearExclusive,
  
      -- * Flags
      FrameFlags,
      defaultFlags,
      testEndStream,
      testAck,
      testEndHeader,
      testPadded,
      testPriority,
      setEndStream,
      setAck,
      setEndHeader,
      setPadded,
      setPriority,
  
      -- * SettingsList
      SettingsList,
      SettingsKey (
          SettingsKey,
          SettingsTokenHeaderTableSize,
          SettingsEnablePush,
          SettingsMaxConcurrentStreams,
          SettingsInitialWindowSize,
          SettingsMaxFrameSize,
          SettingsMaxHeaderListSize
      ),
      SettingsValue,
      fromSettingsKey,
      toSettingsKey,
  
      -- * Payload length
      defaultPayloadLength,
      maxPayloadLength,
  
      -- * Window
      WindowSize,
      defaultWindowSize,
      maxWindowSize,
      isWindowOverflow,
  
      -- * Error code
      ErrorCode (
          ErrorCode,
          NoError,
          ProtocolError,
          InternalError,
          FlowControlError,
          SettingsTimeout,
          StreamClosed,
          FrameSizeError,
          RefusedStream,
          Cancel,
          CompressionError,
          ConnectError,
          EnhanceYourCalm,
          InadequateSecurity,
          HTTP11Required
      ),
      fromErrorCode,
      toErrorCode,
  
      -- * Predefined values
      connectionPreface,
      connectionPrefaceLength,
      frameHeaderLength,
      recommendedConcurrency,
  
      -- * Deprecated
      ErrorCodeId,
      SettingsKeyId,
      FrameTypeId,
  ) where
  
  import qualified Data.ByteString as BS
  import Network.Control (WindowSize)
  
  import Imports
  import Network.HTTP2.Frame.Decode
  import Network.HTTP2.Frame.Encode
  import Network.HTTP2.Frame.Types
  
  -- | The preface of HTTP\/2.
  --
  -- >>> connectionPreface
  -- "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
  connectionPreface :: ByteString
  connectionPreface = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
  
  -- | Length of the preface.
  --
  -- >>> connectionPrefaceLength
  -- 24
  connectionPrefaceLength :: Int
  connectionPrefaceLength = BS.length connectionPreface
  