{-# LANGUAGE OverloadedStrings #-}

module Network.QPACK.Table.Static (
    toStaticEntry
  , staticTableSize
  , staticTableList
  ) where

import Data.Array (Array, listArray)
import Data.Array.Base (unsafeAt)
import Network.HPACK.Internal
import qualified UnliftIO.Exception as E

import Network.QPACK.Error
import Network.QPACK.Types

----------------------------------------------------------------

-- | The size of static table.
staticTableSize :: Size
staticTableSize :: Size
staticTableSize = [Header] -> Size
forall (t :: * -> *) a. Foldable t => t a -> Size
length [Header]
staticTableList

{-# INLINE toStaticEntry #-}
-- | Get 'Entry' from the static table.
--
-- >>> toStaticEntry 1
-- Entry 38 (Token {tokenIx = 2, shouldBeIndexed = False, isPseudo = True, tokenKey = ":path"}) "/"
-- >>> toStaticEntry 8
-- Entry 49 (Token {tokenIx = 30, shouldBeIndexed = True, isPseudo = False, tokenKey = "If-Modified-Since"}) ""
-- >>> toStaticEntry 50
-- Entry 53 (Token {tokenIx = 21, shouldBeIndexed = True, isPseudo = False, tokenKey = "Content-Type"}) "image/png"
toStaticEntry :: AbsoluteIndex -> Entry
toStaticEntry :: AbsoluteIndex -> Entry
toStaticEntry (AbsoluteIndex Size
sidx)
  | Size
sidx Size -> Size -> Bool
forall a. Ord a => a -> a -> Bool
< Size
staticTableSize = Array Size Entry
staticTable Array Size Entry -> Size -> Entry
forall (a :: * -> * -> *) e i.
(IArray a e, Ix i) =>
a i e -> Size -> e
`unsafeAt` Size
sidx
  | Bool
otherwise              = DecodeError -> Entry
forall e a. Exception e => e -> a
E.impureThrow DecodeError
IllegalStaticIndex

-- | Pre-defined static table.
staticTable :: Array Index Entry
staticTable :: Array Size Entry
staticTable = (Size, Size) -> [Entry] -> Array Size Entry
forall i e. Ix i => (i, i) -> [e] -> Array i e
listArray (Size
1,Size
staticTableSize) ([Entry] -> Array Size Entry) -> [Entry] -> Array Size Entry
forall a b. (a -> b) -> a -> b
$ (Header -> Entry) -> [Header] -> [Entry]
forall a b. (a -> b) -> [a] -> [b]
map Header -> Entry
toEntry [Header]
staticTableList

----------------------------------------------------------------

staticTableList :: [Header]
staticTableList :: [Header]
staticTableList = [
    (HeaderName
":authority", HeaderName
"")
  , (HeaderName
":path", HeaderName
"/")
  , (HeaderName
"age", HeaderName
"0")
  , (HeaderName
"content-disposition", HeaderName
"")
  , (HeaderName
"content-length", HeaderName
"0")
  , (HeaderName
"cookie", HeaderName
"")
  , (HeaderName
"date", HeaderName
"")
  , (HeaderName
"etag", HeaderName
"")
  , (HeaderName
"if-modified-since", HeaderName
"")
  , (HeaderName
"if-none-match", HeaderName
"")
  , (HeaderName
"last-modified", HeaderName
"")
  , (HeaderName
"link", HeaderName
"")
  , (HeaderName
"location", HeaderName
"")
  , (HeaderName
"referer", HeaderName
"")
  , (HeaderName
"set-cookie", HeaderName
"")
  , (HeaderName
":method", HeaderName
"CONNECT")
  , (HeaderName
":method", HeaderName
"DELETE")
  , (HeaderName
":method", HeaderName
"GET")
  , (HeaderName
":method", HeaderName
"HEAD")
  , (HeaderName
":method", HeaderName
"OPTIONS")
  , (HeaderName
":method", HeaderName
"POST")
  , (HeaderName
":method", HeaderName
"PUT")
  , (HeaderName
":scheme", HeaderName
"http")
  , (HeaderName
":scheme", HeaderName
"https")
  , (HeaderName
":status", HeaderName
"103")
  , (HeaderName
":status", HeaderName
"200")
  , (HeaderName
":status", HeaderName
"304")
  , (HeaderName
":status", HeaderName
"404")
  , (HeaderName
":status", HeaderName
"503")
  , (HeaderName
"accept", HeaderName
"*/*")
  , (HeaderName
"accept", HeaderName
"application/dns-message")
  , (HeaderName
"accept-encoding", HeaderName
"gzip, deflate, br")
  , (HeaderName
"accept-ranges", HeaderName
"bytes")
  , (HeaderName
"access-control-allow-headers", HeaderName
"cache-control")
  , (HeaderName
"access-control-allow-headers", HeaderName
"content-type")
  , (HeaderName
"access-control-allow-origin", HeaderName
"*")
  , (HeaderName
"cache-control", HeaderName
"max-age=0")
  , (HeaderName
"cache-control", HeaderName
"max-age=2592000")
  , (HeaderName
"cache-control", HeaderName
"max-age=604800")
  , (HeaderName
"cache-control", HeaderName
"no-cache")
  , (HeaderName
"cache-control", HeaderName
"no-store")
  , (HeaderName
"cache-control", HeaderName
"public, age=31536000")
  , (HeaderName
"content-encoding", HeaderName
"br")
  , (HeaderName
"content-encoding", HeaderName
"gzip")
  , (HeaderName
"content-type", HeaderName
"application/dns-message")
  , (HeaderName
"content-type", HeaderName
"application/javascript")
  , (HeaderName
"content-type", HeaderName
"application/json")
  , (HeaderName
"content-type", HeaderName
"application/x-www-form-urlencoded")
  , (HeaderName
"content-type", HeaderName
"image/gif")
  , (HeaderName
"content-type", HeaderName
"image/jpeg")
  , (HeaderName
"content-type", HeaderName
"image/png")
  , (HeaderName
"content-type", HeaderName
"text/css")
  , (HeaderName
"content-type", HeaderName
"text/html; charset=utf-8")
  , (HeaderName
"content-type", HeaderName
"text/plain")
  , (HeaderName
"content-type", HeaderName
"text/plain;charset=utf-8")
  , (HeaderName
"range", HeaderName
"bytes=0-")
  , (HeaderName
"strict-transport-security", HeaderName
"max-age=31536000")
  , (HeaderName
"strict-transport-security", HeaderName
"max-age=31536000; includesubdomains")
  , (HeaderName
"strict-transport-security", HeaderName
"max-age=31536000; includesubdomains; preload")
  , (HeaderName
"vary", HeaderName
"accept-encoding")
  , (HeaderName
"vary", HeaderName
"origin")
  , (HeaderName
"x-content-type-options", HeaderName
"nosniff")
  , (HeaderName
"x-xss-protection", HeaderName
"1; mode=block")
  , (HeaderName
":status", HeaderName
"100")
  , (HeaderName
":status", HeaderName
"204")
  , (HeaderName
":status", HeaderName
"206")
  , (HeaderName
":status", HeaderName
"302")
  , (HeaderName
":status", HeaderName
"400")
  , (HeaderName
":status", HeaderName
"403")
  , (HeaderName
":status", HeaderName
"421")
  , (HeaderName
":status", HeaderName
"425")
  , (HeaderName
":status", HeaderName
"500")
  , (HeaderName
"accept-language", HeaderName
"")
  , (HeaderName
"access-control-allow-credentials", HeaderName
"FALSE")
  , (HeaderName
"access-control-allow-credentials", HeaderName
"TRUE")
  , (HeaderName
"access-control-allow-headers", HeaderName
"*")
  , (HeaderName
"access-control-allow-methods", HeaderName
"get")
  , (HeaderName
"access-control-allow-methods", HeaderName
"get, post, options")
  , (HeaderName
"access-control-allow-methods", HeaderName
"options")
  , (HeaderName
"access-control-expose-headers", HeaderName
"content-length")
  , (HeaderName
"access-control-request-headers", HeaderName
"content-type")
  , (HeaderName
"access-control-request-method", HeaderName
"get")
  , (HeaderName
"access-control-request-method", HeaderName
"post")
  , (HeaderName
"alt-svc", HeaderName
"clear")
  , (HeaderName
"authorization", HeaderName
"")
  , (HeaderName
"content-security-policy", HeaderName
"script-src 'none'; object-src 'none'; base-uri 'none'")
  , (HeaderName
"early-data", HeaderName
"1")
  , (HeaderName
"expect-ct", HeaderName
"")
  , (HeaderName
"forwarded", HeaderName
"")
  , (HeaderName
"if-range", HeaderName
"")
  , (HeaderName
"origin", HeaderName
"")
  , (HeaderName
"purpose", HeaderName
"prefetch")
  , (HeaderName
"server", HeaderName
"")
  , (HeaderName
"timing-allow-origin", HeaderName
"*")
  , (HeaderName
"upgrade-insecure-requests", HeaderName
"1")
  , (HeaderName
"user-agent", HeaderName
"")
  , (HeaderName
"x-forwarded-for", HeaderName
"")
  , (HeaderName
"x-frame-options", HeaderName
"deny")
  , (HeaderName
"x-frame-options", HeaderName
"sameorigin")
  ]