diff options
Diffstat (limited to 'app/Web/Utils.hs')
| -rw-r--r-- | app/Web/Utils.hs | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/app/Web/Utils.hs b/app/Web/Utils.hs index 97bc512..e77754f 100644 --- a/app/Web/Utils.hs +++ b/app/Web/Utils.hs @@ -1,12 +1,11 @@ module Web.Utils (parseQs, parseHttp, getStatus) where import Network.HTTP.Types.URI as URI -import qualified Data.ByteString as S -import Data.ByteString (ByteString) import qualified Data.Text as T import Data.Text.Encoding (encodeUtf8, decodeUtf8) import Data.Text (Text) +import Data.Maybe (catMaybes) import Web.Http import Web.Request @@ -25,18 +24,17 @@ parseQs url = parsePair :: Text -> Maybe QueryPair parsePair s - | T.any ((==) '=') s = Just (QueryPair a b) + | T.any ((==) '=') s = + case T.splitOn (T.pack "=") s of + [] -> Nothing + [_] -> Nothing + key : val : _ -> Just (QueryPair key val) | otherwise = Nothing - where a : b : _ = T.splitOn (T.pack "=") s - - get (Just p : rest) = p : get rest - get (Nothing : rest) = get rest - get [] = [] - pairs = + pairs = if T.null rest then [] - else get $ map parsePair $ T.splitOn (T.pack "&") $ T.tail rest + else catMaybes $ map parsePair $ T.splitOn (T.pack "&") $ T.tail rest in (path, pairs) @@ -51,12 +49,16 @@ parseMethod s | s == (T.pack "PUT") = PUT | otherwise = GET +-- TODO: добавить нормальную обработку ошибочных ситуаций parseFirstLine :: Text -> (Method, Text) -parseFirstLine l = (parseMethod methodT, url) - where [methodT, url, _] = T.words l +parseFirstLine l = + case T.words l of + [] -> undefined + [_] -> undefined + methodT : url : _ -> (parseMethod methodT, url) parseHeader :: Text -> Header -parseHeader line = +parseHeader line = Header (T.takeWhile p line) (T.strip $ T.tail $ T.dropWhile p line) where p = (\c -> c /= ':') @@ -64,28 +66,32 @@ parseHeader line = parseHeaders :: [Text] -> [Header] parseHeaders = map parseHeader --- parseHttp :: Text -> ((Method, Text, [QueryPair]), [Header], [Text]) parseHttp :: Text -> (Request, [Header], [Text]) -parseHttp text = +parseHttp text = let - lines = T.splitOn (T.pack "\r\n") text + textLines = T.splitOn (T.pack "\r\n") text getFirstLine (l : rest) = (l, rest) + -- TODO: добавить нормальную обработку ошибочных ситуаций + getFirstLine [] = undefined getHeaders (l : rest) acc | T.null l = (rev acc, rest) | otherwise = getHeaders rest (l : acc) - - (fl, rest1) = getFirstLine lines + -- TODO: добавить нормальную обработку ошибочных ситуаций + getHeaders [] _ = undefined + + (fl, rest1) = getFirstLine textLines (headers, rest2) = getHeaders rest1 [] (method, url) = parseFirstLine fl (path, query) = parseQs url - in + in ((Request query path method), parseHeaders headers, rest2) -- HTTP Status Codes -statusCodes = +statusCodes :: [(Int, String)] +statusCodes = [ (100, "Continue"), (101, "Switching Protocols"), (102, "Processing"), |