From 5af84dceabd81ae9c629a9a5a13b968b5a810098 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 17 Apr 2024 13:21:14 -0700 Subject: [PATCH 1/4] Fix tsp init hanging --- packages/compiler/src/core/fetch.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/compiler/src/core/fetch.ts b/packages/compiler/src/core/fetch.ts index da358e51f9b..a503da540d0 100644 --- a/packages/compiler/src/core/fetch.ts +++ b/packages/compiler/src/core/fetch.ts @@ -25,6 +25,7 @@ export function fetch(uri: string): Promise { protocol .get(url, (res) => { if ((res.statusCode === 301 || res.statusCode === 302) && res.headers.location) { + res.destroy(); // destroy the response otherwise it gets stuck waiting for data. return request(res.headers.location, resolve, reject); } let data = ""; From 52c24ed6829a65a6b66bc2c4b5984ccd66fba286 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Wed, 17 Apr 2024 14:01:38 -0700 Subject: [PATCH 2/4] Create fix-init-never-ending-2024-3-17-20-24-14.md --- .../changes/fix-init-never-ending-2024-3-17-20-24-14.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .chronus/changes/fix-init-never-ending-2024-3-17-20-24-14.md diff --git a/.chronus/changes/fix-init-never-ending-2024-3-17-20-24-14.md b/.chronus/changes/fix-init-never-ending-2024-3-17-20-24-14.md new file mode 100644 index 00000000000..649ce5c4c7e --- /dev/null +++ b/.chronus/changes/fix-init-never-ending-2024-3-17-20-24-14.md @@ -0,0 +1,8 @@ +--- +# Change versionKind to one of: internal, fix, dependencies, feature, deprecation, breaking +changeKind: fix +packages: + - "@typespec/compiler" +--- + +Fix tsp init hanging when done due to unclosed connection From 69ee66b5ac590db7050e65f7db864dace8fdce03 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 22 Apr 2024 19:29:58 -0700 Subject: [PATCH 3/4] Use external library instead to be safe about redirects --- packages/compiler/package.json | 2 ++ packages/compiler/src/core/fetch.ts | 7 +------ pnpm-lock.yaml | 12 ++++++++++++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/packages/compiler/package.json b/packages/compiler/package.json index bfd13fa8060..267ea986bcc 100644 --- a/packages/compiler/package.json +++ b/packages/compiler/package.json @@ -85,6 +85,7 @@ "@babel/code-frame": "~7.24.2", "ajv": "~8.12.0", "change-case": "~5.4.4", + "follow-redirects": "^1.15.6", "globby": "~14.0.1", "mustache": "~4.2.0", "picocolors": "~1.0.0", @@ -98,6 +99,7 @@ }, "devDependencies": { "@types/babel__code-frame": "~7.0.6", + "@types/follow-redirects": "^1.14.4", "@types/mustache": "~4.2.5", "@types/node": "~18.11.19", "@types/prompts": "~2.4.9", diff --git a/packages/compiler/src/core/fetch.ts b/packages/compiler/src/core/fetch.ts index a503da540d0..fbb6569337e 100644 --- a/packages/compiler/src/core/fetch.ts +++ b/packages/compiler/src/core/fetch.ts @@ -1,5 +1,4 @@ -import http from "http"; -import https from "https"; +import { http, https } from "follow-redirects"; import { compilerAssert } from "./diagnostics.js"; export interface FetchResponse { @@ -24,10 +23,6 @@ export function fetch(uri: string): Promise { protocol .get(url, (res) => { - if ((res.statusCode === 301 || res.statusCode === 302) && res.headers.location) { - res.destroy(); // destroy the response otherwise it gets stuck waiting for data. - return request(res.headers.location, resolve, reject); - } let data = ""; res.on("data", (chunk) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b8754fb6df9..0df60a92c6f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -225,6 +225,9 @@ importers: change-case: specifier: ~5.4.4 version: 5.4.4 + follow-redirects: + specifier: ^1.15.6 + version: 1.15.6 globby: specifier: ~14.0.1 version: 14.0.1 @@ -259,6 +262,9 @@ importers: '@types/babel__code-frame': specifier: ~7.0.6 version: 7.0.6 + '@types/follow-redirects': + specifier: ^1.14.4 + version: 1.14.4 '@types/mustache': specifier: ~4.2.5 version: 4.2.5 @@ -7716,6 +7722,12 @@ packages: '@types/serve-static': 1.15.5 dev: false + /@types/follow-redirects@1.14.4: + resolution: {integrity: sha512-GWXfsD0Jc1RWiFmMuMFCpXMzi9L7oPDVwxUnZdg89kDNnqsRfUKXEtUYtA98A6lig1WXH/CYY/fvPW9HuN5fTA==} + dependencies: + '@types/node': 18.11.19 + dev: true + /@types/gtag.js@0.0.12: resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==} dev: false From 64c82fd110e5247ada8796fc3e8d4a45e572e835 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 22 Apr 2024 19:31:47 -0700 Subject: [PATCH 4/4] fix --- packages/compiler/src/core/fetch.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/compiler/src/core/fetch.ts b/packages/compiler/src/core/fetch.ts index fbb6569337e..dbf26a80158 100644 --- a/packages/compiler/src/core/fetch.ts +++ b/packages/compiler/src/core/fetch.ts @@ -1,4 +1,4 @@ -import { http, https } from "follow-redirects"; +import followRedirects from "follow-redirects"; import { compilerAssert } from "./diagnostics.js"; export interface FetchResponse { @@ -18,7 +18,11 @@ export function fetch(uri: string): Promise { function request(uri: string, resolve: (arg: FetchResponse) => void, reject: (arg: any) => void) { const url = new URL(uri); const protocol = - url.protocol === "https:" ? https : url.protocol === "http:" ? http : undefined; + url.protocol === "https:" + ? followRedirects.https + : url.protocol === "http:" + ? followRedirects.http + : undefined; compilerAssert(protocol, `Protocol '${url.protocol}' is not supported`); protocol