on master help sign in
adding indexResponseHeader.
commit2b33ba1846401cc19b480d5762b7c633cf38c9a7 authorKazu Yamamoto <kazu@iij.ad.jp> dateWed 30 Oct 2013, 15:44 (13 years ago) parent59beab1
1 file changed+33−13
warp/Network/Wai/Handler/Warp/Header.hs+33−13
warp/Network/Wai/Handler/Warp/Header.hs+33−13
@@ -15,7 +15,7 @@ type IndexedHeader = Array Int (Maybe HeaderValue)
1515----------------------------------------------------------------
1616
1717indexRequestHeader :: RequestHeaders -> IndexedHeader
18−indexRequestHeader hdr = traverseHeader hdr requestMaxIndex
18+indexRequestHeader hdr = traverseHeader hdr requestMaxIndex requestKeyIndex
1919
2020idxContentLength,idxTransferEncoding,idxExpect :: Int
2121idxConnection,idxRange,idxHost :: Int
@@ -30,6 +30,15 @@ idxHost = 5
3030requestMaxIndex :: Int
3131requestMaxIndex = 5
3232
33+requestKeyIndex :: HeaderName -> Int
34+requestKeyIndex "content-length" = idxContentLength
35+requestKeyIndex "transfer-encoding" = idxTransferEncoding
36+requestKeyIndex "expect" = idxExpect
37+requestKeyIndex "connection" = idxConnection
38+requestKeyIndex "range" = idxRange
39+requestKeyIndex "host" = idxHost
40+requestKeyIndex _ = -1
41+
3342-- | Default 'IndexedHeader' for HTTP Request.
3443-- All valuers are 'Nothing' by default.
3544-- They correspond to \"Content-Length\", \"Transfer-Encoding\",
@@ -39,8 +48,28 @@ defaultIndexRequestHeader = array (0,requestMaxIndex) [(i,Nothing)|i<-[0..reques
3948
4049----------------------------------------------------------------
4150
42−traverseHeader :: [Header] -> Int -> IndexedHeader
43−traverseHeader hdr maxidx = runSTArray $ do
51+indexResponseHeader :: ResponseHeaders -> IndexedHeader
52+indexResponseHeader hdr = traverseHeader hdr responseMaxIndex responseKeyIndex
53+
54+idxContentRange,idxServer :: Int
55+--idxContentLength = 0
56+idxContentRange = 1
57+idxServer = 2
58+
59+-- | The size for 'IndexedHeader' for HTTP Response.
60+responseMaxIndex :: Int
61+responseMaxIndex = 2
62+
63+responseKeyIndex :: HeaderName -> Int
64+responseKeyIndex "content-length" = idxContentLength
65+responseKeyIndex "content-range" = idxContentRange
66+responseKeyIndex "server" = idxServer
67+responseKeyIndex _ = -1
68+
69+----------------------------------------------------------------
70+
71+traverseHeader :: [Header] -> Int -> (HeaderName -> Int) -> IndexedHeader
72+traverseHeader hdr maxidx getIndex = runSTArray $ do
4473 arr <- newArray (0,maxidx) Nothing
4574 mapM_ (insert arr) hdr
4675 return arr
@@ -49,13 +78,4 @@ traverseHeader hdr maxidx = runSTArray $ do
4978 | idx == -1 = return ()
5079 | otherwise = writeArray arr idx (Just val)
5180 where
52− idx = keyIndex key
53−
54−keyIndex :: HeaderName -> Int
55−keyIndex "content-length" = idxContentLength
56−keyIndex "transfer-encoding" = idxTransferEncoding
57−keyIndex "expect" = idxExpect
58−keyIndex "connection" = idxConnection
59−keyIndex "range" = idxRange
60−keyIndex "host" = idxHost
61−keyIndex _ = -1
81+ idx = getIndex key