http-pony-serve-wai-0.1.0.0: src/Network/HTTP/Pony/Serve/Wai/Parser.hs
-- | Parser
{-# LANGUAGE OverloadedStrings #-}
module Network.HTTP.Pony.Serve.Wai.Parser where
import Data.Attoparsec.ByteString (Parser)
import qualified Data.Attoparsec.ByteString.Char8 as Char
import Data.ByteString.Char8 (ByteString)
import qualified Data.ByteString.Char8 as B
import qualified Data.CaseInsensitive as CI
import Data.Char (ord)
import qualified Network.HTTP.Types as HTTP
import Pipes (Producer)
type RequestURI = ByteString
requestLineTokens :: Parser (HTTP.Method, RequestURI, HTTP.HttpVersion)
requestLineTokens = do
method <- Char.takeTill (== ' ')
Char.char ' '
requestURI <- Char.takeTill (== ' ')
Char.char ' '
Char.string "HTTP/"
let minusZero = (+) (- ord '0')
charToInt = minusZero . ord
digit = fmap charToInt Char.digit
httpVersionMajor<- digit
Char.char '.'
httpVersionMinor <- digit
pure (method, requestURI, HTTP.HttpVersion httpVersionMajor httpVersionMinor)
-- requestURITokens :: Parser (ByteString, ByteString)
-- requestURITokens = do
-- ( (,) <$> Char.takeTill (== '?')
-- <*> (Char.char '?' >> takeByteString)
-- )
-- <|>
-- ( (,) <$> takeByteString
-- <*> pure mempty
-- )
parseRequestURITokens :: ByteString -> Either String (ByteString, ByteString)
parseRequestURITokens x = pure $
let pathInfo = B.takeWhile (/= '?') x
queryString = B.dropWhile (== '?') . B.dropWhile (/= '?') $ x
in
(pathInfo, queryString)