-
Streaming refactoring.
#991
#1076
#1077
The streaming functionality (Servant.API.Stream
) is refactored to use
servant
’s own SourceIO
type (see Servant.Types.SourceT
documentation),
which replaces both StreamGenerator
and ResultStream
types.
New conversion type-classes are ToSourceIO
and FromSourceIO
(replacing ToStreamGenerator
and BuildFromStream
).
There are instances for conduit, pipes and machines in new packages:
servant-conduit
servant-pipes and
servant-machines
respectively.
Writing new framing strategies is simpler. Check existing strategies for examples.
This change shouldn’t affect you, if you don’t use streaming endpoints.
-
servant-client Separate streaming client.
#1066
We now have two http-client
based clients,
in Servant.Client
and Servant.Client.Streaming
.
Their API is the same, except for
Servant.Client
cannot request Stream
endpoints.
Servant.Client
is run by direct
runClientM :: ClientM a -> ClientEnv -> IO (Either ServantError a)
Servant.Client.Streaming
can request Stream
endpoints.
Servant.Client.Streaming
is used by CPSised
withClientM :: ClientM a -> ClientEnv -> (Either ServantError a -> IO b) -> IO b
To access Stream
endpoints use Servant.Client.Streaming
with
withClientM
; otherwise you can continue using Servant.Client
with runClientM
.
You can use both too, ClientEnv
and BaseUrl
types are same for both.
Note: Servant.Client.Streaming
doesn’t stream non-Stream
endpoints.
Requesting ordinary Verb
endpoints (e.g. Get
) will block until
the whole response is received.
There is Servant.Client.Streaming.runClientM
function, but it has
restricted type. NFData a
constraint prevents using it with
SourceT
, Conduit
etc. response types.
runClientM :: NFData a => ClientM a -> ClientEnv -> IO (Either ServantError a)
This change shouldn’t affect you, if you don’t use streaming endpoints.
-
servant-client-core Related to the previous:
streamingResponse
is removed from RunClient
.
We have a new type-class:
class RunClient m => RunStreamingClient m where
withStreamingRequest :: Request -> (StreamingResponse -> IO a) -> m a
-
Drop support for GHC older than 8.0
#1008
#1009
-
servant ComprehensiveAPI
is a part of public API in Servant.Test.ComprehensiveAPI
module.
This API type is used to verify that libraries implement all core combinators.
Now we won’t change this type between major versions.
(This has been true for some time already).
#1070
-
servant Remove Servant.Utils.Enter
module
(deprecated in servant-0.12
in favour of hoistServer
)
#996
-
servant-foreign Add support so HasForeign
can be implemented for
MultipartForm
from servant-multipart
#1035
-
servant-client-core Add NFData (GenResponse a)
and NFData ServantError
instances.
#1076
-
servant NewlineFraming encodes newline after each element (i.e last)
#1079
#1011
-
servant Add lookupResponseHeader :: ... => Headers headers r -> ResponseHeader h a
#1064
-
servant-server Add MonadMask Handler
#1068
-
servant-docs Fix markdown indentation
#1043
-
servant Export GetHeaders'
#1052
-
servant Add Bitraversable
and other Bi-
instances for :<|>
#1032
-
servant Add PutCreated
method type alias
#1024
-
servant-client-core Add aeson
and Lift BaseUrl
instances
#1037
-
servant Add ToSourceIO (NonEmpty a)
instance
#988
-
Development process improvements
-
Documentation Tutorial and new recipes
-
Documentation README
#1010
-
servant-client-ghcjs updates. note package is not released on Hackage
#938
-
Stream
takes a status code argument
-Stream method framing ctype a
+Stream method status framing ctype a
(#966
#972)
-
ToStreamGenerator
definition changed, so it’s possible to write an instance
for conduits.
-class ToStreamGenerator f a where
- toStreamGenerator :: f a -> StreamGenerator a
+class ToStreamGenerator a b | a -> b where
+ toStreamGenerator :: a -> StreamGenerator b
(#959)
-
Added NoFraming
streaming strategy
(#959)
-
servant-client-core Free Client
implementation.
Useful for testing HasClient
instances.
(#920)
-
servant-client-core Add hoistClient
to HasClient
.
Just like hoistServer
allows us to change the monad in which request handlers
of a web application live in, we also have hoistClient
for changing the monad
in which client functions live.
Read tutorial section for more information.
(#936)
iF you have own combinators, you’ll need to define a new method of
HasClient
class, for example:
type Client m (MyCombinator :> api) = MyValue :> Client m api
hoistClientMonad pm _ nt cl = hoistClientMonad pm (Proxy :: Proxy api) nt . cl
-
servant Add safeLink' :: (Link -> a) -> ... -> MkLink endpoint a
,
which allows to create helpers returning something else than Link
.
(#968)
-
servant-server File serving in polymorphic monad.
i.e. Generalised types of serveDirectoryFileServer
etc functions in
Servant.Utils.StaticFiles
(#953)
-
servant-server ReqBody
content type check is recoverable.
This allows writing APIs like:
ReqBody '[JSON] Int :> Post '[PlainText] Int
:<|> ReqBody '[PlainText] Int :> Post '[PlainText] Int
which is useful when handlers are subtly different,
for example may do less work.
(#937)
-
servant-client Add more constructors to RequestBody
, including
RequestBodyStream
.
Note: we are looking for http-library agnostic API,
so the might change again soon.
Tell us which constructors are useful for you!
(#913)
-
Streaming endpoint support.
(#836)
type StreamApi f = "streamGetNewline" :> StreamGet NewlineFraming JSON (f Person)
See tutorial for more details
-
servant Add Servant.API.Modifiers
(#873
#903)
QueryParam
, Header
and ReqBody
understand modifiers:
Required
or Optional
(resulting in a
or Maybe a
in handlers)
Strict
or Lenient
(resulting in a
or Either String a
in handlers)
Also you can use Description
as a modifier, but it doesn’t yet work
with servant-docs
, only servant-swagger
. There is an issue.
-
servant-client Support http-client
’s CookieJar
(#897
#883)
ClientM
preserves cookies between requests,
if given initial CookieJar
.
To migrate from older code, change ClientEnv
constructor
to mkClientEnv
which makes ClientEnv
without CookieJar
.
-
servant Mono-kind-ise modifiers, resulting in better error messages.
(#887
#890)
-
servant Add TypeError ... => HasServer
s instances in GHC-8.2 for
not saturated modifiers (Capture "foo" :> ...
) or ->
in place of :>
.
(#893)
-
Cookbook example projects at
http://haskell-servant.readthedocs.io/en/master/cookbook/index.html
(#867
#892)
-
Experimental work servant-client-ghcjs
(#818
#869)
-
servant-client servant-client-core
Factored out of servant-client
all the functionality that was
independent of the http-client
backend.
(#803
#821)
If you have own combinators, you’ll need to add an additional m
argument
in HasClient
, Client
and clientWithRoute
:
-class HasClient api
- type Client (api :: *) :: *
- clientWithRoute :: Proxy api -> Req -> Client api
+class HasClient m api
+ type Client (m :: * -> *) (api :: *) :: *
+ clientWithRoute :: Proxy m -> Proxy api -> Request -> Client m api
See https://github.com/haskell-servant/servant-auth/pull/67/commits/f777818e3cc0fa3ed2346baff8328e96d62b1790 for a real world example.
-
servant-server Added hoistServer
member to the HasServer
class, which is HasServer
specific enter
.
(#804
#824)
enter
isn’t exported from Servant
module anymore. You can change
enter
to hoistServer
in a straight forward way.
Unwrap natural transformation and add a api type Proxy
:
-server = enter (NT nt) impl
+server = hoistServer (Proxy :: Proxy MyApi) nt impl
If you have own combinators, you’ll need to define a new method of
HasServer
class, for example:
type ServerT (MyCombinator :> api) m = MyValue -> ServerT api m
hoistServerWithContext _ pc nt s = hoistServerWithContext (Proxy :: Proxy api) pc nt . s
See https://github.com/haskell-servant/servant-auth/pull/67/commits/8ee3b6315247ac076516213fd7cfcdbfdb583ac9 for a real world example.
-
Add Description
and Summary
combinators
(#767)
It’s possible to annotate endpoints with free form text.
This information is used by e.g. by servant-swagger
, see screenshot in
https://github.com/phadej/servant-swagger-ui
-
Lower :>
and :<|>
infix precedence to 4 and 3 respectively
(#761)
This shouldn’t affect you, except if you define your own infix operators
for Servant type-level DSL.