content: {-# LANGUAGE OverloadedStrings #-}
  
  module Network.HPACK.Table.Static (
      toStaticEntry,
      staticTableSize,
      staticTableList,
  ) where
  
  import Data.Array (Array, listArray)
  import Data.Array.Base (unsafeAt)
  import Network.HPACK.Table.Entry
  import Network.HTTP.Types (Header)
  
  ----------------------------------------------------------------
  
  -- | The size of static table.
  staticTableSize :: Size
  staticTableSize = length staticTableList
  
  {-# INLINE toStaticEntry #-}
  
  -- | Get 'Entry' from the static table.
  --
  -- >>> toStaticEntry 1
  -- Entry 42 (Token {tokenIx = 0, shouldBeIndexed = True, isPseudo = True, tokenKey = ":authority"}) ""
  -- >>> toStaticEntry 8
  -- Entry 42 (Token {tokenIx = 4, shouldBeIndexed = True, isPseudo = True, tokenKey = ":status"}) "200"
  -- >>> toStaticEntry 50
  -- Entry 37 (Token {tokenIx = 40, shouldBeIndexed = True, isPseudo = False, tokenKey = "Range"}) ""
  toStaticEntry :: Index -> Entry
  toStaticEntry sidx = staticTable `unsafeAt` (sidx - 1)
  
  -- | Pre-defined static table.
  staticTable :: Array Index Entry
  staticTable = listArray (1, staticTableSize) $ map toEntry staticTableList
  
  ----------------------------------------------------------------
  
  staticTableList :: [Header]
  staticTableList =
      [ (":authority", "")
      , (":method", "GET")
      , (":method", "POST")
      , (":path", "/")
      , (":path", "/index.html")
      , (":scheme", "http")
      , (":scheme", "https")
      , (":status", "200")
      , (":status", "204")
      , (":status", "206")
      , (":status", "304")
      , (":status", "400")
      , (":status", "404")
      , (":status", "500")
      , ("accept-charset", "")
      , ("accept-encoding", "gzip, deflate")
      , ("accept-language", "")
      , ("accept-ranges", "")
      , ("accept", "")
      , ("access-control-allow-origin", "")
      , ("age", "")
      , ("allow", "")
      , ("authorization", "")
      , ("cache-control", "")
      , ("content-disposition", "")
      , ("content-encoding", "")
      , ("content-language", "")
      , ("content-length", "")
      , ("content-location", "")
      , ("content-range", "")
      , ("content-type", "")
      , ("cookie", "")
      , ("date", "")
      , ("etag", "")
      , ("expect", "")
      , ("expires", "")
      , ("from", "")
      , ("host", "")
      , ("if-match", "")
      , ("if-modified-since", "")
      , ("if-none-match", "")
      , ("if-range", "")
      , ("if-unmodified-since", "")
      , ("last-modified", "")
      , ("link", "")
      , ("location", "")
      , ("max-forwards", "")
      , ("proxy-authenticate", "")
      , ("proxy-authorization", "")
      , ("range", "")
      , ("referer", "")
      , ("refresh", "")
      , ("retry-after", "")
      , ("server", "")
      , ("set-cookie", "")
      , ("strict-transport-security", "")
      , ("transfer-encoding", "")
      , ("user-agent", "")
      , ("vary", "")
      , ("via", "")
      , ("www-authenticate", "")
      ]
  