-
Notifications
You must be signed in to change notification settings - Fork 259
/
CleanPath.hs
30 lines (28 loc) · 970 Bytes
/
CleanPath.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{-# LANGUAGE OverloadedStrings #-}
module Network.Wai.Middleware.CleanPath
( cleanPath
) where
import Network.Wai
import qualified Data.ByteString.Char8 as B
import qualified Data.ByteString.Lazy as L
import Network.HTTP.Types (status301)
import Data.Text (Text)
import Data.Monoid (mconcat)
cleanPath :: ([Text] -> Either B.ByteString [Text])
-> B.ByteString
-> ([Text] -> Application)
-> Application
cleanPath splitter prefix app env =
case splitter $ pathInfo env of
Right pieces -> app pieces env
Left p -> return
$ responseLBS status301
[("Location", mconcat [prefix, p, suffix])]
$ L.empty
where
-- include the query string if present
suffix =
case B.uncons $ rawQueryString env of
Nothing -> B.empty
Just ('?', _) -> rawQueryString env
_ -> B.cons '?' $ rawQueryString env