@@ -15,7 +15,7 @@ type IndexedHeader = Array Int (Maybe HeaderValue)
15----------------------------------------------------------------
15----------------------------------------------------------------
17indexRequestHeader :: RequestHeaders -> IndexedHeader
17indexRequestHeader :: RequestHeaders -> IndexedHeader
18−indexRequestHeader hdr = traverseHeader hdr requestMaxIndex
18+indexRequestHeader hdr = traverseHeader hdr requestMaxIndex requestKeyIndex
20idxContentLength,idxTransferEncoding,idxExpect :: Int
20idxContentLength,idxTransferEncoding,idxExpect :: Int
21idxConnection,idxRange,idxHost :: Int
21idxConnection,idxRange,idxHost :: Int
@@ -30,6 +30,15 @@ idxHost = 5
30requestMaxIndex :: Int
30requestMaxIndex :: Int
31requestMaxIndex = 5
31requestMaxIndex = 5
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
33-- | Default 'IndexedHeader' for HTTP Request.
42-- | Default 'IndexedHeader' for HTTP Request.
34-- All valuers are 'Nothing' by default.
43-- All valuers are 'Nothing' by default.
35-- They correspond to \"Content-Length\", \"Transfer-Encoding\",
44-- They correspond to \"Content-Length\", \"Transfer-Encoding\",
@@ -39,8 +48,28 @@ defaultIndexRequestHeader = array (0,requestMaxIndex) [(i,Nothing)|i<-[0..reques
40----------------------------------------------------------------
49----------------------------------------------------------------
51+indexResponseHeader :: ResponseHeaders -> IndexedHeader
52+indexResponseHeader hdr = traverseHeader hdr responseMaxIndex responseKeyIndex
54+idxContentRange,idxServer :: Int
55+--idxContentLength = 0
59+-- | The size for 'IndexedHeader' for HTTP Response.
60+responseMaxIndex :: Int
63+responseKeyIndex :: HeaderName -> Int
64+responseKeyIndex "content-length" = idxContentLength
65+responseKeyIndex "content-range" = idxContentRange
66+responseKeyIndex "server" = idxServer
67+responseKeyIndex _ = -1
69+----------------------------------------------------------------
42−traverseHeader :: [Header] -> Int -> IndexedHeader
71+traverseHeader :: [Header] -> Int -> (HeaderName -> Int) -> IndexedHeader
43−traverseHeader hdr maxidx = runSTArray $ do
72+traverseHeader hdr maxidx getIndex = runSTArray $ do
44 arr <- newArray (0,maxidx) Nothing
73 arr <- newArray (0,maxidx) Nothing
45 mapM_ (insert arr) hdr
74 mapM_ (insert arr) hdr
46 return arr
75 return arr
@@ -49,13 +78,4 @@ traverseHeader hdr maxidx = runSTArray $ do
49 | idx == -1 = return ()
78 | idx == -1 = return ()
50 | otherwise = writeArray arr idx (Just val)
79 | otherwise = writeArray arr idx (Just val)
52− idx = keyIndex key
81+ idx = getIndex key
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