New in the 0.4.0-SNAPSHOT development line — everything listed here landed after the 0.3.0 release and is not part of it. Every entry links to the section that documents it, and those sections carry the NEW badge. Each brick of the suite keeps its own page of this kind; the ecosystem index gathers them. When the next release train ships, this page is frozen with it and restarts empty on the dev line.
Request entities
-
An unreadable request entity is a 400, not a 500 — malformed JSON, an empty body, a JSON value of the wrong shape or type for the Java type: the resource method is not called and Cassini answers
400 Bad Request, with an empty body unless the application mapsBadRequestException. The application’sExceptionMapperfor the exception the reader threw still runs first. Up to 0.3.0, these requests answered500with the parser’s message (cassini#39). Unreadable request entities. -
NoContentExceptionbecomes aBadRequestException— whatever reader throws it, the application’s included, as Jakarta REST §4.2.4 requires; the built-in JSON reader now throws it for an empty entity. Unreadable request entities. -
No ERROR log for a client’s malformed entity — one line at
DEBUGon theio.vidocq.cassini.entitylogger, and the stack trace atTRACE, where each such request used to log a full stack trace atERROR. A type the JSON-B provider cannot reach, its package not exported to it, remains a server error logged atERROR. Unreadable request entities.
Response headers
-
A response header Chappe refuses is a clear 500 — a header whose value holds CR, LF, a control character or a character above
U+00FF(a raw UTF-8 file name inContent-Disposition, typically), whose name is not a token, or whose value isnull. Cassini answers500and logs oneERRORline that names the header, never its value, and points to the RFC 8187 encoding. A streamed response in that case now releases the thread writing its entity instead of leaving it blocked (cassini#56). Response headers with non-Latin-1 text.
Embedding
-
A host can read the route table —
CassiniStack.routes()returns the routes a stack resolved, in match order, asRouteDescriptionvalues: HTTP method, path template, resource class and method names, produced and consumed media types. A host such as Vidocq can list what an application exposes without reaching intocassini-core(cassini#41). Reading the route table. -
Live request figures —
CassiniStack.statistics()returns the counters a stack keeps: requests answered, in flight, by status class, and the total and longest time spent answering them. Reading them creates nothing and takes no lock; updating them allocates nothing and costs about 25 ns per request, so they are on by default, andstatistics(false)removes them (cassini#42). Reading live request figures.
Other CDI containers
-
cassini-coreno longer brings Champollion — it depends on the JSON-P and JSON-B APIs only, and the application, or its runtime, picks the implementation: the Vidocq REST extension brings Champollion, so nothing changes in a Vidocq application. A standalone application that relied oncassini-corefor JSON addschampollion-jsonb(or another JSON-B implementation). Without one, the stack still starts and only a JSON entity fails (vidocq-workspace#17). Getting started. -
cassini-cdi, a container-neutralBeanProvider— Cassini resolves its resources and providers as beans of any CDI 4 container, throughCDI.current(), theBeanManagerandRequestContextController, and activates the request context around each request.cassini-it-weldproves it on Chappe with Weld SE: injection, a@RequestScopedbean per request, interceptors on resources (cassini#53). Other CDI containers. -
CassiniScopeExtensionmoved tocassini-cdi— the BCE that gives@Pathand@Providerclasses their default scope is nowio.vidocq.cassini.cdi.CassiniScopeExtension;cassini-cdi-vaubandepends oncassini-cdiand keeps its own, faster provider, which outranks the neutral one when Vauban runs. Nothing changes for a Vidocq application. Code that named the classio.vidocq.cassini.cdi.vauban.CassiniScopeExtensionuses the new package. Java modules.