@@ -21,6 +21,7 @@ import Network.Wai.Middleware.Gzip
2121import Network.Wai.Middleware.Vhost
2222import Network.Wai.Middleware.Autohead
2323import Network.Wai.Middleware.MethodOverride
24+import Network.Wai.Middleware.MethodOverridePost
2425import Network.Wai.Middleware.AcceptOverride
2526import Network.Wai.Middleware.RequestLogger (logCallback)
2627import Codec.Compression.GZip (decompress)
@@ -31,7 +32,6 @@ import Data.Conduit.Binary (sourceFile)
3132import Control.Monad.IO.Class (liftIO)
3233import Data.Maybe (fromMaybe)
3334import Network.HTTP.Types (parseSimpleQuery, status200)
34−import Data.Monoid (mappend)
3535
3636specs :: Specs
3737specs = do
@@ -53,6 +53,7 @@ specs = do
5353 it "vhost" caseVhost
5454 it "autohead" caseAutohead
5555 it "method override" caseMethodOverride
56+ it "method override post" caseMethodOverridePost
5657 it "accept override" caseAcceptOverride
5758 it "dalvik multipart" caseDalvikMultipart
5859 it "debug request body" caseDebugRequestBody
@@ -354,6 +355,32 @@ caseMethodOverride = flip runSession moApp $ do
354355 }
355356 assertHeader "Method" "PUT" sres3
356357
358+mopApp :: Application
359+mopApp = methodOverridePost $ \req -> return $ responseLBS status200 [("Method", requestMethod req)] ""
360+
361+caseMethodOverridePost :: Assertion
362+caseMethodOverridePost = flip runSession mopApp $ do
363+
364+ -- Get Request are unmodified
365+ sres1 <- let r = toRequest "application/x-www-form-urlencoded" "_method=PUT&foo=bar&baz=bin"
366+ s = simpleRequest r
367+ m = s { requestMethod = "GET" }
368+ b = r { simpleRequest = m }
369+ in srequest b
370+ assertHeader "Method" "GET" sres1
371+
372+ -- Post requests are modified if _method comes first
373+ sres2 <- srequest $ toRequest "application/x-www-form-urlencoded" "_method=PUT&foo=bar&baz=bin"
374+ assertHeader "Method" "PUT" sres2
375+
376+ -- Post requests are unmodified if _method doesn't come first
377+ sres3 <- srequest $ toRequest "application/x-www-form-urlencoded" "foo=bar&_method=PUT&baz=bin"
378+ assertHeader "Method" "POST" sres3
379+
380+ -- Post requests are unmodified if Content-Type header isn't set to "application/x-www-form-urlencoded"
381+ sres4 <- srequest $ toRequest "text/html; charset=utf-8" "foo=bar&_method=PUT&baz=bin"
382+ assertHeader "Method" "POST" sres4
383+
357384aoApp :: Application
358385aoApp = acceptOverride $ \req -> return $ responseLBS status200
359386 [("Accept", fromMaybe "" $ lookup "Accept" $ requestHeaders req)] ""