summaryrefslogtreecommitdiff
path: root/app/Web/Utils.hs
diff options
context:
space:
mode:
Diffstat (limited to 'app/Web/Utils.hs')
-rw-r--r--app/Web/Utils.hs46
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"),