diff --git a/config/identity/handler/interaction/routes.json b/config/identity/handler/interaction/routes.json index a15a177f9..dd6ccf59b 100644 --- a/config/identity/handler/interaction/routes.json +++ b/config/identity/handler/interaction/routes.json @@ -27,7 +27,7 @@ ] }, { - "comment": "Converts redirect errors to location JSON responses.", + "comment": "Converts 3xx redirects to 200 JSON responses for consumption by browser scripts.", "@id": "urn:solid-server:auth:password:LocationInteractionHandler", "@type": "LocationInteractionHandler", "LocationInteractionHandler:_source" : { "@id": "urn:solid-server:auth:password:InteractionRouteHandler" } diff --git a/src/identity/interaction/LocationInteractionHandler.ts b/src/identity/interaction/LocationInteractionHandler.ts index 253e1f357..392307139 100644 --- a/src/identity/interaction/LocationInteractionHandler.ts +++ b/src/identity/interaction/LocationInteractionHandler.ts @@ -6,13 +6,21 @@ import type { InteractionHandlerInput } from './InteractionHandler'; import { InteractionHandler } from './InteractionHandler'; /** - * Catches redirect errors from the source and returns a JSON body containing a `location` field instead. - * This allows the API to be used more easily from the browser. + * Transforms an HTTP redirect into a hypermedia document with a redirection link, + * such that scripts running in a browser can redirect the user to the next page. * - * The issue is that if the API actually did a redirect, - * this would make it unusable when using it on HTML pages that need to render errors in case the fetch fails, - * but want to redirect the page in case it succeeds. - * See full overview at https://github.com/solid/community-server/pull/1088. + * This handler addresses the situation where: + * - the user visits a first page + * - this first page contains a script that performs interactions with a JSON API + * - as a result of a certain interaction, the user needs to be redirected to a second page + * + * Regular HTTP redirects are performed via responses with 3xx status codes. + * However, since the consumer of the API in this case is a browser script, + * a 3xx response would only reach that script and not move the page for the user. + * + * Therefore, this handler changes a 3xx response into a 200 response + * with an explicit link to the next page, + * enabling the script to move the user to the next page. */ export class LocationInteractionHandler extends InteractionHandler { private readonly source: InteractionHandler;