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)
parseRequestURITokens :: ByteString -> Either String (ByteString, ByteString)
parseRequestURITokens x = pure $
let pathInfo = B.takeWhile (/= '?') x
queryString = B.dropWhile (== '?') . B.dropWhile (/= '?') $ x
in
(pathInfo, queryString)