on master help sign in
Enum instance for header indices.
commit7977dea2b7ea335abfbaaa26303391520a27e79d authorKazu Yamamoto <kazu@iij.ad.jp> dateMon 7 Dec 2015, 13:01 (11 years ago) parent47ed0cc
4 files changed+42−44
warp/Network/Wai/Handler/Warp/File.hs+5−5 warp/Network/Wai/Handler/Warp/Header.hs+28−30 warp/Network/Wai/Handler/Warp/Request.hs+5−5 warp/Network/Wai/Handler/Warp/Response.hs+4−4
warp/Network/Wai/Handler/Warp/File.hs+5−5
@@ -52,13 +52,13 @@ conditionalRequest finfo hs0 reqidx = case condition of
5252----------------------------------------------------------------
5353
5454ifModifiedSince :: IndexedHeader -> Maybe HTTPDate
55−ifModifiedSince reqidx = reqidx ! idxIfModifiedSince >>= parseHTTPDate
55+ifModifiedSince reqidx = reqidx ! fromEnum ReqIfModifiedSince >>= parseHTTPDate
5656
5757ifUnmodifiedSince :: IndexedHeader -> Maybe HTTPDate
58−ifUnmodifiedSince reqidx = reqidx ! idxIfUnmodifiedSince >>= parseHTTPDate
58+ifUnmodifiedSince reqidx = reqidx ! fromEnum ReqIfUnmodifiedSince >>= parseHTTPDate
5959
6060ifRange :: IndexedHeader -> Maybe HTTPDate
61−ifRange reqidx = reqidx ! idxIfRange >>= parseHTTPDate
61+ifRange reqidx = reqidx ! fromEnum ReqIfRange >>= parseHTTPDate
6262
6363----------------------------------------------------------------
6464
@@ -79,13 +79,13 @@ ifunmodified reqidx size mtime = do
7979ifrange :: IndexedHeader -> Integer -> HTTPDate -> Maybe RspFileInfo
8080ifrange reqidx size mtime = do
8181 date <- ifRange reqidx
82− rng <- reqidx ! idxRange
82+ rng <- reqidx ! fromEnum ReqRange
8383 return $ if date == mtime
8484 then parseRange rng size
8585 else WithBody H.ok200 [] 0 size
8686
8787unconditional :: IndexedHeader -> Integer -> RspFileInfo
88−unconditional reqidx size = case reqidx ! idxRange of
88+unconditional reqidx size = case reqidx ! fromEnum ReqRange of
8989 Nothing -> WithBody H.ok200 [] 0 size
9090 Just rng -> parseRange rng size
9191
warp/Network/Wai/Handler/Warp/Header.hs+28−30
@@ -17,36 +17,34 @@ type IndexedHeader = Array Int (Maybe HeaderValue)
1717indexRequestHeader :: RequestHeaders -> IndexedHeader
1818indexRequestHeader hdr = traverseHeader hdr requestMaxIndex requestKeyIndex
1919
20−idxContentLength,idxTransferEncoding,idxExpect :: Int
21−idxConnection,idxRange,idxHost :: Int
22−idxIfModifiedSince,idxIfUnmodifiedSince,idxIfRange :: Int
23−idxContentLength = 0
24−idxTransferEncoding = 1
25−idxExpect = 2
26−idxConnection = 3
27−idxRange = 4
28−idxHost = 5
29−idxIfModifiedSince = 6
30−idxIfUnmodifiedSince = 7
31−idxIfRange = 8
20+data RequestHeaderIndex = ReqContentLength
21+ | ReqTransferEncoding
22+ | ReqExpect
23+ | ReqConnection
24+ | ReqRange
25+ | ReqHost
26+ | ReqIfModifiedSince
27+ | ReqIfUnmodifiedSince
28+ | ReqIfRange
29+ deriving (Enum,Bounded)
3230
3331-- | The size for 'IndexedHeader' for HTTP Request.
3432-- From 0 to this corresponds to \"Content-Length\", \"Transfer-Encoding\",
3533-- \"Expect\", \"Connection\", \"Range\", \"Host\",
3634-- \"If-Modified-Since\", \"If-Unmodified-Since\" and \"If-Range\".
3735requestMaxIndex :: Int
38−requestMaxIndex = 8
36+requestMaxIndex = fromEnum (maxBound :: RequestHeaderIndex)
3937
4038requestKeyIndex :: HeaderName -> Int
41−requestKeyIndex "content-length" = idxContentLength
42−requestKeyIndex "transfer-encoding" = idxTransferEncoding
43−requestKeyIndex "expect" = idxExpect
44−requestKeyIndex "connection" = idxConnection
45−requestKeyIndex "range" = idxRange
46−requestKeyIndex "host" = idxHost
47−requestKeyIndex "if-modified-since" = idxIfModifiedSince
48−requestKeyIndex "if-unmodified-since" = idxIfUnmodifiedSince
49−requestKeyIndex "if-range" = idxIfRange
39+requestKeyIndex "content-length" = fromEnum ReqContentLength
40+requestKeyIndex "transfer-encoding" = fromEnum ReqTransferEncoding
41+requestKeyIndex "expect" = fromEnum ReqExpect
42+requestKeyIndex "connection" = fromEnum ReqConnection
43+requestKeyIndex "range" = fromEnum ReqRange
44+requestKeyIndex "host" = fromEnum ReqHost
45+requestKeyIndex "if-modified-since" = fromEnum ReqIfModifiedSince
46+requestKeyIndex "if-unmodified-since" = fromEnum ReqIfUnmodifiedSince
47+requestKeyIndex "if-range" = fromEnum ReqIfRange
5048requestKeyIndex _ = -1
5149
5250defaultIndexRequestHeader :: IndexedHeader
@@ -57,19 +55,19 @@ defaultIndexRequestHeader = array (0,requestMaxIndex) [(i,Nothing)|i<-[0..reques
5755indexResponseHeader :: ResponseHeaders -> IndexedHeader
5856indexResponseHeader hdr = traverseHeader hdr responseMaxIndex responseKeyIndex
5957
60−idxServer, idxDate :: Int
61−--idxContentLength = 0
62−idxServer = 1
63−idxDate = 2
58+data ResponseHeaderIndex = ResContentLength
59+ | ResServer
60+ | ResDate
61+ deriving (Enum,Bounded)
6462
6563-- | The size for 'IndexedHeader' for HTTP Response.
6664responseMaxIndex :: Int
67−responseMaxIndex = 2
65+responseMaxIndex = fromEnum (maxBound :: ResponseHeaderIndex)
6866
6967responseKeyIndex :: HeaderName -> Int
70−responseKeyIndex "content-length" = idxContentLength
71−responseKeyIndex "server" = idxServer
72−responseKeyIndex "date" = idxDate
68+responseKeyIndex "content-length" = fromEnum ResContentLength
69+responseKeyIndex "server" = fromEnum ResServer
70+responseKeyIndex "date" = fromEnum ResDate
7371responseKeyIndex _ = -1
7472
7573----------------------------------------------------------------
warp/Network/Wai/Handler/Warp/Request.hs+5−5
@@ -63,9 +63,9 @@ recvRequest settings conn ii addr src = do
6363 hdrlines <- headerLines src
6464 (method, unparsedPath, path, query, httpversion, hdr) <- parseHeaderLines hdrlines
6565 let idxhdr = indexRequestHeader hdr
66− expect = idxhdr ! idxExpect
67− cl = idxhdr ! idxContentLength
68− te = idxhdr ! idxTransferEncoding
66+ expect = idxhdr ! fromEnum ReqExpect
67+ cl = idxhdr ! fromEnum ReqContentLength
68+ te = idxhdr ! fromEnum ReqTransferEncoding
6969 handle100Continue = handleExpect conn httpversion expect
7070 (rbody, remainingRef, bodyLength) <- bodyAndSource src cl te
7171 -- body producing function which will produce '100-continue', if needed
@@ -85,8 +85,8 @@ recvRequest settings conn ii addr src = do
8585 , requestBody = rbody'
8686 , vault = vaultValue
8787 , requestBodyLength = bodyLength
88− , requestHeaderHost = idxhdr ! idxHost
89− , requestHeaderRange = idxhdr ! idxRange
88+ , requestHeaderHost = idxhdr ! fromEnum ReqHost
89+ , requestHeaderRange = idxhdr ! fromEnum ReqRange
9090 }
9191 return (req, remainingRef, idxhdr, rbodyFlush)
9292 where
warp/Network/Wai/Handler/Warp/Response.hs+4−4
@@ -380,7 +380,7 @@ checkPersist req reqidxhdr
380380 | otherwise = checkPersist10 conn
381381 where
382382 ver = httpVersion req
383− conn = reqidxhdr ! idxConnection
383+ conn = reqidxhdr ! fromEnum ReqConnection
384384 checkPersist11 (Just x)
385385 | CI.foldCase x == "close" = False
386386 checkPersist11 _ = True
@@ -405,7 +405,7 @@ infoFromResponse rspidxhdr (isPersist,isChunked) = (isKeepAlive, needsChunked)
405405 where
406406 needsChunked = isChunked && not hasLength
407407 isKeepAlive = isPersist && (isChunked || hasLength)
408− hasLength = isJust $ rspidxhdr ! idxContentLength
408+ hasLength = isJust $ rspidxhdr ! fromEnum ResContentLength
409409
410410----------------------------------------------------------------
411411
@@ -426,7 +426,7 @@ addTransferEncoding hdrs = ("transfer-encoding", "chunked") : hdrs
426426#endif
427427
428428addDate :: D.DateCache -> IndexedHeader -> H.ResponseHeaders -> IO H.ResponseHeaders
429−addDate dc rspidxhdr hdrs = case rspidxhdr ! idxDate of
429+addDate dc rspidxhdr hdrs = case rspidxhdr ! fromEnum ResDate of
430430 Nothing -> do
431431 gmtdate <- D.getDate dc
432432 return $ (H.hDate, gmtdate) : hdrs
@@ -439,7 +439,7 @@ warpVersion :: String
439439warpVersion = showVersion Paths_warp.version
440440
441441addServer :: HeaderValue -> IndexedHeader -> H.ResponseHeaders -> H.ResponseHeaders
442−addServer serverName rspidxhdr hdrs = case rspidxhdr ! idxServer of
442+addServer serverName rspidxhdr hdrs = case rspidxhdr ! fromEnum ResServer of
443443 Nothing -> (H.hServer, serverName) : hdrs
444444 _ -> hdrs
445445