servant-server
A family of combinators for defining webservices APIs and serving them
LTS Haskell 23.1: | 0.20.2 |
Stackage Nightly 2024-12-26: | 0.20.2 |
Latest on Hackage: | 0.20.2 |
servant-server-0.20.2@sha256:5a2d11959256fed8f4918f02f55cb597b61cc92191a672cd2d2228fadd5ee0ec,6226
Module documentation for 0.20.2
- Servant
- Servant.Server
- Servant.Server.Experimental
- Servant.Server.Generic
- Servant.Server.Internal
- Servant.Server.Internal.BasicAuth
- Servant.Server.Internal.Context
- Servant.Server.Internal.Delayed
- Servant.Server.Internal.DelayedIO
- Servant.Server.Internal.ErrorFormatter
- Servant.Server.Internal.Handler
- Servant.Server.Internal.RouteResult
- Servant.Server.Internal.Router
- Servant.Server.Internal.RoutingApplication
- Servant.Server.Internal.ServerError
- Servant.Server.StaticFiles
- Servant.Server.UVerb
- Servant.Utils
- Servant.Server
servant-server
This library lets you implement an HTTP server with handlers for each endpoint of a servant API, handling most of the boilerplate for you.
Getting started
We’ve written a tutorial guide that introduces the core types and features of servant. After this article, you should be able to write your first servant webservices, learning the rest from the haddocks’ examples.
Changes
The latest version of this document is on GitHub.
Changelog for servant
package contains significant entries for all core packages.
Package versions follow the Package Versioning Policy: in A.B.C, bumps to either A or B represent major versions.
0.20.2
-
Fix build of examples/greet.hs. Add “429 Too Many Requests” error. #1591
-
Full query string helpers #1604 This involves a new instance
HasServer (QueryString :> api) context
. -
Add
MkHandler
pattern synonym #1732 #1733Add a bidirectional pattern synonym to construct
Handler a
values fromIO (Either ServerError a)
ones, and match in the other direction. -
Add instance
HasServer (EmptyAPI :> api) context
#1775 -
Bugfix - CaptureAll produces [””] for empty paths due to trailing slash. #1243 #1516
CaptureAll resulted in
[""]
for empty paths due to trailing slash. Similar oddities occurred around these edge cases like"/"
resulted in[]
correctly, but"//"
resulted in["", ""]
. This patch simply eliminates the first""
in the pathinfo list as taken from the wai response. This might break user code that relies on personal shims to solve the problem, however simply removing their workarounds should fix their code as the behavior is now sane.
0.20
- Add API docs for ServerT #1573
- Add Functor instance to AuthHandler. #1638
- Compatibility with GHC 9.6. #1680
0.19.2
Compatibility with GHC 9.4, see PR #1592.
0.19.1
- Add
MonadFail
instance forHandler
wrt #1545 - Support GHC 9.2 #1525
- Add capture hints in
Router
type for debug and display purposes [PR #1556] (https://github.com/haskell-servant/servant/pull/1556)
0.19
Significant changes
- Drop support for GHC < 8.6.
- Support GHC 9.0 (GHC 9.2 should work as well, but isn’t fully tested yet).
- Support Aeson 2 (#1475), which fixes a DOS vulnerability related to hash collisions.
- Add
NamedRoutes
combinator, making support for records first-class in Servant (#1388). - Add custom type errors for partially applied combinators (#1289, #1486).
0.18.3
Significant changes
- Add response header support to UVerb (#1420)
Other changes
- Support GHC-9.0.1.
- Bump
bytestring
,hspec
andbase64-bytestring
dependencies.
0.18.2
Significant changes
- Support
Fragment
combinator.
0.18.1
Significant changes
- Union verbs
Other changes
- Bump “tested-with” ghc versions
- Allow newer dependencies
0.18
Significant changes
-
Support for ghc8.8 (#1318, #1326, #1327)
-
Configurable error messages for automatic errors thrown by servant, like “no route” or “could not parse json body” (#1312, #1326, #1327)
0.17
Significant changes
-
Add NoContentVerb #1028 #1219 #1228
The
NoContent
API endpoints should now useNoContentVerb
combinator. The API type changes are usually of the kind- :<|> PostNoContent '[JSON] NoContent + :<|> PostNoContent
i.e. one doesn’t need to specify the content-type anymore. There is no content.
-
Capture
can beLenient
#1155 #1156You can specify a lenient capture as
:<|> "capture-lenient" :> Capture' '[Lenient] "foo" Int :> GET
which will make the capture always succeed. Handlers will be of the type
Either String CapturedType
, whereLeft err
represents the possible parse failure. -
servant-server use queryString to parse QueryParam, QueryParams and QueryFlag #1249 #1262
Some APIs need query parameters rewriting, e.g. in order to support for multiple casing (camel, snake, etc) or something to that effect.
This could be easily achieved by using WAI Middleware and modifying request’s
Query
. But QueryParam, QueryParams and QueryFlag userawQueryString
. By usingqueryString
rather thenrawQueryString
we can enable such rewritings. -
servant servant-server Make packages
build-type: Simple
#1263We used
build-type: Custom
, but it’s problematic e.g. for cross-compiling. The benefit is small, as the doctests can be run other ways too (though not so conveniently).
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.
- Add
- dependencies update
0.16.1
- Use
http-api-data-0.4.1
(a part of its API is re-exported) #1181
0.16
- Rename
ServantError
toClientError
,ServantErr
toServerError
#1131 - servant-server Reorder HTTP failure code priorities #1103
- servant-server Re-organise internal modules #1139
- Allow
network-3.0
#1107
0.15
-
Streaming refactoring. #991 #1076 #1077
The streaming functionality (
Servant.API.Stream
) is refactored to useservant
’s ownSourceIO
type (seeServant.Types.SourceT
documentation), which replaces bothStreamGenerator
andResultStream
types.New conversion type-classes are
ToSourceIO
andFromSourceIO
(replacingToStreamGenerator
andBuildFromStream
). 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 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 Export
GetHeaders'
#1052 -
servant Add
Bitraversable
and otherBi-
instances for:<|>
#1032 -
servant Add
PutCreated
method type alias #1024 -
servant Add
ToSourceIO (NonEmpty a)
instance #988
0.14.1
-
Merge in
servant-generic
(by Patrick Chilton) intoservant
(Servant.API.Generic
),servant-client-code
(Servant.Client.Generic
) andservant-server
(Servant.Server.Generic
). -
servant-server Deprecate
Servant.Utils.StaticUtils
, useServant.Server.StaticUtils
.
0.14
-
Stream
takes a status code argument-Stream method framing ctype a +Stream method status framing ctype a
-
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-server File serving in polymorphic monad. i.e. Generalised types of
serveDirectoryFileServer
etc functions inServant.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)
0.13.0.1
- Support
base-compat-0.10
0.13
0.12
Breaking changes
- Added
hoistServer
member to theHasServer
class, which isHasServer
specificenter
. (#804)
0.11
Breaking changes
- Changed
HasServer
instances forHeader
to throw 400 when parsing fails (#724) - Added
headersD
block toDelayed
(#724)
Other changes
- Add
err418
,err422
error codes (#739)
0.10
Breaking changes
-
Handler
is now an abstract datatype. Migration hint: changethrowE
tothrowError
. (#641) -
Changed
HasServer
instances forQueryParam
andQueryParam
to throw 400 when parsing fails (#649)
Other changes
-
Added
paramsD
block toDelayed
-
Add
err422
Unprocessable Entity (#646) -
Deprecate
serveDirectory
and introduceserveDirectoryFileServer
,serveDirectoryWebApp
,serveDirectoryWebAppLookup
,serveDirectoryEmbedded
andserveDirectoryWith
which offer 4 default options and a more flexible one for serving static files. (#658) -
DelayedIO
is an instance ofMonadResource
, allowing safe resource handling. (#622 , #674 , #675)
0.7.1
- Remove module
Servant.Server.Internal.Enter
(https://github.com/haskell-servant/servant/pull/478) - Support GHC 8.0
0.7
- The
Router
type has been changed. Static router tables should now be properly shared between requests, drastically increasing the number of situations where servers will be able to route requests efficiently. Functionslayout
andlayoutWithContext
have been added to visualize the router layout for debugging purposes. Test cases for expected router layouts have been added. - If an endpoint is discovered to have a non-matching “accept header”, this is now a recoverable rather than a fatal failure, allowing different endpoints for the same route, but with different content types to be specified modularly.
- Export
throwError
from moduleServant
- Add
Handler
type synonym
0.6.1
- If servers use the
BasicAuth
combinator and receive requests with missing or invalid credentials, the resulting error responses (401 and 403) could be overwritten by subsequent alternative routes. NowBasicAuth
usesFailFatal
and the error responses can’t be overwritten anymore.
0.6
- Query parameters that can’t be parsed result in a
400
(was404
).
0.5
- Add
Config
machinery (https://github.com/haskell-servant/servant/pull/327). This is a breaking change, as the signatures of bothroute
,serve
and the typeclassHasServer
now take an additional parameter. - Support for the
HttpVersion
,IsSecure
,RemoteHost
andVault
combinators - Drop
EitherT
in favor ofExceptT
- Use
http-api-data
instead ofServant.Common.Text
- Remove matrix params.
- Remove
RouteMismatch
. - Redefined constructors of
RouteResult
. - Added
Delayed
and related functions (addMethodCheck
,addAcceptCheck
,addBodyCheck
,runDelayed
) - Added support for Basic Authentication
- Add generalized authentication support via the
AuthServerData
type family andAuthHandler
handler
0.4.1
- Bump attoparsec upper bound to < 0.14
- Bump wai-app-static upper bound to < 3.2
- Bump either upper bound to < 4.5
0.4
Delete
now is likeGet
,Post
,Put
, andPatch
and returns a response body- Add a
RouteMismatch
constructor for arbitrary HTTP response codes (https://github.com/haskell-servant/servant-server/pull/22) - Add support for the
Patch
combinator - Support for
Accept
/Content-type
headers and for the content-type aware combinators in servant-0.4 - Export
toApplication
fromServant.Server
(https://github.com/haskell-servant/servant-server/pull/29) - Support other Monads than just
EitherT (Int, String) IO
(https://github.com/haskell-servant/servant-server/pull/21) - Make methods return status code 204 if they return () (https://github.com/haskell-servant/servant-server/issues/28)
- Add server support for response headers
- Use
ServantErr
instead of(Int,String)
inEitherT
handlers - Add
errXXX
functions for HTTP errors with sensible default reason strings - Add
enter
function for applying natural transformations to handlers
0.2.4
- Added support for matrix parameters, see e.g. http://www.w3.org/DesignIssues/MatrixURIs.html
- Add support for serializing based on Accept header (https://github.com/haskell-servant/servant-server/issues/9)
- Ignore trailing slashes (https://github.com/haskell-servant/servant-server/issues/5)
0.2.3
- Fix consuming request body issue (https://github.com/haskell-servant/servant/issues/3)
- Make code sample in Servant.Server complete