@@ -1,54 +1,14 @@
1−{-# LANGUAGE BangPatterns, OverloadedStrings #-}
2−{-# OPTIONS_GHC -fno-warn-missing-signatures -fno-warn-orphans #-}
31module HeadersByteString (headers) where
42
53import Common (pathTo, rechunkBS)
6−import Control.Applicative
7−import Control.DeepSeq (NFData(..))
84import Criterion.Main (bench, bgroup, nf, nfIO)
95import Criterion.Types (Benchmark)
6+import HeadersByteString.Atto (request, response)
107import Network.Wai.Handler.Warp.RequestHeader (parseHeaderLines)
11−import Network.HTTP.Types.Version (HttpVersion, http11)
128import qualified Data.Attoparsec.ByteString.Char8 as B
139import qualified Data.Attoparsec.ByteString.Lazy as BL
1410import qualified Data.ByteString.Char8 as B
1511
16−instance NFData HttpVersion where
17− rnf !_ = ()
18−
19−header = do
20− name <- B.takeWhile1 (B.inClass "a-zA-Z0-9_-") <* B.char ':' <* B.skipSpace
21− body <- bodyLine
22− return (name, body)
23−
24−bodyLine = B.takeTill (\c -> c == '\r' || c == '\n') <* B.endOfLine
25−
26−requestLine = do
27− m <- (B.takeTill B.isSpace <* B.char ' ')
28− (p,q) <- B.break (=='?') <$> (B.takeTill B.isSpace <* B.char ' ')
29− v <- httpVersion
30− return (m,p,q,v)
31−
32−httpVersion = http11 <$ "HTTP/1.1"
33−
34−responseLine = (,,) <$>
35− (httpVersion <* B.skipSpace) <*>
36− (int <* B.skipSpace) <*>
37− bodyLine
38−
39−int :: B.Parser Int
40−int = B.decimal
41−
42−request = (,) <$> (requestLine <* B.endOfLine) <*> manyheader
43−
44−response = (,) <$> responseLine <*> many header
45−
46−manyheader = do
47− c <- B.peekChar'
48− if c == '\r' || c == '\n'
49− then return []
50− else (:) <$> header <*> manyheader
51−
5212headers :: IO Benchmark
5313headers = do
5414 req <- B.readFile =<< pathTo "http-request.txt"