Lean: Hale.WaiExtra | Haskell: wai-extra
API Reference: Hale.WaiExtra | AddHeaders | ForceSSL | Gzip | HttpAuth | Test
36 middleware modules for request/response transformation.
+----------------------------------------------+
| Middleware Composition |
| |
| m1 . m2 . m3 : Middleware |
| |
| Algebraic Laws: |
| id . m = m (left identity) |
| m . id = m (right identity) |
| (f.g).h = f.(g.h) (associativity) |
+----------------------------------------------+
Request --> m1 --> m2 --> m3 --> App --> Response
| | | |
| modify| check | | modify
| headers auth | | headers
v v v v
| Middleware | Proven Properties | Description |
methodOverride | – | Override method from _method query param |
methodOverridePost | – | Override method from POST body |
acceptOverride | – | Override Accept from _accept param |
realIp | – | Extract client IP from X-Forwarded-For |
rewrite | – | URL path rewriting rules |
| Middleware | Proven Properties | Description |
addHeaders | addHeaders [] = id | Add headers to responses |
stripHeaders | stripHeaders [] = id | Remove headers from responses |
combineHeaders | – | Merge duplicate headers |
gzip | – | Gzip compression (framework) |
streamFile | – | Convert file->stream responses |
| Middleware | Proven Properties | Description |
select | select (fun _ => none) = id | Conditional middleware |
routed | routed (fun _ => true) m = m, routed (fun _ => false) = id | Path-based routing |
vhost | – | Virtual host routing |
urlMap | – | URL prefix routing |
| Middleware | Proven Properties | Description |
forceSSL | Secure requests pass through | Redirect HTTP->HTTPS |
forceDomain | – | Redirect to canonical domain |
httpAuth | – | HTTP Basic Authentication |
localOnly | – | Restrict to localhost |
requestSizeLimit | – | Reject oversized bodies (413) |
validateHeaders | – | Reject invalid header chars (500) |
| Middleware | Description |
requestLogger | Apache/dev format logging |
requestLogger.json | Structured JSON logging |
healthCheck | Health check endpoint (200 OK) |
timeout | Request timeout (503) |
| Middleware | Description |
autohead | HEAD->GET + strip body |
cleanPath | Normalize URL paths (301 redirect) |
approot | Application root detection |
eventSource | Server-Sent Events |
jsonp | JSONP callback wrapping |
All proofs are in the source files, verified at compile time (no sorry):
| Theorem | Statement |
addHeaders_nil_builder | Empty headers on builder = identity |
addHeaders_nil_file | Empty headers on file = identity |
addHeaders_nil_stream | Empty headers on stream = identity |
| Theorem | Statement |
stripHeaders_nil_builder | Empty strip list on builder = identity |
stripHeaders_nil_file | Empty strip list on file = identity |
stripHeaders_nil_stream | Empty strip list on stream = identity |
| Theorem | Statement |
select_none | Always-none selector = identity middleware |
| Theorem | Statement |
routed_true | Always-true predicate = apply middleware |
routed_false | Always-false predicate = identity middleware |
| Theorem | Statement |
forceSSL_secure | Secure requests pass through unchanged |
| Theorem | Statement |
healthCheck_passthrough | Non-matching paths pass through to inner app |
| File | Purpose |
Middleware/AddHeaders.lean | Add headers + 3 identity proofs |
Middleware/StripHeaders.lean | Remove headers + 3 identity proofs |
Middleware/Select.lean | Conditional middleware + 1 proof |
Middleware/Routed.lean | Path-based routing + 2 proofs |
Middleware/ForceSSL.lean | HTTP->HTTPS redirect + 1 proof |
Middleware/HealthCheckEndpoint.lean | Health check + 1 proof |
Middleware/Autohead.lean | HEAD method handling |
Middleware/AcceptOverride.lean | Accept header override |
Middleware/MethodOverride.lean | Method override (query param) |
Middleware/MethodOverridePost.lean | Method override (POST body) |
Middleware/Vhost.lean | Virtual host routing |
Middleware/Timeout.lean | Request timeout |
Middleware/CombineHeaders.lean | Header deduplication |
Middleware/StreamFile.lean | File->stream conversion |
Middleware/Rewrite.lean | URL rewriting |
Middleware/CleanPath.lean | Path normalization |
Middleware/ForceDomain.lean | Domain redirect |
Middleware/Local.lean | Localhost restriction |
Middleware/RealIp.lean | Client IP extraction |
Middleware/HttpAuth.lean | Basic authentication |
Middleware/RequestSizeLimit.lean | Body size limit |
Middleware/ValidateHeaders.lean | Header validation |
Middleware/RequestLogger.lean | Request logging |
Middleware/RequestLogger/JSON.lean | JSON request logging |
Middleware/Gzip.lean | Gzip compression |
Middleware/Approot.lean | Application root |
Middleware/Jsonp.lean | JSONP support |
UrlMap.lean | URL prefix routing |
Header.lean | WAI header utilities |
Request.lean | Request utilities |
Parse.lean | Multipart/form parsing |
EventSource.lean | Server-Sent Events |
EventSource/EventStream.lean | SSE stream types |
Test.lean | WAI test utilities |
Test/Internal.lean | Test internals |
Middleware/RequestSizeLimit/Internal.lean | Size limit internals |