@@ -28,6 +28,7 @@ import qualified Data.Text as T
2828import qualified Data.Text.Encoding as TE
2929import Data.Traversable (forM)
3030import Language.Javascript.JSaddle.Monad (JSM, MonadJSM)
31+import qualified Network.URI as N
3132import Reflex.Dom hiding (tag)
3233import Servant.Common.BaseUrl (BaseUrl, showBaseUrl,
3334 SupportsServantReflex)
@@ -170,7 +171,7 @@ reqToReflexRequest reqMeth reqHost req =
170171
171172 urlPath :: Dynamic t (Either Text Text)
172173 urlPath = (fmap.fmap)
173− (T.intercalate "/" . fmap (builderToText . toEncodedUrlPiece))
174+ (T.intercalate "/" . fmap escape)
174175 urlParts
175176
176177 queryPartString :: (Text, QueryPart t) -> Dynamic t (Maybe (Either Text Text))
@@ -182,7 +183,9 @@ reqToReflexRequest reqMeth reqHost req =
182183 QueryPartParams ps -> ffor ps $ \pStrings ->
183184 if null pStrings
184185 then Nothing
185− else Just $ Right (T.intercalate "&" (fmap (\p -> pName <> "=" <> p) pStrings))
186+ else Just . Right
187+ . T.intercalate "&"
188+ $ fmap (\p -> pName <> "=" <> escape p) pStrings
186189 QueryPartFlag fl -> ffor fl $ \case
187190 True -> Just $ Right pName
188191 False -> Nothing
@@ -400,3 +403,6 @@ fmapL f (Left e) = Left (f e)
400403
401404builderToText :: Builder.Builder -> T.Text
402405builderToText = TE.decodeUtf8 . BL.toStrict . Builder.toLazyByteString
406+
407+escape :: T.Text -> T.Text
408+escape = T.pack . N.escapeURIString (not . N.isReserved) . T.unpack . TE.decodeUtf8 . BL.toStrict . Builder.toLazyByteString . toEncodedUrlPiece