Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
305 commits
Select commit Hold shift + click to select a range
b73bfe8
Give back the SATB log once the burst that sized it is over
shaiblah Sep 8, 2026
6e71282
Answer a JSON request off the pooled Response too
shaiblah Sep 8, 2026
ed52aaf
Give MapBench the copyright header the gate requires
shaiblah Sep 8, 2026
3788f55
Build the backend runtime as part of the reactor
shaiblah Sep 8, 2026
897bcfa
Merge remote-tracking branch 'origin/master' into backend-throughput
shaiblah Sep 8, 2026
0c8ee7e
Document the backend, and what it is not for
shaiblah Sep 8, 2026
3f6b082
Generate a backend module with the app
shaiblah Sep 8, 2026
ca81184
Ship a backend module in initializr downloads
shaiblah Sep 8, 2026
751b6c2
Give the archetype's backend handler the copyright header
shaiblah Sep 8, 2026
872f89b
Validate the backend module in the initializr artifact too
shaiblah Sep 8, 2026
afb9127
Make the backend chapter a chapter rather than a pitch
shaiblah Sep 8, 2026
d943d5e
Refuse an archive entry that unpacks outside its target directory
shaiblah Sep 8, 2026
812a43d
Close the framing, decoding and binding holes review found
shaiblah Sep 8, 2026
a5e778e
Give each HTTP/2 stream its own response body, and cap it
shaiblah Sep 8, 2026
762bbbd
Open static files beneath the root instead of checking afterwards
shaiblah Sep 8, 2026
99230cd
Backend: address the second codex review round
shai-almog Sep 8, 2026
0e0b139
Backend: decode chunked replies, and fail packaging with the real reason
shai-almog Sep 8, 2026
aa3436d
Backend: address the third codex review round
shai-almog Sep 8, 2026
e19f7b7
Backend: address the fourth codex review round
shai-almog Sep 8, 2026
089bb79
Backend: stream static files over HTTP/2 instead of buffering them
shai-almog Sep 8, 2026
516ea0b
Backend: address the fifth codex review round
shai-almog Sep 8, 2026
6d5125b
Backend: address the sixth codex review round
shai-almog Sep 8, 2026
87bc8f4
Backend: address the seventh codex review round
shai-almog Sep 8, 2026
24e3188
Backend: address the eighth codex review round
shai-almog Sep 8, 2026
94367c1
Backend: address the ninth codex review round
shai-almog Sep 8, 2026
a6825b7
Backend: address the tenth codex review round
shai-almog Sep 8, 2026
720e6f7
Backend: address the eleventh codex review round
shai-almog Sep 8, 2026
fc62823
Backend: address the twelfth codex review round
shai-almog Sep 8, 2026
4685a04
Backend: repair the archetype XML, and guard the second head path
shai-almog Sep 8, 2026
06d0d27
Backend: put TLS on the pool, and stop claiming what the mode does no…
shai-almog Sep 8, 2026
61a6d79
Backend: reflow the command correction in the generated server
shai-almog Sep 8, 2026
b4f3a6a
Backend: repair the write path my non-blocking change broke
shai-almog Sep 8, 2026
dc4cdd4
Backend: routes are annotated methods, and the build writes the main
shai-almog Sep 8, 2026
654651e
Backend: test what a slow client does, and fix what that found
shai-almog Sep 8, 2026
85c043b
Backend: run the self-test on the arm that ships
shai-almog Sep 8, 2026
84e72b6
Backend: bound every native buffer slice, not just the one that was r…
shai-almog Sep 8, 2026
189f23e
Backend: stop trusting a bucket name, and stop freeing sessions still…
shai-almog Sep 8, 2026
c166cf0
Backend: a status can forbid a body, and a refused result is not a de…
shai-almog Sep 8, 2026
0d41c39
Backend: matched rows are not changed rows, and a dotted bucket needs…
shai-almog Sep 8, 2026
f0e81c0
Backend: SIGPIPE must not kill a runtime that never bound a listener
shai-almog Sep 8, 2026
b8cad00
Backend: a slow head, a short secret, and a second virtual-thread server
shai-almog Sep 8, 2026
7bad982
Backend: hold the HTTP/2 session for the whole turn, and bound what i…
shai-almog Sep 8, 2026
08d7ef5
Backend: cn1:backend-package could not link, and three narrower refusals
shai-almog Sep 8, 2026
2fdb7b4
Backend: yield across DNS, and stop the dev loop diverging from the t…
shai-almog Sep 8, 2026
6b0989f
Backend: the Date fix did not work, and now a test says so
shai-almog Sep 8, 2026
f76114f
Backend: a port the packaged server accepted and the dev loop refused
shai-almog Sep 9, 2026
06b1bcd
Backend: the outbound port had the same hole I had just reasoned away
shai-almog Sep 9, 2026
59094a8
Backend: a Connection option is a token, not a substring
shai-almog Sep 9, 2026
23131d8
Backend: bound the body by RATE, and stop losing inherited DTO fields
shai-almog Sep 9, 2026
b62f253
Backend: cover the three generator fixes I shipped without tests
shai-almog Sep 9, 2026
6f53451
Backend: overlap is not equality, and a narrowed integer is not the o…
shai-almog Sep 9, 2026
5b845aa
Merge master into backend-throughput
shai-almog Sep 9, 2026
a406bf3
Backend: the chunked path had the hole the fixed-length one just lost
shai-almog Sep 9, 2026
6af414c
Backend: make the two generators agree, and refuse a return they cann…
shai-almog Sep 9, 2026
fee09b2
Backend: a stored hash of "pbkdf2$1$$" accepted every password
shai-almog Sep 9, 2026
bc42e2f
Backend: a fresh clone could not build at all
shai-almog Sep 9, 2026
e0dcfd1
Backend: nothing shed a pooled connection once the reactor had it back
shai-almog Sep 9, 2026
3c65956
GC probe: the release wait was sized for four markers, not one
shai-almog Sep 9, 2026
7d7cb54
Backend: exact decimals, matching transaction modes, real field names
shai-almog Sep 9, 2026
943a2d1
Backend: bound what is outstanding, not what was just handed over
shai-almog Sep 9, 2026
e1f4fe8
GC probe: correct the rationale -- the wait was not the problem
shai-almog Sep 9, 2026
aa5da6c
GC: say when a host cannot release pages at all, and read it in the test
shai-almog Sep 9, 2026
b37c044
Backend: redirects, unresolved invocations, and encoded parameter names
shai-almog Sep 9, 2026
6abaaee
Backend: bound h2 headers and descriptors, and two silent value changes
shai-almog Sep 9, 2026
2a1dc0f
Backend: stop refusing the most ordinary route pair, and two exactnes…
shai-almog Sep 9, 2026
eb32944
GC: a standing dead-thread demand must not wait out the long idle
shai-almog Sep 9, 2026
a81834e
Backend: finish four fixes that were only done on one side
shai-almog Sep 9, 2026
76b8350
Backend: make the annotations honest, and stop trusting "java."
shai-almog Sep 9, 2026
0b22afd
Backend: 205 and 304 framing, body element types, and interim statuses
shai-almog Sep 9, 2026
99a14f4
Backend: check the file cap before spending one, and two narrowing fixes
shai-almog Sep 9, 2026
2b45ff6
Backend: the two JSON writers disagreed about Float, and a relative p…
shai-almog Sep 9, 2026
583e992
Contracts: the same route rules the controller half already had
shai-almog Sep 9, 2026
e7d35f4
Merge remote-tracking branch 'origin/master' into backend-throughput
shai-almog Sep 9, 2026
1ca4b72
Android: the ComponentName guard stands on its own after the gate was…
shai-almog Sep 9, 2026
ca43dca
Android: restore the file's CRLF endings, which my edit had stripped
shai-almog Sep 9, 2026
44603eb
Gates: a native check that could pass over nothing, and two decode fixes
shai-almog Sep 9, 2026
0c18458
Backend: a float that does not fit, and a resource that is staged but…
shai-almog Sep 9, 2026
19ec6ba
Backend: an empty PUT, a deadline on progress, and a 416 that was not…
shai-almog Sep 9, 2026
d8abc37
Backend: bound response bodies process-wide, and stop inventing dates
shai-almog Sep 9, 2026
8141d2d
Backend: sweep the locale-sensitive folds, not just the reported one
shai-almog Sep 9, 2026
1cdb850
Backend: bound inbound bytes process-wide, and let sqlite=false build
shai-almog Sep 9, 2026
e954b46
Backend: stop believing Content-Length before the body exists
shai-almog Sep 9, 2026
ecfc128
Controllers: an empty numeric value is not an omission
shai-almog Sep 9, 2026
95ea0de
HTTP/2: charge header bytes before the rejections, not after them
shai-almog Sep 9, 2026
a522d42
HTTP/2: the request structure is memory too; and run what the generat…
shai-almog Sep 9, 2026
9a6dc4a
Web: CURLOPT_PATH_AS_IS was guarded by an #ifdef that never fires
shai-almog Sep 9, 2026
7308074
Backend: the locale sweep that 8141d2d70d claimed but did not contain
shai-almog Sep 9, 2026
a9e6948
Backend: a download bigger than byte[], nested elements, and h2 HEAD
shai-almog Sep 9, 2026
5328e4b
Backend: bound uploads in flight, and check what a map body really holds
shai-almog Sep 9, 2026
68b7952
Controllers: returning a Response never worked, and nesting one is no…
shai-almog Sep 9, 2026
2b615ed
Backend: three holes left by the last three fixes
shai-almog Sep 9, 2026
f8dabf2
Backend: an empty value is not a false, and a 204 has no length to re…
shai-almog Sep 9, 2026
3e368f2
Backend: stop coercing what the client got wrong, and refuse a dead r…
shai-almog Sep 9, 2026
957432d
HTTP: sweep deadlines on a busy host, and grow the tables at accept
shai-almog Sep 9, 2026
b8ec94c
Backend: test the server with ParparVM as the client
shai-almog Sep 9, 2026
d82f76a
Backend: seven review findings, each with the test that shows it
shai-almog Sep 9, 2026
e09d000
CI: prune apt sources by origin, and do it before Playwright's apt
shai-almog Sep 9, 2026
6947d28
CI: the apt prune deleted the distribution; keep it, and check that i…
shai-almog Sep 9, 2026
6af8168
Controllers: the HEAD fallback's own clash, map keys, and infinite de…
shai-almog Sep 9, 2026
5731889
Backend: reserve upload memory before taking it, and two more overflows
shai-almog Sep 9, 2026
34cf878
Backend: the h2 body ceiling is a reservation, and wildcards are read…
shai-almog Sep 9, 2026
342b4dc
Processors: two false refusals and one that was missing
shai-almog Sep 9, 2026
a08c4d9
Backend: chunked uploads are charged, bodies must be UTF-8, map keys …
shai-almog Sep 9, 2026
8f5a82c
Re-sync the PR with the branch
shai-almog Sep 10, 2026
9b6f576
Backend: a would-block read is not a hangup, and shutdown frees parke…
shai-almog Sep 10, 2026
fef854e
Contracts: a JSON string is not a number
shai-almog Sep 10, 2026
a0ed316
Processors: incremental builds, route shapes, and a null password
shai-almog Sep 10, 2026
f6be74d
Backend: a tunable that would divide by zero falls back instead
shai-almog Sep 10, 2026
0d8dd03
Backend: descriptor accounting, an atomic file ceiling, and a Windows…
shai-almog Sep 10, 2026
bcc4c88
Generated routes: a malformed escape is a 400, and Tcp refuses a nega…
shai-almog Sep 10, 2026
65b16e1
Backend: two more arm divergences, and an inherited Writable
shai-almog Sep 10, 2026
da0fd68
Backend: a shared Db serializes its transactions, and DTOs inherit ac…
shai-almog Sep 10, 2026
d6bb5b4
Backend: release the connection on an Error, and refuse malformed esc…
shai-almog Sep 10, 2026
74b5d60
Backend: a shared Database owns its session for the whole transaction
shai-almog Sep 10, 2026
f7e74e2
Backend: three declarations that promised what nothing delivered
shai-almog Sep 10, 2026
6e913a7
Backend: one hex parser, an atomic insert, and a URL that stays out o…
shai-almog Sep 10, 2026
e843735
Merge branch 'master' into backend-throughput
shai-almog Sep 11, 2026
36428a5
Backend: a pool connection that cannot be closed, and a truncated cod…
shai-almog Sep 11, 2026
e512ddb
Refuse signed numbers in HTTP dates and database ports
shai-almog Sep 11, 2026
c18e926
Keep the page-floor probe's live set out of the settling frame
shai-almog Sep 11, 2026
4246302
Re-read a CA bundle that was rotated at the same path
shai-almog Sep 11, 2026
509ff48
Clamp the socket timeout, and redirect the exact static mount
shai-almog Sep 11, 2026
862a4b9
Check an HTTP date's weekday against its date
shai-almog Sep 11, 2026
ae3447c
Validate response headers by the byte, and refuse unknown h2 methods
shai-almog Sep 11, 2026
dc2ad85
Validate outbound header lines and the inbound Host authority
shai-almog Sep 11, 2026
46a6be6
Route HEAD to GET, keep flag-style queries, read If-None-Match as a list
shai-almog Sep 11, 2026
4e1e9be
Require complete percent triplets in an authority
shai-almog Sep 11, 2026
c8298b4
Refuse a request target whose escapes are not valid UTF-8
shai-almog Sep 11, 2026
5706448
Retain a cached TLS context across the unlock, and check the h2 target
shai-almog Sep 11, 2026
cf49bac
Validate the h2 authority, and refuse a DTO array of the wrong shape
shai-almog Sep 11, 2026
7ac8f77
Encode URL literals as UTF-8, and read range bounds as ASCII digits
shai-almog Sep 11, 2026
5cef2d0
Swap the SATB log, match bind counts, keep credentials through a blip
shai-almog Sep 11, 2026
65c112c
Hold every SQL engine to its own parameter count
shai-almog Sep 11, 2026
204cd92
Bound an outbound response, and refuse a workerless server before bin…
shai-almog Sep 11, 2026
27b3f2d
Wait for every worker, and close the pollers, before stop() reports done
shai-almog Sep 11, 2026
45f017f
Refuse a non-HTTP outbound URL, and clean up a failed start
shai-almog Sep 11, 2026
8e828be
Validate raw target bytes, parse IPv6 literals, refuse a combined Host
shai-almog Sep 11, 2026
8a4267f
Decode external text as UTF-8 instead of reading it as a C literal
shai-almog Sep 11, 2026
b777905
Merge remote-tracking branch 'origin/master' into backend-throughput
shai-almog Sep 11, 2026
ff96aec
HTTP octets stay octets, and a half-copied h2 header is not published
shai-almog Sep 11, 2026
1ae492a
Back out the SATB buffer swap and refuse a partial take instead
shai-almog Sep 11, 2026
80f030c
Refuse a cleartext PostgreSQL password on an unencrypted connection
shai-almog Sep 11, 2026
75d0d1d
An undrained SATB log blocks the sweep, and a temporary credential ex…
shai-almog Sep 11, 2026
4263f15
Bound a database server's message, and close a desynchronised connection
shai-almog Sep 11, 2026
055e20a
Merge remote-tracking branch 'origin/master' into backend-throughput
shai-almog Sep 12, 2026
2ef2581
Close the three gaps left by the review's last round
shai-almog Sep 12, 2026
622da95
Rebuild the translator when its sources move, not just when it is absent
shai-almog Sep 12, 2026
f4d163f
Stop a peer choosing how much work these three loops do
shai-almog Sep 12, 2026
2937ac0
Bind SQLite text by its length, and check all four MySQL header bytes
shai-almog Sep 12, 2026
803b98a
Check row frames before indexing them, and decode a target's raw octets
shai-almog Sep 12, 2026
b1d1c37
Let go of an upload's buffer before the connection waits for the next…
shai-almog Sep 12, 2026
9335c46
Bound the rest of both drivers' readers, not just the row parsers
shai-almog Sep 12, 2026
b4abd37
Refuse a malformed escape, and an expiry that never happened
shai-almog Sep 12, 2026
a9567c1
Stop a quiet connection holding a target cache and a response's peak …
shai-almog Sep 12, 2026
95298a5
Validate chunked trailers, and two smaller things the review found
shai-almog Sep 12, 2026
4b93f8f
Keep the header list and the statement when the thing after them fails
shai-almog Sep 12, 2026
bc64fed
Bound a column count, the other half of a PBKDF2 product, and one mor…
shai-almog Sep 12, 2026
52ba19c
Refuse a line break hidden in a chunk extension, and charge h2 bodies…
shai-almog Sep 12, 2026
2a30c07
GC uncooperative-thread gate: compare the stall against the stall
shai-almog Sep 12, 2026
e755d65
A row is exactly as wide as its description, and two paths that skipp…
shai-almog Sep 12, 2026
c2fbc2f
Check the strdup in front of the one I just checked, and require a se…
shai-almog Sep 12, 2026
af1b057
The controller's target validator reads raw octets too, like its deco…
shai-almog Sep 12, 2026
61e8a56
Finish the allocation sweep in one function, and answer an expectation
shai-almog Sep 12, 2026
db6ca64
Charge the h2 inbound buffer by capacity, and stop the guide recommen…
shai-almog Sep 12, 2026
9f3e8a8
Choose a route by the URI, not by how it was spelled
shai-almog Sep 12, 2026
3ce5c1b
Charge the chunked buffer's capacity, close dead sessions, and finish…
shai-almog Sep 12, 2026
7a0db50
Recognise a scheme in any case, close on write failures, refuse a rep…
shai-almog Sep 12, 2026
d2be070
An S3 endpoint's scheme is case-insensitive too, and one bound parses…
shai-almog Sep 12, 2026
e6ca7c4
Put the file's identity in the static ETag
shai-almog Sep 12, 2026
efcdf3b
Publish a database session's closure flag to the thread asking isOpen()
shai-almog Sep 12, 2026
c7e3bc2
Stop generating a controller whose source was deleted
shai-almog Sep 12, 2026
464893f
Merge master into backend-throughput
shai-almog Sep 12, 2026
dc41f01
Check the certificate path copy before OpenSSL opens it
shai-almog Sep 12, 2026
578d772
Match a route in one pass instead of trying every placement
shai-almog Sep 12, 2026
d7d194f
Close a file-backed response's descriptor however the write ends
shai-almog Sep 12, 2026
0cc117a
Refuse a credential whose key pair is empty, not just absent
shai-almog Sep 12, 2026
bba278e
Initialise libcurl once, before a second thread can be in it
shai-almog Sep 12, 2026
2c35812
Publish a refreshed S3 credential to the threads that sign with it
shai-almog Sep 12, 2026
fb684b6
Refuse a contract route that holds the same placeholder twice
shai-almog Sep 12, 2026
6ca1a34
Unpack a jar dependency before handing it to the translator
shai-almog Sep 12, 2026
ee9c53a
Reserve the process-wide h2 inbound total atomically
shai-almog Sep 12, 2026
e957236
Refuse an AWS region that is not one hostname label
shai-almog Sep 12, 2026
23b286e
Match the static mount on the canonical path, as the routers do
shai-almog Sep 12, 2026
b8f61f9
Find the TLS and HTTP/2 headers where the machine keeps them
shai-almog Sep 12, 2026
c9c8107
Give an h2 session's output buffer back at the idle size
shai-almog Sep 12, 2026
5b6dccb
Keep an outbound URL's secrets out of the error it reports
shai-almog Sep 12, 2026
296b75e
Send a field value as octets, whichever protocol carries it
shai-almog Sep 12, 2026
d1f7187
Answer an h2 Expect when the headers arrive, not after the body
shai-almog Sep 12, 2026
5eeec06
Cut the fragment out of an error message too, not just the query
shai-almog Sep 12, 2026
daba0b1
Read every Expect field over h2, not the first one
shai-almog Sep 12, 2026
86156c0
Refuse a fragment in the request target, on both protocols
shai-almog Sep 12, 2026
498bd83
Bound a TLS handshake by total elapsed time
shai-almog Sep 12, 2026
505db14
Stage the dependency classpath as one first-wins tree
shai-almog Sep 12, 2026
122cd73
Refuse a control character in a URL before libcurl truncates it
shai-almog Sep 12, 2026
b8b4f0e
Fail the request when libcurl cannot be initialised
shai-almog Sep 12, 2026
942adb8
Refuse the malformed frames that were being read as data
shai-almog Sep 12, 2026
c21b8ed
Synchronize lastInsertId with the close that frees the connection
shai-almog Sep 12, 2026
6e3885a
Refuse a control character in a host name, not just in a URL
shai-almog Sep 13, 2026
0c1c019
Identify the backend runtime by its artifact, not by a path substring
shai-almog Sep 13, 2026
edfe388
Write a nested class's SOURCE name into generated Java
shai-almog Sep 13, 2026
b9b93a1
Keep the request line's other field from being written by the caller
shai-almog Sep 13, 2026
b9c48b0
Keep what an interrupted sendfile already sent
shai-almog Sep 13, 2026
b89f431
Check the other client's request line, and bracket an IPv6 Host
shai-almog Sep 13, 2026
4e46d74
Keep the transport's own fields out of a caller's header list
shai-almog Sep 13, 2026
2903522
Refuse an sslmode this runtime does not implement
shai-almog Sep 13, 2026
9fc43bc
Keep every value of a repeated response header
shai-almog Sep 13, 2026
d82375e
Refuse a NUL in the TLS trust root's path
shai-almog Sep 13, 2026
bc59514
Backend: canonicalise a declared route pattern the way a request is
shai-almog Sep 13, 2026
3a672b4
Backend: keep a parked request's headers out of the host's shared buffer
shai-almog Sep 13, 2026
48962b5
Backend: four ways the outbound client disagreed with the peer it was…
shai-almog Sep 13, 2026
3dd1660
Backend: check the TLS name, skip interim responses, stage a director…
shai-almog Sep 13, 2026
625401b
Backend: refuse the body before inviting it, and close a session that…
shai-almog Sep 13, 2026
e3e6c2b
Backend: a NUL must not open another file, and a close must not free …
shai-almog Sep 13, 2026
a28536e
Backend: a bind address, a response's end, and the encoding sources a…
shai-almog Sep 13, 2026
6656401
Backend: refuse a truncating database path, and pin If-Range to the e…
shai-almog Sep 13, 2026
92fef35
Backend: close the truncating-string class by enumerating it, not by …
shai-almog Sep 13, 2026
6e8d9a3
Backend: a connection field cannot carry a second one, and a lost han…
shai-almog Sep 13, 2026
81c0c95
Merge master into backend-throughput
shai-almog Sep 13, 2026
021748a
Backend: one teardown per server, and a handler may ask for its own
shai-almog Sep 13, 2026
c51469d
Backend: a chunked body ends at its terminator, and a second stop() s…
shai-almog Sep 13, 2026
f9a9e4d
Backend: a length that contradicts itself, a refusal that carried the…
shai-almog Sep 13, 2026
7f0c468
Backend: a credential endpoint off this host must be encrypted
shai-almog Sep 13, 2026
2ca93cf
Backend: a close must not hand back a descriptor an operation is stil…
shai-almog Sep 13, 2026
04945ea
Backend: a route that cannot match is refused, not generated
shai-almog Sep 13, 2026
c7eb9b9
Backend: a bodiless response is not decoded, a URL escape must spell …
shai-almog Sep 13, 2026
92ff34f
Backend: one spelling for a retained escape, and a greeting that name…
shai-almog Sep 13, 2026
74953f8
Backend: an HTTP/2 trailer is not a request header, and an oversized …
shai-almog Sep 13, 2026
0284835
Backend: the client bounds a response while it reads it
shai-almog Sep 13, 2026
bcc377d
Backend: a region resolves in its own partition, and a zero timeout i…
shai-almog Sep 13, 2026
8d16630
Backend: Proxy-Connection is one of the five HTTP/2 forbids
shai-almog Sep 13, 2026
6fa48f4
Backend: the reactor's zero is a probe, and its one-shot means once o…
shai-almog Sep 13, 2026
25aed9a
Backend: read a coded response by its coding, and stop claiming zero …
shai-almog Sep 13, 2026
dffe215
Developer guide: quote the backend figure's alt text
shai-almog Sep 13, 2026
98c0a95
Backend: take a file's identity from the snapshot that measured it
shai-almog Sep 13, 2026
ef30bbd
Backend: refuse a SCRAM password this runtime cannot prepare
shai-almog Sep 13, 2026
a7f7bfe
Backend: half an AWS credential pair is a misconfiguration, not an ab…
shai-almog Sep 13, 2026
1f11465
Backend: a response ends at its framing, and modify means what it says
shai-almog Sep 13, 2026
5e17aa5
Backend: a peer's chunk size cannot break the walk, and modify replaces
shai-almog Sep 14, 2026
d780b12
Give PurchaseTest the copyright header it never had
shai-almog Sep 14, 2026
253a842
Backend: a redirect does not carry the caller's body to another host
shai-almog Sep 14, 2026
5633f73
Merge master into backend-throughput
shai-almog Sep 14, 2026
7f6a02a
Developer guide: one spelling of recognize
shai-almog Sep 14, 2026
e6173d9
Backend: only a safe method follows freely, and one descriptor is one…
shai-almog Sep 14, 2026
791b868
Backend: claim the TLS handshake, bound it, and refuse a negative cei…
shai-almog Sep 14, 2026
4f5c713
Backend: cap the read buffer at its ceiling, and refuse a malformed U…
shai-almog Sep 14, 2026
cff614e
Backend: a removed descriptor loses every filter, not the first one
shai-almog Sep 14, 2026
428a367
Backend: bind static containment to the descriptor, and keep a redire…
shai-almog Sep 14, 2026
0c619b0
Backend: a null method is a GET, and say what the identity check real…
shai-almog Sep 14, 2026
ae4af4c
Backend: list up to max, and refuse a partition this cannot name
shai-almog Sep 14, 2026
57c2226
Backend: a database conversation can have a deadline
shai-almog Sep 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .github/workflows/blog-prose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,11 @@ jobs:
cd scripts
npm init -y 2>/dev/null || true
npm install playwright
# Playwright shells out to apt for the OS-level deps, so the runner
# image's third-party sources have to be pruned FIRST -- a broken
# vendor mirror makes its apt-get fail as a whole and it reports
# only "Failed to install browser dependencies".
bash "$GITHUB_WORKSPACE/scripts/ci/apt-get-update.sh"
npx playwright install-deps chromium
npx playwright install chromium

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/developer-guide-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ jobs:
run: |
set -euo pipefail
xvfb-run -a mvn -B -ntp -f maven/pom.xml \
-pl core,javase,android,css-compiler,codenameone-maven-plugin \
-pl core,javase,android,css-compiler,codenameone-maven-plugin,backend \
-am install \
-Plocal-dev-javase \
-DskipTests \
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/port-status-nightly.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@ jobs:
run: |
npm init -y 2>/dev/null || true
npm install playwright
# Playwright shells out to apt for the OS-level deps, so the runner
# image's third-party sources have to be pruned FIRST -- a broken
# vendor mirror makes its apt-get fail as a whole and it reports
# only "Failed to install browser dependencies".
bash "$GITHUB_WORKSPACE/scripts/ci/apt-get-update.sh"
npx playwright install --with-deps "${{ matrix.browser }}"
- name: Run lifecycle validation
env:
Expand Down
8 changes: 8 additions & 0 deletions .github/workflows/pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ on:
- 'scripts/ci/retry.sh'
- 'scripts/ci/apt-get-update.sh'
- 'scripts/ci/apt-get-install.sh'
- 'scripts/ci/tests/apt-get-update-test.sh'
# The native warning gate's parser self-test runs from this workflow and nowhere
# else -- the legs that run the gate itself need a compiler. Ignoring these meant a
# change to the parser, its fixture or a baseline could merge without the one check
Expand Down Expand Up @@ -85,6 +86,7 @@ on:
- 'scripts/ci/retry.sh'
- 'scripts/ci/apt-get-update.sh'
- 'scripts/ci/apt-get-install.sh'
- 'scripts/ci/tests/apt-get-update-test.sh'
# The native warning gate's parser self-test runs from this workflow and nowhere
# else -- the legs that run the gate itself need a compiler. Ignoring these meant a
# change to the parser, its fixture or a baseline could merge without the one check
Expand Down Expand Up @@ -482,6 +484,12 @@ jobs:
- name: Check build hint catalog
if: ${{ matrix.java-version == 8 }}
run: scripts/check-build-hint-catalog.sh
- name: Check the apt source prune keeps Ubuntu's own sources
if: ${{ matrix.java-version == 8 }}
# Cheap, and the rule it covers is only ever exercised on a runner whose
# apt is already broken -- so without this it would be tested by a red
# build and nothing else.
run: bash scripts/ci/tests/apt-get-update-test.sh
- name: Check the build hint data file can be rendered
if: ${{ matrix.java-version == 8 }}
# Not a drift check: nothing is committed to drift from, because every
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/scripts-javascript.yml
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,11 @@ jobs:
npm init -y 2>/dev/null || true
npm install playwright
# OS-level deps (apt packages) aren't cached so always install them.
# Playwright shells out to apt for the OS-level deps, so the runner
# image's third-party sources have to be pruned FIRST -- a broken
# vendor mirror makes its apt-get fail as a whole and it reports
# only "Failed to install browser dependencies".
bash "$GITHUB_WORKSPACE/scripts/ci/apt-get-update.sh"
npx playwright install-deps chromium
# `npm install playwright` resolves the floating version, so the
# cached browser binary can drift away from what the freshly
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10245,8 +10245,18 @@ public void onReceive(Context ctx, Intent intent) {
}
String pkg = null;
try {
android.content.ComponentName cn = intent.getParcelableExtra(Intent.EXTRA_CHOSEN_COMPONENT);
if (cn != null) pkg = cn.getPackageName();
// Taken as a Parcelable and tested, rather than assigned straight
// to ComponentName: that assignment compiles to a CHECKCAST whose
// failure this catch would have to handle, and the extra is
// whatever the SENDING application chose to put there, so the
// failure is not hypothetical. (The cast-semantics gate no longer
// scans this port, since ParparVM does not translate it -- this
// stands on its own terms.)
android.os.Parcelable chosen =
intent.getParcelableExtra(Intent.EXTRA_CHOSEN_COMPONENT);
if (chosen instanceof android.content.ComponentName) {
pkg = ((android.content.ComponentName) chosen).getPackageName();
}
} catch (Throwable ignore) {}
target.onResult(com.codename1.share.ShareResult.sharedTo(pkg));
}
Expand Down
36 changes: 36 additions & 0 deletions docs/demos/backend/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.codenameone.developerguide</groupId>
<artifactId>democode</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>backendsnippets</artifactId>
<name>backendsnippets</name>
<!--
Compiles the Backend chapter's snippets. The guide includes them from here by
tag rather than quoting them inline, so a snippet that stops matching the API
fails this build instead of sitting wrong in the docs until someone tries it.

Separate from the common module because that one is the CLIENT: it builds for
iOS, Android and the browser, and codenameone-backend is a server library that
has no business on those classpaths.
-->
<dependencies>
<dependency>
<groupId>com.codenameone</groupId>
<artifactId>codenameone-backend</artifactId>
<version>${cn1.version}</version>
</dependency>
<!-- For the REST contract annotations, which the client half of the guide's
shared-contract example uses. -->
<dependency>
<groupId>com.codenameone</groupId>
<artifactId>codenameone-core</artifactId>
<version>${cn1.version}</version>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Codename One designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Codename One through http://www.codenameone.com/ if you
* need additional information or have any questions.
*/
package com.codenameone.developerguide.backend;

import com.codename1.backend.Database;
import java.io.IOException;
import java.util.List;

/** The Backend chapter's database examples, compiled so they cannot drift. */
public final class DatabaseSnippets {

private DatabaseSnippets() {
}

public static List open() throws IOException {
// tag::backend-database[]
Database db = Database.open(System.getenv("DATABASE_URL")); // or ":memory:"
db.execute("CREATE TABLE IF NOT EXISTS note (id INTEGER PRIMARY KEY, body TEXT)",
null);

List rows = db.query("SELECT id, body FROM note WHERE id > ?",
new Object[] { Integer.valueOf(10) });
// end::backend-database[]
return rows;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/*
* Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Codename One designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Codename One through http://www.codenameone.com/ if you
* need additional information or have any questions.
*/
package com.codenameone.developerguide.backend;

/** The data transfer object both ends of {@link NotesApi} share. */
public class Note {
public long id;
public String body;

public Note() {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/*
* Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Codename One designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Codename One through http://www.codenameone.com/ if you
* need additional information or have any questions.
*/
package com.codenameone.developerguide.backend;

import com.codename1.backend.annotations.DeleteMapping;
import com.codename1.backend.annotations.GetMapping;
import com.codename1.backend.annotations.PathVariable;
import com.codename1.backend.annotations.PostMapping;
import com.codename1.backend.annotations.RequestBody;
import com.codename1.backend.annotations.RequestMapping;
import com.codename1.backend.annotations.RequestParam;
import com.codename1.backend.annotations.ResponseStatus;
import com.codename1.backend.annotations.RestController;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;

// tag::backend-first-server[]
@RestController
@RequestMapping("/notes")
public class Notes {
private final Map<Long, Map> store = new ConcurrentHashMap<Long, Map>();
private final AtomicLong nextId = new AtomicLong(1);

@GetMapping("/healthz")
public String health() {
return "ok";
}

@GetMapping("/{id}")
public Map read(@PathVariable("id") long id) {
return store.get(Long.valueOf(id)); // null becomes a 404
}

@GetMapping
public List list(@RequestParam(value = "limit", defaultValue = "20") int limit) {
List page = new ArrayList();
for (Map note : store.values()) {
if (page.size() >= limit) {
break;
}
page.add(note);
}
return page;
}

@PostMapping
@ResponseStatus(201)
public Map create(@RequestBody Map note) {
long id = nextId.getAndIncrement();
Map stored = new LinkedHashMap(note);
stored.put("id", Long.valueOf(id));
store.put(Long.valueOf(id), stored);
return stored;
}

@DeleteMapping("/{id}")
@ResponseStatus(204)
public void delete(@PathVariable("id") long id) {
store.remove(Long.valueOf(id));
}
}
// end::backend-first-server[]
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Codename One designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Codename One through http://www.codenameone.com/ if you
* need additional information or have any questions.
*/
package com.codenameone.developerguide.backend;

import com.codename1.annotations.rest.Body;
import com.codename1.annotations.rest.GET;
import com.codename1.annotations.rest.POST;
import com.codename1.annotations.rest.Path;
import com.codename1.annotations.rest.RestClient;
import com.codename1.io.rest.Response;
import com.codename1.util.OnComplete;

// tag::backend-contract[]
@RestClient
public interface NotesApi {
@GET("/notes/{id}")
void note(@Path("id") String id, OnComplete<Response<Note>> callback);

@POST("/notes")
void create(@Body Note note, OnComplete<Response<Note>> callback);
}
// end::backend-contract[]
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Codename One designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Codename One through http://www.codenameone.com/ if you
* need additional information or have any questions.
*/
package com.codenameone.developerguide.backend;

/**
* What the build emits from {@link NotesApi} for the server side.
*
* Reproduced here rather than generated: the generator runs after this module
* compiles, and the point of these files is that the guide's examples compile at
* all. A real project never writes this -- it comes out of the same annotated
* contract the app's client comes out of, method for method.
*/
interface NotesApiServer {
Note note(String id) throws Exception;

Note create(Note note) throws Exception;
}
Loading
Loading