Revision history for Catalyst-Seal
0.04 2026-09-05
- 92.3 to 70.6 us per request on a bare application, best of five.
- ADDS: the query string is parsed, percent-decoded and UTF-8 decoded
in C. Four pairs 12.90 to 1.29 us, an empty query 1.93 to 0.78.
The decoder accepts exactly what Encode accepts, noncharacters
included, and hands anything else back to Encode to be refused.
- ADDS: XS constructors for the context, request and response classes,
built from a template resolved at seal time. 8.0 to 4.3 us a request.
A trigger, a coercion, a failed type check, a missing required
attribute, a subclass or an odd argument list takes the stock one.
- ADDS: Catalyst::Seal::Execute. execute reads its stack, state and
args as slots rather than through nine accessor calls a time, nine
times a request; Catalyst::Action::execute and ::dispatch are XSUBs;
use_stats is a constant and depth counts the array in C.
- ADDS: a write through a sealed accessor is answered in XS where the
attribute is plain: 132 to 51 ns.
- ADDS: the header pass is in C, 1.54 to 0.94 us.
- FIX: t/lib's /query action called get_all on a plain hash, so both
sides died the same way and the query comparisons proved nothing.
The parity table now covers separator runs, empty names and values,
repeats, isindex, bad escapes, surrogates, overlongs and
noncharacters.
- prepare_path reaches the request once instead of five times.
0.03 2026-09-04
- SECURITY: CVE-2026-85491. Remove the dispatch route memo added in 0.01.
It was keyed on the request path alone, on the premise that which action
a path resolves to is a pure function of that path.
- t/61-dispatch-method.t is the regression, and six method-varying requests
are now in the t/20-parity.t table.
- The memos that remain resolve through get_action and get_containers,
which are lookups in the action and container tables and consult no
request state. Audited, and documented in Dispatch.pm.
- Costs about 2us a request on a one segment path and 4us on two.
0.02 2026-09-03
- Do not rely on when perl collects an object to test that the response
destructor calls DEMOLISH. CPAN Testers failed t/70-finalize.t on
5.16.3, 5.18.0, 5.18.2 and 5.18.4.
- Require Devel::GlobalDestruction and Scalar::Util where they are used.
- Silence 200 deliberate forward errors that t/60-dispatch.t was putting
into every smoke report.
0.01 2026-09-02
First version