3 | import Data.ByteString
4 | import Data.SortedMap as SM
6 | import HTTP.Parser.Header
8 | import Text.ILex.DStack
10 | import public HTTP.Header.Types
12 | %hide Data.Linear.(.)
16 | record Headers where
17 | constructor MkHeaders
22 | kvList : Headers -> List (String,ByteString)
23 | kvList = kvList . headers
26 | emptyHeaders : Headers
27 | emptyHeaders = MkHeaders empty
34 | insertHeader : (name : String) -> ByteString -> Headers -> Headers
35 | insertHeader name value = {headers $= insert (toUpper name) value}
41 | lookupUpperCaseHeader : (name : String) -> Headers -> Maybe ByteString
42 | lookupUpperCaseHeader n = lookup n . headers
50 | lookupHeader : (name : String) -> Headers -> Maybe ByteString
51 | lookupHeader = lookupUpperCaseHeader . toUpper
62 | Authorization : String
63 | Authorization = "AUTHORIZATION"
66 | Content_Length : String
67 | Content_Length = "CONTENT-LENGTH"
70 | Content_Type : String
71 | Content_Type = "CONTENT-TYPE"
74 | Content_Disposition : String
75 | Content_Disposition = "CONTENT-DISPOSITION"
77 | headerMay : {st : _} -> {x : _} -> String -> HRes st x t -> Headers -> Maybe t
78 | headerMay nm res hs =
79 | lookupUpperCaseHeader nm hs >>= \bs => headerMay res bs
81 | headerVal : {st : _} -> {x : _} -> String -> HRes st x t -> t -> Headers -> t
82 | headerVal nm res v hs =
83 | fromMaybe v $
lookupUpperCaseHeader nm hs >>= \bs => headerMay res bs
87 | accept : Headers -> MediaRanges
88 | accept = headerVal Accept RAcc []
93 | acceptsMedia : Headers -> MediaType -> Bool
94 | acceptsMedia hs mt = any (flip accepts mt . type) (accept hs)
98 | contentDisposition : Headers -> Maybe ContentDisp
99 | contentDisposition = headerMay Content_Disposition RConD
103 | contentType : Headers -> Maybe ContentType
104 | contentType = headerMay Content_Type RConT
109 | hasContentType : Headers -> MediaType -> Bool
110 | hasContentType hs t = Just t == map type (contentType hs)
114 | contentLength : Headers -> Nat
115 | contentLength = headerVal Content_Length RConL 0
118 | parseHeaders : Origin -> ByteString -> Either (ParseError Void) Headers
119 | parseHeaders o = map MkHeaders . parseBytes (header RMap) o
122 | parseHeadersMay : ByteString -> Maybe Headers
123 | parseHeadersMay = map MkHeaders . headerMay RMap
130 | testParseHeaders : ByteString -> IO ()
132 | either (putStrLn . interpolate) printPairs . parseHeaders Virtual
135 | printPairs : Headers -> IO ()
136 | printPairs hs = for_ (kvList hs) $
\(n,v) => putStrLn "\{n}: \{v}"