Skip to content

fix GXVirtualPathCasingModule: scope to GET/HEAD, skip services, emit relative 302#1286

Merged
claudiamurialdo merged 3 commits into
masterfrom
fix/virtualpath-casing-get-head-services
Jun 3, 2026
Merged

fix GXVirtualPathCasingModule: scope to GET/HEAD, skip services, emit relative 302#1286
claudiamurialdo merged 3 commits into
masterfrom
fix/virtualpath-casing-get-head-services

Conversation

@claudiamurialdo

@claudiamurialdo claudiamurialdo commented Jun 3, 2026

Copy link
Copy Markdown
Collaborator

Refinement of #1283 — tunes GXVirtualPathCasingModule so it doesn't break service calls and emits the same Location as the Sustainsys SAML module.

The virtual-path casing canonicalizer ran on every request and issued a RedirectPermanent (301) with a relative Location. Two problems:

  • A 3xx redirect on a POST downgrades it to GET and drops the body, breaking .svc / REST service calls (observed in IIS trace: POST -> 302 -> GET).
  • 301 is cached permanently by the browser, a footgun in dev and if the app-path casing ever changes.

Now it only canonicalizes idempotent navigations (GET/HEAD), skips service endpoints (.svc/.asmx//rest/) which resolve case-insensitively anyway, and emits an relative Location via a 302 (Response.Redirect + CompleteRequest, no ThreadAbortException).

Issue:208789

…t absolute 302

The virtual-path casing canonicalizer ran on every request and issued a
RedirectPermanent (301) with a relative Location. Two problems:

- A 3xx redirect on a POST downgrades it to GET and drops the body, breaking
  .svc / REST service calls (observed in IIS trace: POST -> 302 -> GET).
- 301 is cached permanently by the browser, a footgun in dev and if the
  app-path casing ever changes.

Now it only canonicalizes idempotent navigations (GET/HEAD), skips service
endpoints (.svc/.asmx//rest/) which resolve case-insensitively anyway, and
emits an absolute Location (scheme://host + canonical path) via a 302
(Response.Redirect + CompleteRequest, no ThreadAbortException).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@claudiamurialdo claudiamurialdo temporarily deployed to external-storage-tests June 3, 2026 14:59 — with GitHub Actions Inactive
@claudiamurialdo claudiamurialdo temporarily deployed to kafka-integration-tests June 3, 2026 14:59 — with GitHub Actions Inactive
@genexusbot

Copy link
Copy Markdown
Contributor
Cherry pick to beta success

Removed comments regarding idempotent navigation and service endpoints.
@claudiamurialdo claudiamurialdo temporarily deployed to external-storage-tests June 3, 2026 15:00 — with GitHub Actions Inactive
@claudiamurialdo claudiamurialdo temporarily deployed to kafka-integration-tests June 3, 2026 15:00 — with GitHub Actions Inactive
@genexusbot

Copy link
Copy Markdown
Contributor
Cherry pick to beta success

Use the relative canonical path instead of building an absolute URL from the
request authority. Still a 302 (Response.Redirect + CompleteRequest), scoped to
GET/HEAD and skipping service endpoints.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@claudiamurialdo claudiamurialdo temporarily deployed to external-storage-tests June 3, 2026 15:20 — with GitHub Actions Inactive
@claudiamurialdo claudiamurialdo temporarily deployed to kafka-integration-tests June 3, 2026 15:20 — with GitHub Actions Inactive
@genexusbot

Copy link
Copy Markdown
Contributor
Cherry pick to beta success

@claudiamurialdo claudiamurialdo changed the title fix GXVirtualPathCasingModule: scope to GET/HEAD, skip services, emit absolute 302 fix GXVirtualPathCasingModule: scope to GET/HEAD, skip services, emit relative 302 Jun 3, 2026
@claudiamurialdo claudiamurialdo merged commit 8b12a27 into master Jun 3, 2026
10 checks passed
@claudiamurialdo claudiamurialdo deleted the fix/virtualpath-casing-get-head-services branch June 3, 2026 16:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants