servant-multipart 0.11.6 → 0.12
raw patch · 3 files changed
+41/−13 lines, 3 filesdep ~randomdep ~servantdep ~servant-client-corenew-uploader
Dependency ranges changed: random, servant, servant-client-core, servant-docs, servant-foreign, servant-server, wai-extra
Files
- CHANGELOG.md +7/−0
- servant-multipart.cabal +7/−7
- src/Servant/Multipart.hs +27/−6
CHANGELOG.md view
@@ -1,3 +1,10 @@+0.12+----++- support servant-0.18+- version bump for breaking change in+ [#36](https://github.com/haskell-servant/servant-multipart/pull/36)+ 0.11.6 ------
servant-multipart.cabal view
@@ -1,5 +1,5 @@ name: servant-multipart-version: 0.11.6+version: 0.12 synopsis: multipart/form-data (e.g file upload) support for servant description: This package adds support for file upload to the servant ecosystem. It draws@@ -17,7 +17,7 @@ build-type: Simple cabal-version: >=1.10 extra-source-files: CHANGELOG.md-tested-with: GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.3+tested-with: GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.4 || ==8.10.2 library default-language: Haskell2010@@ -39,11 +39,11 @@ http-media >=0.7.1.3 && <0.9 , lens >=4.17 && <4.20 , resourcet >=1.2.2 && <1.3- , servant >=0.16 && <0.18- , servant-client-core >=0.16 && <0.18- , servant-docs >=0.10 && <0.16- , servant-foreign >=0.15 && <0.16- , servant-server >=0.16 && <0.18+ , servant >=0.16 && <0.19+ , servant-client-core >=0.16 && <0.19+ , servant-docs >=0.10 && <0.19+ , servant-foreign >=0.15 && <0.19+ , servant-server >=0.16 && <0.19 , string-conversions >=0.4.0.1 && <0.5 , wai >=3.2.1.2 && <3.3 , wai-extra >=3.0.24.3 && <3.1
src/Servant/Multipart.hs view
@@ -293,6 +293,9 @@ instance ( FromMultipart tag a , MultipartBackend tag , LookupContext config (MultipartOptions tag)+#if MIN_VERSION_servant_server(0,18,0)+ , LookupContext config ErrorFormatters+#endif , SBoolI (FoldLenient mods) , HasServer sublayout config ) => HasServer (MultipartForm' mods tag a :> sublayout) config where@@ -312,7 +315,7 @@ popts = Proxy :: Proxy (MultipartOptions tag) multipartOpts = fromMaybe (defaultMultipartOptions pbak) $ lookupContext popts config- subserver' = addMultipartHandling @tag @a @mods pbak multipartOpts subserver+ subserver' = addMultipartHandling @tag @a @mods @config pbak multipartOpts config subserver -- | Upon seeing @MultipartForm a :> ...@ in an API type, -- servant-client will take a parameter of type @(LBS.ByteString, a)@,@@ -433,28 +436,46 @@ where parseOpts = generalOptions tag -- Add multipart extraction support to a Delayed.-addMultipartHandling :: forall tag multipart (mods :: [*]) env a. (FromMultipart tag multipart, MultipartBackend tag)+addMultipartHandling :: forall tag multipart (mods :: [*]) config env a.+ ( FromMultipart tag multipart+ , MultipartBackend tag+#if MIN_VERSION_servant_server(0,18,0)+ , LookupContext config ErrorFormatters+#endif+ ) => SBoolI (FoldLenient mods) => Proxy tag -> MultipartOptions tag+ -> Context config -> Delayed env (If (FoldLenient mods) (Either String multipart) multipart -> a) -> Delayed env a-addMultipartHandling pTag opts subserver =+addMultipartHandling pTag opts _config subserver = addBodyCheck subserver contentCheck bodyCheck where contentCheck = withRequest $ \request -> fuzzyMultipartCTCheck (contentTypeH request) - bodyCheck () = do+ bodyCheck () = withRequest $ \ request -> do mpd <- check pTag opts :: DelayedIO (MultipartData tag) case (sbool :: SBool (FoldLenient mods), fromMultipart @tag @multipart mpd) of- (SFalse, Left msg) -> liftRouteResult $ FailFatal- err400 { errBody = "Could not decode multipart mime body: " <> cs msg }+ (SFalse, Left msg) -> liftRouteResult $ FailFatal $ formatError request msg (SFalse, Right x) -> return x (STrue, res) -> return $ either (Left . cs) Right res contentTypeH req = fromMaybe "application/octet-stream" $ lookup "Content-Type" (requestHeaders req)++ defaultFormatError msg = err400 { errBody = "Could not decode multipart mime body: " <> cs msg }+#if MIN_VERSION_servant_server(0,18,0)+ pFormatters = Proxy :: Proxy ErrorFormatters+ rep = typeRep (Proxy :: Proxy MultipartForm')+ formatError request =+ case lookupContext pFormatters _config of+ Nothing -> defaultFormatError+ Just fmts -> bodyParserErrorFormatter fmts rep request+#else+ formatError _ = defaultFormatError+#endif -- Check that the content type is one of: -- - application/x-www-form-urlencoded