mirror of
https://github.com/morluto/rea.git
synced 2026-11-05 22:36:08 +00:00
fix(javascript): emit no http request for a target that is not a URL (#8147)
* fix(javascript): emit no http request for a target that is not a URL
`node:http` parses a string target with `new URL(...)` before a request object
exists, so a literal that is not an absolute URL throws `ERR_INVALID_URL`
synchronously. The analysis reported `endpoint` at `resolution: "complete"` for
those calls, and the graph then projected `constructs-request` as `resolved`.
Measured on Node 24.22.1:
http.get("nope") -> THREW ERR_INVALID_URL
http.get("example.test/api") -> THREW ERR_INVALID_URL
http.get("/api/items") -> THREW ERR_INVALID_URL
http.get("/api/items", { host }) -> THREW ERR_INVALID_URL
http.get("") -> THREW ERR_INVALID_URL
http.get("//example.test/x") -> THREW ERR_INVALID_URL
http.get("http://") -> THREW ERR_INVALID_URL
http.request("nope") -> THREW ERR_INVALID_URL
https.get("/api/items") -> THREW ERR_INVALID_URL
--- accepted ---
http.get("http://example.test/x") -> OK ClientRequest
http.get("HTTP://example.test/x") -> OK ClientRequest
http.get("http:/x") -> OK ClientRequest
http.get("http:///x") -> OK ClientRequest
http.get("http:x") -> OK ClientRequest
`URL.canParse` is the exact predictor of that branch, so a relative spelling such
as `"http:x"` keeps its operation. It already has precedent in this codebase
(`javascriptPackageImportAliases.ts`).
Two boundaries are deliberate. `fetch` and `new WebSocket` are host-supplied
globals: a browser resolves a relative target against the document URL, so their
spellings are not judged by Node's absolute-URL rule. A protocol mismatch such as
`http.get("ftp://...")` is also left alone because an options object can rescue
it, so it is not a provable throw.
The guard is scoped to `method === "get" | "request"`, which only
`requestMethod`'s `http`/`https` builtin branch can produce.
* chore: retrigger title and readiness checks after the title was corrected
This commit is contained in:
1 parent
77b09314ff
commit
8f920bb65b
2 files changed
+91
No files matched your search
@@ -223,6 +223,17 @@ const collectRequests = (
|
||||
const method = requestMethod(node, context.state);
|
||||
if (method === null) return;
|
||||
const endpoint = requestEndpoint(node);
|
||||
// `http.get`/`http.request` parse a string target with `new URL` before the
|
||||
// request exists, so a literal that is not an absolute URL throws
|
||||
// `ERR_INVALID_URL` synchronously — an options object cannot rescue it.
|
||||
// `fetch` and `WebSocket` are host globals a browser resolves against the
|
||||
// document URL, so their spellings stay as reported.
|
||||
if (
|
||||
endpoint !== null &&
|
||||
(method === "get" || method === "request") &&
|
||||
!URL.canParse(endpoint)
|
||||
)
|
||||
return;
|
||||
output.push({
|
||||
node,
|
||||
operation: {
|
||||
|
||||
Reference in new issue
Block a user