2017-11-06 09:40:39 +01:00
[The latest version of this document is on GitHub. ](https://github.com/haskell-servant/servant/blob/master/servant-client-core/CHANGELOG.md )
[Changelog for `servant` package contains significant entries for all core packages. ](https://github.com/haskell-servant/servant/blob/master/servant/CHANGELOG.md )
2017-09-06 23:13:05 +02:00
2020-11-22 15:51:32 +01:00
0.18.2
------
### Significant changes
- Support `Fragment` combinator.
2020-11-04 13:28:20 +01:00
0.18.1
------
### Significant changes
- Union verbs
### Other changes
- Bump "tested-with" ghc versions
- Loosen bound on base16-bytestring
2020-07-31 20:19:07 +02:00
0.18
----
### Significant changes
- Support for ghc8.8 (#1318, #1326 , #1327 )
2020-01-23 12:43:19 +01:00
0.17
----
### Significant changes
- Add NoContentVerb [#1028 ](https://github.com/haskell-servant/servant/issues/1028 ) [#1219 ](https://github.com/haskell-servant/servant/pull/1219 ) [#1228 ](https://github.com/haskell-servant/servant/pull/1228 )
The `NoContent` API endpoints should now use `NoContentVerb` combinator.
The API type changes are usually of the kind
```diff
- :< |> PostNoContent '[JSON] NoContent
+ :< |> PostNoContent
```
i.e. one doesn't need to specify the content-type anymore. There is no content.
- `Capture` can be `Lenient` [#1155 ](https://github.com/haskell-servant/servant/issues/1155 ) [#1156 ](https://github.com/haskell-servant/servant/pull/1156 )
You can specify a lenient capture as
```haskell
:< |> "capture-lenient" :> Capture' '[Lenient] "foo" Int :> GET
```
which will make the capture always succeed. Handlers will be of the
type `Either String CapturedType` , where `Left err` represents
the possible parse failure.
### Other changes
- *servant-client* *servant-client-core* *servant-http-streams* Fix Verb with headers checking content type differently [#1200 ](https://github.com/haskell-servant/servant/issues/1200 ) [#1204 ](https://github.com/haskell-servant/servant/pull/1204 )
For `Verb` s with response `Headers` , the implementation didn't check
for the content-type of the response. Now it does.
- *servant-client* *servant-http-streams* `HasClient` instance for `Stream` with `Headers` [#1170 ](https://github.com/haskell-servant/servant/issues/1170 ) [#1197 ](https://github.com/haskell-servant/servant/pull/1197 )
- *servant-client* Redact the authorization header in Show and exceptions [#1238 ](https://github.com/haskell-servant/servant/pull/1238 )
2019-02-21 09:59:45 +01:00
0.16
----
- Rename `ServantError` to `ClientError` , `ServantErr` to `ServerError`
[#1131 ](https://github.com/haskell-servant/servant/pull/1131 )
- *servant-client-core* Rearrange modules. No more `Internal` modules, whole
API is versioned.
[#1130 ](https://github.com/haskell-servant/servant/pull/1130 )
- *servant-client-core* `RequestBody` is now
```haskell
= RequestBodyLBS LBS.ByteString
| RequestBodyBS BS.ByteString
| RequestBodySource (SourceIO LBS.ByteString)
```
i.e. no more replicates `http-client` s API.
[#1117 ](https://github.com/haskell-servant/servant/pull/1117 )
- *servant-client-core* Keep structured exceptions in `ConnectionError`
constructor of `ClientError`
[#1115 ](https://github.com/haskell-servant/servant/pull/1115 )
```diff
-| ConnectionError Text
+| ConnectionError SomeException
```
- *servant-client-core* Preserve failing request in `FailureResponse`
constructor of `ClientError`
[#1114 ](https://github.com/haskell-servant/servant/pull/1114 )
```diff
-FailureResponse Response
+-- | The server returned an error response including the
+-- failing request. 'requestPath' includes the 'BaseUrl' and the
+-- path of the request.
+FailureResponse (RequestF () (BaseUrl, BS.ByteString)) Response
```
- *servant-client* Fix (implement) `StreamBody` instance
[#1110 ](https://github.com/haskell-servant/servant/pull/1110 )
- *servant-client* Update CookieJar with intermediate request/responses (redirects)
[#1104 ](https://github.com/haskell-servant/servant/pull/1104 )
2018-11-12 21:04:29 +01:00
0.15
----
- Streaming refactoring.
[#991 ](https://github.com/haskell-servant/servant/pull/991 )
[#1076 ](https://github.com/haskell-servant/servant/pull/1076 )
[#1077 ](https://github.com/haskell-servant/servant/pull/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 ](https://hackage.haskell.org/package/servant-conduit )
[servant-pipes ](https://hackage.haskell.org/package/servant-pipes ) and
[servant-machines ](https://hackage.haskell.org/package/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 ](https://github.com/haskell-servant/servant/pull/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.
```haskell
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:
```haskell
class RunClient m => RunStreamingClient m where
withStreamingRequest :: Request -> (StreamingResponse -> IO a) -> m a
```
- Drop support for GHC older than 8.0
[#1008 ](https://github.com/haskell-servant/servant/pull/1008 )
[#1009 ](https://github.com/haskell-servant/servant/pull/1009 )
- *servant-client-core* Add `NFData (GenResponse a)` and `NFData ServantError` instances.
[#1076 ](https://github.com/haskell-servant/servant/pull/1076 )
- *servant-client-core* Add `aeson` and `Lift BaseUrl` instances
[#1037 ](https://github.com/haskell-servant/servant/pull/1037 )
2018-07-04 21:59:43 +02:00
0.14.1
------
- Merge in `servant-generic` (by [Patrick Chilton ](https://github.com/chpatrick ))
into `servant` (`Servant.API.Generic`),
`servant-client-code` (`Servant.Client.Generic`)
and `servant-server` (`Servant.Server.Generic`).
2018-04-09 13:57:31 +02:00
0.14
----
2018-06-18 16:12:35 +02:00
- `Stream` takes a status code argument
```diff
-Stream method framing ctype a
+Stream method status framing ctype a
```
([#966](https://github.com/haskell-servant/servant/pull/966)
[#972 ](https://github.com/haskell-servant/servant/pull/972 ))
- `ToStreamGenerator` definition changed, so it's possible to write an instance
for conduits.
```diff
-class ToStreamGenerator f a where
- toStreamGenerator :: f a -> StreamGenerator a
+class ToStreamGenerator a b | a -> b where
+ toStreamGenerator :: a -> StreamGenerator b
```
([#959](https://github.com/haskell-servant/servant/pull/959))
- Added `NoFraming` streaming strategy
([#959](https://github.com/haskell-servant/servant/pull/959))
- *servant-client-core* Free `Client` implementation.
Useful for testing `HasClient` instances.
([#920](https://github.com/haskell-servant/servant/pull/920))
- *servant-client-core* Add `hoistClient` to `HasClient` .
Just like `hoistServer` allows us to change the monad in which request handlers
2020-06-06 06:43:51 +02:00
of a web application live, we also have `hoistClient` for changing the monad
2018-06-18 16:12:35 +02:00
in which *client functions* live.
2019-03-02 10:08:03 +01:00
Read [tutorial section for more information ](https://docs.servant.dev/en/release-0.14/tutorial/Client.html#changing-the-monad-the-client-functions-live-in ).
2018-04-09 13:57:31 +02:00
([#936](https://github.com/haskell-servant/servant/pull/936))
2018-06-18 16:12:35 +02:00
iF you have own combinators, you'll need to define a new method of
`HasClient` class, for example:
```haskell
type Client m (MyCombinator :> api) = MyValue :> Client m api
hoistClientMonad pm _ nt cl = hoistClientMonad pm (Proxy :: Proxy api) nt . cl
```
2018-04-09 11:26:35 +02:00
0.13.0.1
--------
- Support `base-compat-0.10`
2018-02-08 11:29:16 +01:00
0.13
----
- Streaming endpoint support.
([#836](https://github.com/haskell-servant/servant/pull/836))
- *servant* Add `Servant.API.Modifiers`
([#873](https://github.com/haskell-servant/servant/pull/873))
2017-11-06 09:40:39 +01:00
0.12
----
2017-09-06 23:13:05 +02:00
2017-11-06 09:40:39 +01:00
- First version. Factored out of `servant-client` all the functionality that was
independent of the `http-client` backend.