add https recipe, add (future) github links at the end of all recipes
This commit is contained in:
parent
6075700ebc
commit
c5f2b9e175
11 changed files with 128 additions and 8 deletions
|
@ -11,6 +11,7 @@ packages: servant/
|
||||||
doc/cookbook/jwt-and-basic-auth/
|
doc/cookbook/jwt-and-basic-auth/
|
||||||
doc/cookbook/file-upload/
|
doc/cookbook/file-upload/
|
||||||
doc/cookbook/structuring-apis/
|
doc/cookbook/structuring-apis/
|
||||||
|
doc/cookbook/https/
|
||||||
|
|
||||||
allow-newer: servant-js:servant-foreign
|
allow-newer: servant-js:servant-foreign
|
||||||
|
|
||||||
|
|
|
@ -175,4 +175,5 @@ code and see what happens when you specify credentials that are not in the
|
||||||
database.
|
database.
|
||||||
|
|
||||||
The entire program covered here is available as a literate Haskell file
|
The entire program covered here is available as a literate Haskell file
|
||||||
[here](...), along with a `cabal` project.
|
[here](https://github.com/haskell-servant/servant/tree/master/doc/cookbook/basic-auth),
|
||||||
|
along with a `cabal` project.
|
||||||
|
|
|
@ -139,4 +139,5 @@ You could alternatively have the handlers live in `ReaderT (Pool Connection)`
|
||||||
and access the pool using e.g `ask`, but this would be more complicated
|
and access the pool using e.g `ask`, but this would be more complicated
|
||||||
than simply taking the pool as argument.
|
than simply taking the pool as argument.
|
||||||
|
|
||||||
The entire source for this example is available [here](...).
|
The entire source for this example is available as a cabal project
|
||||||
|
[here](https://github.com/haskell-servant/servant/tree/master/doc/cookbook/db-postgres-pool).
|
||||||
|
|
|
@ -96,4 +96,5 @@ main = do
|
||||||
This program prints `Right ["hello","world"]` the first time it is executed,
|
This program prints `Right ["hello","world"]` the first time it is executed,
|
||||||
`Right ["hello","world","hello","world"]` the second time and so on.
|
`Right ["hello","world","hello","world"]` the second time and so on.
|
||||||
|
|
||||||
The entire source for this example is available [here](...).
|
The entire source for this example is available as a cabal project
|
||||||
|
[here](https://github.com/haskell-servant/servant/tree/master/doc/cookbook/db-sqlite-simple).
|
||||||
|
|
|
@ -183,5 +183,5 @@ See `CONTRIBUTING.md`
|
||||||
Response {responseStatus = Status {statusCode = 200, statusMessage = "OK"}, responseVersion = HTTP/1.1, responseHeaders = [("Transfer-Encoding","chunked"),("Date","Fri, 08 Dec 2017 16:50:14 GMT"),("Server","Warp/3.2.13"),("Content-Type","application/json;charset=utf-8")], responseBody = "0", responseCookieJar = CJ {expose = []}, responseClose' = ResponseClose}
|
Response {responseStatus = Status {statusCode = 200, statusMessage = "OK"}, responseVersion = HTTP/1.1, responseHeaders = [("Transfer-Encoding","chunked"),("Date","Fri, 08 Dec 2017 16:50:14 GMT"),("Server","Warp/3.2.13"),("Content-Type","application/json;charset=utf-8")], responseBody = "0", responseCookieJar = CJ {expose = []}, responseClose' = ResponseClose}
|
||||||
```
|
```
|
||||||
|
|
||||||
As usual, the code for this recipe is available in a cabal
|
As usual, the code for this recipe is available in a cabal project
|
||||||
project [here]().
|
[here](https://github.com/haskell-servant/servant/tree/master/doc/cookbook/file-upload).
|
||||||
|
|
62
doc/cookbook/https/Https.lhs
Normal file
62
doc/cookbook/https/Https.lhs
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
# 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).
|
25
doc/cookbook/https/https.cabal
Normal file
25
doc/cookbook/https/https.cabal
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
name: cookbook-https
|
||||||
|
version: 0.1
|
||||||
|
synopsis: HTTPS cookbook example
|
||||||
|
homepage: http://haskell-servant.readthedocs.org/
|
||||||
|
license: BSD3
|
||||||
|
license-file: ../../../servant/LICENSE
|
||||||
|
author: Servant Contributors
|
||||||
|
maintainer: haskell-servant-maintainers@googlegroups.com
|
||||||
|
build-type: Simple
|
||||||
|
cabal-version: >=1.10
|
||||||
|
|
||||||
|
executable cookbook-https
|
||||||
|
if impl(ghc < 7.10.1)
|
||||||
|
buildable: False
|
||||||
|
main-is: Https.lhs
|
||||||
|
build-depends: base == 4.*
|
||||||
|
, servant
|
||||||
|
, servant-server
|
||||||
|
, wai
|
||||||
|
, warp
|
||||||
|
, warp-tls
|
||||||
|
, markdown-unlit >= 0.4
|
||||||
|
default-language: Haskell2010
|
||||||
|
ghc-options: -Wall -pgmL markdown-unlit
|
||||||
|
build-tool-depends: markdown-unlit:markdown-unlit
|
|
@ -17,9 +17,10 @@ you name it!
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 1
|
:maxdepth: 1
|
||||||
|
|
||||||
|
structuring-apis/StructuringApis.lhs
|
||||||
|
https/Https.lhs
|
||||||
db-sqlite-simple/DBConnection.lhs
|
db-sqlite-simple/DBConnection.lhs
|
||||||
db-postgres-pool/PostgresPool.lhs
|
db-postgres-pool/PostgresPool.lhs
|
||||||
basic-auth/BasicAuth.lhs
|
basic-auth/BasicAuth.lhs
|
||||||
jwt-and-basic-auth/JWTAndBasicAuth.lhs
|
jwt-and-basic-auth/JWTAndBasicAuth.lhs
|
||||||
file-upload/FileUpload.lhs
|
file-upload/FileUpload.lhs
|
||||||
structuring-apis/StructuringApis.lhs
|
|
||||||
|
|
|
@ -247,3 +247,6 @@ curl -v -H 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJkYXQiOnsiYXVPcmdJRCI6M
|
||||||
…
|
…
|
||||||
< HTTP/1.1 200 OK
|
< HTTP/1.1 200 OK
|
||||||
```
|
```
|
||||||
|
|
||||||
|
This program is available as a cabal project
|
||||||
|
[here](https://github.com/haskell-servant/servant/tree/master/doc/cookbook/jwt-and-basic-auth).
|
||||||
|
|
|
@ -60,7 +60,7 @@ an effect on the server for such an API, and its type
|
||||||
in particular. While the server for `FactoringAPI'` would
|
in particular. While the server for `FactoringAPI'` would
|
||||||
be made of a function of type `Int -> Maybe Int -> Handler Int`
|
be made of a function of type `Int -> Maybe Int -> Handler Int`
|
||||||
and a function of type `Int -> Handler Int` glued with `:<|>`,
|
and a function of type `Int -> Handler Int` glued with `:<|>`,
|
||||||
a server for `Factoring` (without the `'`) reflects the
|
a server for `FactoringAPI` (without the `'`) reflects the
|
||||||
"factorisation" and therefore, `Server FactoringAPI` is
|
"factorisation" and therefore, `Server FactoringAPI` is
|
||||||
`Int -> (Maybe Int -> Handler Int :<|> Handler Int)`. That is, the
|
`Int -> (Maybe Int -> Handler Int :<|> Handler Int)`. That is, the
|
||||||
server must be a function that takes an `Int` (the `Capture`) and
|
server must be a function that takes an `Int` (the `Capture`) and
|
||||||
|
@ -191,4 +191,5 @@ main = run 8080 . serve api $
|
||||||
factoringServer :<|> userServer :<|> productServer
|
factoringServer :<|> userServer :<|> productServer
|
||||||
```
|
```
|
||||||
|
|
||||||
This program is available as a cabal project [here]().
|
This program is available as a cabal project
|
||||||
|
[here](https://github.com/haskell-servant/servant/tree/master/doc/cookbook/structuring-apis).
|
||||||
|
|
24
doc/cookbook/structuring-apis/structuring-apis.cabal
Normal file
24
doc/cookbook/structuring-apis/structuring-apis.cabal
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
name: cookbook-structuring-apis
|
||||||
|
version: 0.1
|
||||||
|
synopsis: Example that shows how APIs can be structured
|
||||||
|
homepage: http://haskell-servant.readthedocs.org/
|
||||||
|
license: BSD3
|
||||||
|
license-file: ../../../servant/LICENSE
|
||||||
|
author: Servant Contributors
|
||||||
|
maintainer: haskell-servant-maintainers@googlegroups.com
|
||||||
|
build-type: Simple
|
||||||
|
cabal-version: >=1.10
|
||||||
|
|
||||||
|
executable cookbook-structuring-apis
|
||||||
|
if impl(ghc < 7.10.1)
|
||||||
|
buildable: False
|
||||||
|
main-is: StructuringApis.lhs
|
||||||
|
build-depends: base == 4.*
|
||||||
|
, aeson
|
||||||
|
, servant
|
||||||
|
, servant-server
|
||||||
|
, warp
|
||||||
|
, markdown-unlit >= 0.4
|
||||||
|
default-language: Haskell2010
|
||||||
|
ghc-options: -Wall -pgmL markdown-unlit
|
||||||
|
build-tool-depends: markdown-unlit:markdown-unlit
|
Loading…
Add table
Reference in a new issue