{-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeSynonymInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} -- | @multipart/form-data@ support for servant. -- -- This is mostly useful for adding file upload support to -- an API. See haddocks of 'MultipartForm' for an introduction. module Servant.Multipart ( MultipartForm , MultipartData(..) , FromMultipart(..) , lookupInput , lookupFile , MultipartOptions(..) , defaultMultipartOptions , TmpBackendOptions(..) , defaultTmpBackendOptions , Input(..) , FileData(..) ) where import Control.Monad import Control.Monad.IO.Class import Control.Monad.Trans.Resource import Data.ByteString.Lazy (ByteString) import Data.Function import Data.List (find) import Data.Maybe import Data.Text (Text) import Data.Text.Encoding (decodeUtf8) import Data.Typeable import Network.HTTP.Media ((//)) import Network.Wai import Network.Wai.Parse import Servant import Servant.Server.Internal import System.Directory import System.IO import qualified Data.ByteString as SBS import qualified Data.ByteString.Lazy as LBS -- | Combinator for specifying a @multipart/form-data@ request -- body, typically (but not always) issued from an HTML @\