packages feed

http3-0.0.0: Network/QPACK/Table/Static.hs

{-# 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 = length 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 sidx)
  | sidx < staticTableSize = staticTable `unsafeAt` sidx
  | otherwise              = E.impureThrow IllegalStaticIndex

-- | Pre-defined static table.
staticTable :: Array Index Entry
staticTable = listArray (1,staticTableSize) $ map toEntry staticTableList

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

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