@@ -0,0 +1,47 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
3+module HeadersText (headers) where
4+
5+import Control.Applicative
6+import Criterion.Main (bench, bgroup, nf)
7+import Criterion.Types (Benchmark)
8+import Data.Char (isSpace)
9+import qualified Data.Attoparsec.Text as T
10+import qualified Data.Text.IO as T
11+
12+header = do
13+ name <- T.takeWhile1 (T.inClass "a-zA-Z0-9_-") <* T.char ':' <* T.skipSpace
14+ body <- (:) <$> bodyLine <*> many (T.takeWhile1 isSpace *> bodyLine)
15+ return (name, body)
16+
17+bodyLine = T.takeTill (\c -> c == '\r' || c == '\n') <* T.endOfLine
18+
19+requestLine =
20+ (,,) <$>
21+ (method <* T.skipSpace) <*>
22+ (T.takeTill isSpace <* T.skipSpace) <*>
23+ httpVersion
24+ where method = "GET" <|> "POST"
25+
26+httpVersion = "HTTP/" *> ((,) <$> (int <* T.char '.') <*> int)
27+
28+responseLine = (,,) <$>
29+ (httpVersion <* T.skipSpace) <*>
30+ (int <* T.skipSpace) <*>
31+ bodyLine
32+
33+int :: T.Parser Int
34+int = T.decimal
35+
36+request = (,) <$> (requestLine <* T.endOfLine) <*> many header
37+
38+response = (,) <$> responseLine <*> many header
39+
40+headers :: IO Benchmark
41+headers = do
42+ req <- T.readFile "http-request.txt"
43+ resp <- T.readFile "http-response.txt"
44+ return $ bgroup "headersT" [
45+ bench "request" $ nf (T.parseOnly request) req
46+ , bench "response" $ nf (T.parseOnly response) resp
47+ ]