Skip to content

Commit 122c139

Browse files
samchungytrivikr
andauthored
fix(credential-provider-imds): destroy request handle on promise resolve/reject (#2452)
Co-authored-by: Trivikram Kamat <[email protected]>
1 parent 0f6548e commit 122c139

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

packages/credential-provider-imds/src/remoteProvider/httpRequest.spec.ts

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { ProviderError } from "@aws-sdk/property-provider";
2-
import { createServer } from "http";
2+
import http, { createServer } from "http";
33
import nock from "nock";
44

55
import { httpRequest } from "./httpRequest";
66

77
describe("httpRequest", () => {
8+
const requestSpy = jest.spyOn(http, "request");
89
let port: number;
910
const host = "localhost";
1011
const path = "/";
@@ -26,13 +27,18 @@ describe("httpRequest", () => {
2627
port = await getOpenPort();
2728
});
2829

30+
afterEach(() => {
31+
jest.clearAllMocks();
32+
});
33+
2934
describe("returns response", () => {
3035
it("defaults to method GET", async () => {
3136
const expectedResponse = "expectedResponse";
3237
const scope = nock(`http://${host}:${port}`).get(path).reply(200, expectedResponse);
3338

3439
const response = await httpRequest({ host, path, port });
3540
expect(response.toString()).toStrictEqual(expectedResponse);
41+
expect(requestSpy.mock.results[0].value.socket).toHaveProperty("destroyed", true);
3642

3743
scope.done();
3844
});
@@ -44,6 +50,7 @@ describe("httpRequest", () => {
4450

4551
const response = await httpRequest({ host, path, port, method });
4652
expect(response.toString()).toStrictEqual(expectedResponse);
53+
expect(requestSpy.mock.results[0].value.socket).toHaveProperty("destroyed", true);
4754

4855
scope.done();
4956
});
@@ -57,6 +64,7 @@ describe("httpRequest", () => {
5764
await expect(httpRequest({ host, path, port })).rejects.toStrictEqual(
5865
Object.assign(new ProviderError("Error response received from instance metadata service"), { statusCode })
5966
);
67+
expect(requestSpy.mock.results[0].value.socket).toHaveProperty("destroyed", true);
6068

6169
scope.done();
6270
});
@@ -68,6 +76,7 @@ describe("httpRequest", () => {
6876
await expect(httpRequest({ host, path, port })).rejects.toStrictEqual(
6977
new ProviderError("Unable to connect to instance metadata service")
7078
);
79+
expect(requestSpy.mock.results[0].value.socket).toHaveProperty("destroyed", true);
7180

7281
scope.done();
7382
});
@@ -91,6 +100,7 @@ describe("httpRequest", () => {
91100
await expect(httpRequest({ host, path, port, timeout })).rejects.toStrictEqual(
92101
new ProviderError("TimeoutError from instance metadata service")
93102
);
103+
expect(requestSpy.mock.results[0].value.socket).toHaveProperty("destroyed", true);
94104

95105
scope.done();
96106
});

packages/credential-provider-imds/src/remoteProvider/httpRequest.ts

+4
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ export function httpRequest(options: RequestOptions): Promise<Buffer> {
1111

1212
req.on("error", (err) => {
1313
reject(Object.assign(new ProviderError("Unable to connect to instance metadata service"), err));
14+
req.destroy();
1415
});
1516

1617
req.on("timeout", () => {
1718
reject(new ProviderError("TimeoutError from instance metadata service"));
19+
req.destroy();
1820
});
1921

2022
req.on("response", (res: IncomingMessage) => {
@@ -23,6 +25,7 @@ export function httpRequest(options: RequestOptions): Promise<Buffer> {
2325
reject(
2426
Object.assign(new ProviderError("Error response received from instance metadata service"), { statusCode })
2527
);
28+
req.destroy();
2629
}
2730

2831
const chunks: Array<Buffer> = [];
@@ -31,6 +34,7 @@ export function httpRequest(options: RequestOptions): Promise<Buffer> {
3134
});
3235
res.on("end", () => {
3336
resolve(Buffer.concat(chunks));
37+
req.destroy();
3438
});
3539
});
3640

0 commit comments

Comments
 (0)