Changes for version 0.58 - 2026-10-13
- SECURITY: an Idempotency-Key replayed one resource's response for another. The path and query string are now part of what a key is checked against, and a mismatch is the 422.
- FIX: `Punk::Model::DBIx::Loop->await` used a stale stack pointer after a callback grew the stack.
- FIX: a sparse `order_by` arrayref crashed the worker.
- FIX: a `limit` at or past the integer maximum became a negative LIMIT.
- FIX: a page ending on a NULL in an `order_by` column ended the walk.
- FIX: a retry arriving after the cache store's `lock_wait` ran beside the request it was retrying.
- FIX: an idempotent request that won the lock did not look again for a recorded answer.
- FIX: reading an expired file cache entry could delete a fresh one.
- Add the Idempotency `lock_wait` option, default 30 seconds.
- `get` and `delete` croak on a key that is not a field.
- The pooled DBI handle has `AutoInactiveDestroy`.
- `$c->validate` holds at most 256 compiled schemas.
- FIX t/1041-stream-handle.t on Linux smokers: the h2 body is its own probe, and drain is asked of a client that does not read.
- Requires Hyperman 0.59, which sends an HTTP/2 stream body whole.
Documentation
the Punk command line
Modules
a MVC web framework
the per-application registry and boot compiler
async and await in Punk apps, controllers and models
the authentication battery
password hashing
cross-origin resource sharing
single-use CSRF tokens
a pluggable cache with TTL
a cache store on disk, shared by the whole worker pool
an in process cache store, bounded by bytes
the punk command line: registry, dispatcher and commands
YAML configuration with secrets kept out of the file
the per-request object
base class for Punk controllers
the DBI subclass that makes every statement observable
the observed database handle
the observed statement handle
the development error page
an async result that runs on the loop, or blocks
scaffold a new Punk application
security response headers
a level-based logger
the storage-agnostic model tier
the default DBI backend for Punk models
a non-blocking backend for Punk models
a directory of markdown as a documentation site
the api mount: spec-first operations
base class for Punk plugins
content addressed storage for uploads
Content-Security-Policy with a per request nonce
ETags, Last-Modified and 304s for dynamic responses
liveness and readiness probes that mean different things
translations and language negotiation
Idempotency on unsafe methods
a Prometheus endpoint whose labels cannot run away
give every request an id
sitemap.xml and robots.txt from the route table
rate limiting and IP blocking over Hyperman's shared arena
a lazy wrapper over the PSGI environment
a response builder
the compiled-at-boot route tables (XS)
the handle an under returns
a Server-Sent Events stream
the bounded body of a ranged send_file response
signed cookie sessions
server-side sessions, on any store
serving files from a directory
a streamed response for an ordinary route
an in-process test client for Punk applications
a pure-Perl RFC 6455 codec for testing WebSocket servers
the client side of one WebSocket connection
the transaction a $c->txn block receives
the outbound HTTP agent on the context
an uploaded file from a multipart form
collecting request validation
the Template::Stencil view engine
the pluggable view engine registry (XS)
a WebSocket connection
pub/sub groups of WebSocket connections
Examples
- example/Chat/README.pod
- example/Chat/app.psgi
- example/Chat/bin/make-cert
- example/Chat/bin/punk-chat
- example/Chat/bin/tls-proxy
- example/Chat/docs/api.md
- example/Chat/docs/index.md
- example/Chat/docs/reference/config.md
- example/Chat/docs/running.md
- example/Chat/docs/websockets.md
- example/Chat/lib/Chat.pm
- example/Chat/lib/Chat/Auth.pm
- example/Chat/lib/Chat/Bus.pm
- example/Chat/lib/Chat/Controller/API/Message.pm
- example/Chat/lib/Chat/Controller/WS/Chat.pm
- example/Chat/lib/Chat/Controller/Web/Chat.pm
- example/Chat/lib/Chat/Model/Message.pm
- example/Chat/lib/Chat/Schema.pm
- example/Chat/openapi.json
- example/Chat/root/static/chat.css
- example/Chat/root/static/chat.js
- example/Chat/root/templates/index.tmpl
- example/Chat/root/templates/layout.tmpl
- example/Chat/root/templates/room.tmpl
- example/Chat/tls/server.crt
- example/Chat/tls/server.key