63 lines
2 KiB
Text
63 lines
2 KiB
Text
|
# Serving web applications over HTTPS
|
||
|
|
||
|
This short recipe shows how one can serve a servant application
|
||
|
over HTTPS, by simply using `warp-tls` instead of `warp` to provide
|
||
|
us a `run` function for running the `Application` that we get by
|
||
|
calling `serve`.
|
||
|
|
||
|
As usual, we start by clearing our throat of a few language extensions
|
||
|
and imports.
|
||
|
|
||
|
``` haskell
|
||
|
{-# LANGUAGE DataKinds #-}
|
||
|
{-# LANGUAGE TypeOperators #-}
|
||
|
import Network.Wai
|
||
|
import Network.Wai.Handler.Warp
|
||
|
import Network.Wai.Handler.WarpTLS
|
||
|
import Servant
|
||
|
```
|
||
|
|
||
|
No need to work with a complicated API here, let's
|
||
|
make it as simple as it gets:
|
||
|
|
||
|
``` haskell
|
||
|
type API = Get '[JSON] Int
|
||
|
|
||
|
api :: Proxy API
|
||
|
api = Proxy
|
||
|
|
||
|
server :: Server API
|
||
|
server = return 10
|
||
|
|
||
|
app :: Application
|
||
|
app = serve api server
|
||
|
```
|
||
|
|
||
|
It's now time to actually run the `Application`.
|
||
|
The [`warp-tls`](https://hackage.haskell.org/package/warp-tls-3.2.4/docs/Network-Wai-Handler-WarpTLS.html)
|
||
|
package provides two functions for running an `Application`, called
|
||
|
[`runTLS`](https://hackage.haskell.org/package/warp-tls-3.2.4/docs/Network-Wai-Handler-WarpTLS.html#v:runTLS)
|
||
|
and [`runTLSSocket`](https://hackage.haskell.org/package/warp-tls-3.2.4/docs/Network-Wai-Handler-WarpTLS.html#v:runTLSSocket).
|
||
|
We will be using the first one.
|
||
|
|
||
|
It takes two arguments,
|
||
|
[the TLS settings](https://hackage.haskell.org/package/warp-tls-3.2.4/docs/Network-Wai-Handler-WarpTLS.html#t:TLSSettings)
|
||
|
(certificates, keys, ciphers, etc)
|
||
|
and [the warp settings](https://hackage.haskell.org/package/warp-3.2.12/docs/Network-Wai-Handler-Warp-Internal.html#t:Settings)
|
||
|
(port, logger, etc).
|
||
|
|
||
|
We will be using very simple settings for this example but you are of
|
||
|
course invited to read the documentation for those types to find out
|
||
|
about all the knobs that you can play with.
|
||
|
|
||
|
``` haskell
|
||
|
main :: IO ()
|
||
|
main = runTLS tlsOpts warpOpts app
|
||
|
|
||
|
where tlsOpts = tlsSettings "cert.pem" "secret-key.pem"
|
||
|
warpOpts = setPort 8080 defaultSettings
|
||
|
```
|
||
|
|
||
|
This program is available as a cabal project
|
||
|
[here](https://github.com/haskell-servant/servant/tree/master/doc/cookbook/https).
|