wintercg / fetch

WinterCG changes to the WHATWG Fetch standard
https://fetch.spec.wintercg.org/
Other
24 stars 0 forks source link

`Response.redirect` with relative URLs #22

Open lino-levan opened 11 months ago

lino-levan commented 11 months ago

This is sort of similar to #9 but I think it has some interesting semantics that might be worth looking into seperately.

The current spec is very clear that Response.redirect MUST be resolved against the current url. This is rather unfortunate by itself since server runtimes don't really have a concept of "current url". Outside of that, redirects (especially when paired with status code 307) are incredibly common for stuff like OAuth flows.

Currently, doing:

return Response.redirect("/home", 307);

just errors in Node and Deno (without the --location flag). The correct way to do this currently is

return new Response(null, {
    status: 307,
    headers: {
        "Location": "/home"
    }
});

which I think is suboptimal. Perhaps this issue should be raised upstream, because this could actually work in a web-standard Response.redirect. Ideally, Response.redirect would just use a relative location for status codes that support it. I'm hoping to champion this change in WinterCG and eventually land it upstream later.

ljharb commented 11 months ago

Server runtimes can't have a concept of "current URL", which is why a number of parts of fetch can't be compliant outside a browser.

lino-levan commented 11 months ago

Server runtimes can't have a concept of "current URL"

I mean, Deno has --location but I agree that this is one of the big issues with "spec-compliant" fetch on the server.

KhafraDev commented 8 months ago

Very late reply, sorry, but node (specifically undici) lets you set a global origin:

import { setGlobalOrigin } from 'undici'

setGlobalOrigin('http://what.ever')

Response.redirect('/home', 307)