A family of combinators for defining webservices APIs and serving them

You can learn about the basics in the tutorial.

CHANGELOG

Changes

The latest version of this document is on GitHub.

0.16.2

  • singleton-bool-0.1.5 (SBool is re-exported)
    • Add discreteBool :: Dec (a :~: b) (GHC-7.8+)
    • Add Show, Eq, Ord SBool b instances.
  • dependencies update

0.16.1

  • Add Semigroup and Monoid SourceT instances #1158 #1159
  • Use http-api-data-0.4.1 #1181
  • Allow newer dependencies

0.16.0.1

  • Make tests work with http-media-0.8

0.16

Significant changes

  • Rename ServantError to ClientError, ServantErr to ServerError #1131

  • servant-client-core Rearrange modules. No more Internal modules, whole API is versioned. #1130

  • servant-http-streams New package #1117

  • servant-client-core RequestBody is now

    = RequestBodyLBS LBS.ByteString
    | RequestBodyBS BS.ByteString
    | RequestBodySource (SourceIO LBS.ByteString)
    

    i.e. no more replicates http-clients API. #1117

  • servant-client-core Keep structured exceptions in ConnectionError constructor of ClientError #1115

    -| ConnectionError Text
    +| ConnectionError SomeException
    
  • servant-client-core Preserve failing request in FailureResponse constructor of ClientError #1114

    -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

Other changes

  • servant-client Update CookieJar with intermediate request/responses (redirects) #1104

  • servant-server Reorder HTTP failure code priorities #1103

  • servant-server Re-organise internal modules #1139

  • Allow network-3.0 #1107

  • Add NFData NoContent instance #1090

  • Documentation updates #1127 #1124 #1098

  • CI updates #1123 #1121 #1119

0.15

Significant changes

  • 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

Other changes

  • 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