add changeset and tests

Signed-off-by: Nina Berg <nikb100@gmail.com>
This commit is contained in:
Nina Berg
2025-04-07 14:35:58 -04:00
parent d65ec54f23
commit 9b5b744e24
2 changed files with 52 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-proxy-backend': patch
---
Fixed handling of proxied sse connections when the upstream server closes the connection
@@ -479,6 +479,7 @@ describe('buildMiddleware', () => {
pragma: 'value',
'set-cookie': ['value'],
},
on: jest.fn(),
} as Partial<http.IncomingMessage>;
expect(config).toBeDefined();
@@ -522,6 +523,7 @@ describe('buildMiddleware', () => {
'set-cookie': [],
'x-auth-request-user': 'asd',
},
on: jest.fn(),
} as Partial<http.IncomingMessage>;
expect(config).toBeDefined();
@@ -603,4 +605,49 @@ describe('buildMiddleware', () => {
),
).toThrow(/Proxy target is not a valid URL/);
});
it('closes SSE connections when backend closes the connection', async () => {
buildMiddleware(
'/proxy',
logger,
'/test',
{
target: 'http://mocked',
},
httpRouterService,
);
expect(createProxyMiddleware).toHaveBeenCalledTimes(1);
const config = mockCreateProxyMiddleware.mock.calls[0][1] as Options;
const testServerResponse = {
headers: {},
on: jest.fn((event, callback) => {
if (event === 'close') {
callback();
}
return testServerResponse;
}),
} as Partial<http.IncomingMessage>;
const testClientResponse = {
writableEnded: false,
end: jest.fn(),
} as Partial<Response>;
expect(config).toBeDefined();
expect(config.onProxyRes).toBeDefined();
config.onProxyRes!(
testServerResponse as http.IncomingMessage,
{} as Request,
testClientResponse as Response,
);
expect(testServerResponse.on).toHaveBeenCalledWith(
'close',
expect.any(Function),
);
expect(testClientResponse.end).toHaveBeenCalled();
});
});