@@ -9,6 +9,7 @@ module Servant.Common.Req where
99-- import Control.Monad.Catch (MonadThrow)
1010-- import Control.Monad.IO.Class
1111-- import Control.Monad.Trans.Except
12+import Control.Applicative (liftA2)
1213import Data.ByteString.Char8 hiding (pack, filter, map, null, elem)
1314import qualified Data.ByteString.Lazy.Char8 as BL
1415import qualified Data.Text.Encoding as TE
@@ -96,10 +97,26 @@ performRequest :: forall t m.MonadWidget t m => String -> Req t -> Dynamic t Bas
9697 -- -> ExceptT ServantError IO ( Int, ByteString, MediaType
9798 -- , [HTTP.Header], Response ByteString)
9899performRequest reqMethod req _ trigger = do
100+
101+ -- Ridiculous functor-juggling! How to clean this up?
99102 let t :: Behavior t [Maybe String] = sequence $ reqPathParts req
100103 let urlParts :: Behavior t (Maybe [String]) = fmap sequence t
101104 let urlPath :: Behavior t (Maybe String) = (fmap.fmap) (L.intercalate "/") urlParts
102− xhrReq = (fmap . fmap) (\p -> XhrRequest reqMethod p def) urlPath
105+
106+ let oneNamedPair :: String -> [String] -> String
107+ oneNamedPair pName ps =
108+ L.intercalate "&" $ map (\p -> pName ++ "=" ++ p) ps
109+
110+ t' :: [Behavior t String]
111+ t' = map (\(pName, pVals) -> fmap (oneNamedPair pName) pVals)
112+ (qParams req)
113+
114+ queryString :: Behavior t String
115+ queryString = fmap (L.intercalate "&") (sequence t')
116+
117+ xhrUrl = (liftA2 . liftA2) (\u q -> u ++ '?' : q) urlPath (fmap Just queryString)
118+ xhrReq = (fmap . fmap) (\p -> XhrRequest reqMethod p def) xhrUrl
119+
103120 performRequestAsync (fmapMaybe id $ tag xhrReq trigger)
104121
105122-- TODO implement