title: Servant combinator doesn't fall through to subsequent alternatives
body: <p>I made a custom combinator: <code>MultipartUpload</code>, but when I use it, it ends up applying not only the route I use it on, but all subsequent routes: </p>
  
  <p>For example, in the following API, <code>MultipartUpload</code> runs on both the 2nd AND 3rd route. So if I call the 3rd it will return the error <code>File upload required</code>. I only want it to apply to the 2nd. How?</p>
  
  <pre><code>type ModelAPI =
    "models" :&gt;
      (    ProjectKey :&gt; Get '[JSON] [Model]
      :&lt;|&gt; ProjectKey :&gt; MultipartUpload :&gt; Post '[JSON] Model
      :&lt;|&gt; ProjectKey :&gt; Capture "modelId" ID :&gt; Get '[JSON] Model
      )
  </code></pre>
  
  <p>Here is how <code>MultipartUpload</code> is defined. </p>
  
  <pre><code>{-# LANGUAGE DataKinds #-}
  {-# LANGUAGE TypeFamilies #-}
  {-# LANGUAGE TypeOperators #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE FlexibleInstances #-}
  {-# LANGUAGE ScopedTypeVariables #-}
  {-# LANGUAGE TypeSynonymInstances #-}
  module Servant.Multipart
    ( MultipartUpload
    , FileInfo(..)
    ) where
  
  import Data.ByteString.Lazy (ByteString)
  import qualified Data.ByteString.Lazy as Lazy
  import Network.HTTP.Types (status400)
  import Network.Wai.Parse
  import Network.Wai (responseLBS)
  import Servant
  import Servant.Server.Internal
  
  
  data MultipartUpload
  
  instance (HasServer sublayout) =&gt; HasServer (MultipartUpload :&gt; sublayout) where
    type ServerT (MultipartUpload :&gt; sublayout) m =
      FileInfo ByteString -&gt; ServerT sublayout m
  
    route Proxy subserver req respond = do
      dat &lt;- parseRequestBody lbsBackEnd req
      let files = snd dat
      case files of
        [(_, f)] -&gt;
          if Lazy.null $ fileContent f
            then respond . succeedWith $ responseLBS status400 [] "Empty file"
            else route (Proxy :: Proxy sublayout) (subserver f) req respond
        [] -&gt;
          respond . succeedWith $ responseLBS status400 [] "File upload required"
  
        _ -&gt;
          respond . succeedWith $ responseLBS status400 [] "At most one file allowed"
  </code></pre>