File: HeadersText.hs

package info (click to toggle)
haskell-attoparsec 0.14.4-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 880 kB
  • sloc: haskell: 4,749; ansic: 170; makefile: 22
file content (56 lines) | stat: -rw-r--r-- 1,663 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
module HeadersText (headers) where

import Common (pathTo, rechunkT)
import Control.Applicative
import Test.Tasty.Bench (Benchmark, bench, bgroup, nf)
import Data.Char (isSpace)
import qualified Data.Attoparsec.Text as T
import qualified Data.Attoparsec.Text.Lazy as TL
import qualified Data.Text.IO as T

header = do
  name <- T.takeWhile1 (T.inClass "a-zA-Z0-9_-") <* T.char ':' <* T.skipSpace
  body <- (:) <$> bodyLine <*> many (T.takeWhile1 isSpace *> bodyLine)
  return (name, body)

bodyLine = T.takeTill (\c -> c == '\r' || c == '\n') <* T.endOfLine

requestLine =
    (,,) <$>
    (method <* T.skipSpace) <*>
    (T.takeTill isSpace <* T.skipSpace) <*>
    httpVersion
  where method = "GET" <|> "POST"

httpVersion = "HTTP/" *> ((,) <$> (int <* T.char '.') <*> int)

responseLine = (,,) <$>
               (httpVersion <* T.skipSpace) <*>
               (int <* T.skipSpace) <*>
               bodyLine

int :: T.Parser Int
int = T.decimal

request = (,) <$> (requestLine <* T.endOfLine) <*> many header

response = (,) <$> responseLine <*> many header

headers :: IO Benchmark
headers = do
  req <- T.readFile =<< pathTo "http-request.txt"
  resp <- T.readFile =<< pathTo "http-response.txt"
  let reql    = rechunkT 4 req
      respl   = rechunkT 4 resp
  return $ bgroup "headers" [
      bgroup "T" [
        bench "request" $ nf (T.parseOnly request) req
      , bench "response" $ nf (T.parseOnly response) resp
      ]
    , bgroup "TL" [
        bench "request" $ nf (TL.parse request) reql
      , bench "response" $ nf (TL.parse response) respl
      ]
    ]