wai-cli

Command line runner for Wai apps (using Warp) with TLS, CGI, socket activation & graceful shutdown

https://codeberg.org/valpackett/wai-cli

LTS Haskell 22.39:0.2.3@rev:2
Stackage Nightly 2024-10-31:0.2.3@rev:2
Latest on Hackage:0.2.3@rev:2

See all snapshots wai-cli appears in

LicenseRef-PublicDomain licensed by Val Packett
Maintained by [email protected]
This version can be pinned in stack with:wai-cli-0.2.3@sha256:896e617ca43122e63b4fe9520151b515b7e6287cfd75adc738ef4a9ddda666b7,2023

Module documentation for 0.2.3

wai-cli Hackage Build Status unlicense

A command line runner for Wai apps (using Warp) with support for:

  • --protocol http --port 8000 TCP sockets
  • --protocol unix --socket /var/run/app/sock UNIX domain sockets
  • --protocol cgi running as a CGI app (the original serverless lambda functions from the 90s)
  • --protocol fastcgi running as a FastCGI app (OPTIONAL! You need to build with the fastcgi cabal flag and you need to have libfcgi (e.g. fcgi-devkit package on FreeBSD) installed)
  • --protocol activate socket activation (systemd-compatible, but not restricted to systemd in any way. see soad for an interesting use of (de)activation!)
  • --protocol (http+tls|unix+tls|activate+tls) --tlskey key.pem --tlscert cert.pem TLS (can be turned off with a cabal flag to avoid compiling the TLS library)
  • --graceful (none|serve-normally|serve-503) graceful shutdown (on TERM signal)
  • --devlogging development logging (from wai-extra)
  • printing a pretty and colorful run message (e.g. Running on http port 3000 with 4 CPUs) (you can replace it with your own, or with nothing)

Extracted from sweetroll and microformats2-parser’s demo web app.

Now used in the magicbane framework (which was also extracted from sweetroll).

Usage

Add a dependency on wai-cli and write something like this:

{-# LANGUAGE OverloadedStrings #-}
import Web.Scotty
import Network.Wai.Cli
import Data.Monoid (mconcat)

app = scottyApp $ do
  get "/:word" $ do
    beam <- param "word"
    html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]

main = defWaiMain =<< app

Want to use command line args for your application-specific settings? Don’t. Use environment variables instead. Possibly with dotenv to load some of them from a file. envy is a really awesome way to read them.

License

This is free and unencumbered software released into the public domain.
For more information, please refer to the UNLICENSE file or unlicense.org.