    module Network.Wai.Middleware.MethodOverride
        ( methodOverride
        ) where

    import Network.Wai
    import Control.Monad (join)

    -- | Allows overriding of the HTTP request method via the _method query string
    -- parameter.
    --
    -- This middleware only applies when the initial request method is POST. This
    -- allow submitting of normal HTML forms, without worries of semantics
    -- mismatches in the HTTP spec.
    methodOverride :: Middleware
    methodOverride app req =
        app req'
      where
        req' =
            case (requestMethod req, join $ lookup "_method" $ queryString req) of
                ("POST", Just m) -> req { requestMethod = m }
                _ -> req