6.50.0.0
Immutable
release. Only release title and notes can be modified.
Changelog:
- http4k-template-pug4j: [Unlikely break]
Pug4jTemplates.HotReloadnow canonicalizes the resolved template path againstbaseTemplateDirand rejects anyViewModel.template()that escapes the base. - http4k-security-digest: [Unlikely break]
DigestAuthProvider.verifynow also rejects credentials whoseuriparameter does not match the actual request URL. - http4k-ai-mcp-*: [Unlikely Break] MCP session and message IDs now derive from
SecureRandomby default. - http4k-security-oauth: [Unlikely break] OAuth server now persists a nonce for any
openidscope (previously onlyCodeIdToken) andvalidateNonceAfterTokenfail-closes when the token-endpoint id_token is missing or its nonce mismatches. - http4k-format-xml: [Unlikely break]
defaultXmlParsingConfignow setsdisallow-doctype-declandFEATURE_SECURE_PROCESSING, soBody.xml()/asXmlDocument()reject any document with a<!DOCTYPE>. - http4k-webhook: [Unlikely break]
ServerFilters.VerifyWebhookSignaturenow also rejects messages whosewebhook-timestampis more thantoleranceaway fromclock.instant()(default tolerance5.minutes, clockClock.systemUTC()), per the Standard Webhooks scheme. Captures of valid webhooks can no longer be replayed indefinitely. Pass aClock.fixed(...)to control timing in tests. - http4k-multipart: [Unlikely break]
MultipartFormBody.from,multipartIterator()andBody.multipartForm(...)cap the body at 10MB and 1000 parts by default. PassmaxStreamLength/maxPartCountto override. - http4k-serverless-lambda: [Unlikely break] Single-value headers from API Gateway/ALB events are no longer split on commas; values that legitimately contain commas (e.g.
X-Forwarded-For: client, proxy1, proxy2) now reach the handler intact. True multi-values continue to flow viamultiValueHeaders. - http4k-connect-github: [Fix]
Header.X_HUB_SIGNATURE_256lens no longer crashes on anX-Hub-Signature-256header missing thesha256=prefix;VerifyGitHubSignatureSha256now returns401for malformed signatures instead of500. - http4k-ai-llm-azure: [Fix]
AzureClientnow attaches the API key as an outboundAuthorization: Bearerheader (was wired to the inboundServerFilters.BearerAuthchecker. - http4k-config: [Fix]
Secret.toString()andSecret.hashCode()no longer expose a stable hash of the plaintext (wasSecret(hashcode = <Arrays.hashCode-of-plaintext>));Secret.equalsreturnsfalsefor non-Secretinputs instead of throwingClassCastException. - http4k-multipart: [Fix] A multipart part whose first header line begins with whitespace (a folded-header continuation with nothing to continue) now raises a
ParseErrorinstead of crashing withNullPointerException. - http4k-ops-opentelemetry: [Fix] OpenTelemetry tracing strips
user:pass@userInfo from request URIs before writing them to span attributes (url.full, legacyhttp.url) and the default span name, so basic-auth-in-URL credentials no longer reach the tracing backend. - http4k-security-oauth: [Fix] Server-side PKCE is now enforced —
code_challengeis stored at authorize and an S256code_verifieris required at token.code_challenge_method=plainis rejected per RFC 7636 §7.2. - http4k-security-oauth: [Fix] Post-callback redirect strips scheme/authority and collapses leading
/and\runs, neutralizing open-redirects of the form//evil.comand/\evil.com. - http4k-security-oauth: [Fix]
AuthRequestis re-validated atAuthenticationComplete; CSRF/nonce compare is null/blank-safe; severalredirectUri!!NPEs replaced with typedInvalidAuthorizationRequest. - http4k-security-oauth: Adds opt-in
requirePkce: Boolean = falseonOAuthServer. Whentrue, every authorize/token exchange must use PKCE (recommended per RFC 9700). - http4k-security-oauth: [Fix]
AuthServerDiscoveryrejects a scheme-less resource pointing at root. - http4k-security-oauth:
requirePkceis exposed on the underlyingGenerateAccessToken/GenerateAccessTokenForGrantType/AuthorizationCodeAccessTokenGenerator, mitigating potential PKCE downgrade. - http4k-security-digest: [Fix]
DigestAuthProvider.verifynow hashes with the configuredalgorithminstead of hardcoded MD5. - http4k-*: Secret-bearing value types are now
hidden()so their raw value no longer surfaces intoString().