Skip to content

Expose X-Modified-At via CORS for module reads#32

Merged
d4rken merged 1 commit into
mainfrom
cors-expose-x-modified-at
May 20, 2026
Merged

Expose X-Modified-At via CORS for module reads#32
d4rken merged 1 commit into
mainfrom
cors-expose-x-modified-at

Conversation

@d4rken
Copy link
Copy Markdown
Member

@d4rken d4rken commented May 20, 2026

Summary

Add X-Modified-At to Access-Control-Expose-Headers so cross-origin browsers can read the header that ModuleRoute already sets on GET /v1/module/{moduleId}.

ModuleFlowTest and ModuleMigrationTest already pin that the header is sent. CorsFlowTest pins which headers are exposed cross-origin — this PR adds the new entry to that list.

Why

octi-web's multi-connector merge orders peer data by newest X-Modified-At per (deviceId, moduleId). Without CORS exposure, response.headers.get("X-Modified-At") returns null for the deployed cross-origin client (web.octi.darken.euprod.kserver.octi.darken.eu), and the merge falls back to a deterministic tiebreak on connectorId only — semantically arbitrary.

This unblocks the multi-connector port on web. Same-origin / localhost dev was unaffected (CORS doesn't strip headers there).

Sister PR

Test plan

  • ./gradlew test --tests "eu.darken.octi.server.common.CorsFlowTest" — green (asserts x-modified-at is now in Access-Control-Expose-Headers)
  • ./gradlew test --tests "eu.darken.octi.server.module.ModuleFlowTest" --tests "eu.darken.octi.server.module.ModuleMigrationTest" — green (header still set on responses)

ModuleRoute already sets the header on GET responses (and ModuleFlowTest pins its presence). Cross-origin browsers can't read it without Access-Control-Expose-Headers, so octi-web's cross-origin fetch saw it as null.

octi-web's multi-connector merge orders peer data by newest X-Modified-At per (deviceId, moduleId). Without this exposure, the merge falls back to deterministic-tiebreak in production while still working in dev (where same-origin or localhost relaxes the restriction).

Sister web change: d4rken-org/octi-web#21.
@d4rken d4rken added the enhancement New feature or request label May 20, 2026
@d4rken d4rken merged commit 7e813e2 into main May 20, 2026
5 checks passed
@d4rken d4rken deleted the cors-expose-x-modified-at branch May 20, 2026 20:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant