proxy-backend: remove support for old backend system
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
@@ -1,21 +0,0 @@
|
||||
/*
|
||||
* Copyright 2023 The Backstage Authors
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { proxyPlugin } from './plugin';
|
||||
|
||||
/** @alpha */
|
||||
const _feature = proxyPlugin;
|
||||
export default _feature;
|
||||
@@ -21,4 +21,3 @@
|
||||
*/
|
||||
|
||||
export { proxyPlugin as default } from './plugin';
|
||||
export * from './service';
|
||||
|
||||
@@ -14,12 +14,11 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { loggerToWinstonLogger } from '@backstage/backend-common';
|
||||
import {
|
||||
createBackendPlugin,
|
||||
coreServices,
|
||||
} from '@backstage/backend-plugin-api';
|
||||
import { createRouterInternal } from './service/router';
|
||||
import { createRouter } from './service/router';
|
||||
import { proxyEndpointsExtensionPoint } from '@backstage/plugin-proxy-node/alpha';
|
||||
|
||||
/**
|
||||
@@ -45,10 +44,10 @@ export const proxyPlugin = createBackendPlugin({
|
||||
httpRouter: coreServices.httpRouter,
|
||||
},
|
||||
async init({ config, discovery, logger, httpRouter }) {
|
||||
await createRouterInternal({
|
||||
await createRouter({
|
||||
config,
|
||||
discovery,
|
||||
logger: loggerToWinstonLogger(logger),
|
||||
logger,
|
||||
httpRouterService: httpRouter,
|
||||
additionalEndpoints,
|
||||
});
|
||||
|
||||
@@ -60,7 +60,7 @@ describe('createRouter reloadable configuration', () => {
|
||||
|
||||
const backend = await startTestBackend({
|
||||
features: [
|
||||
import('../alpha'),
|
||||
import('..'),
|
||||
createServiceFactory({
|
||||
service: coreServices.rootConfig,
|
||||
deps: {},
|
||||
|
||||
@@ -77,7 +77,7 @@ describe('credentials', () => {
|
||||
|
||||
const backend = await startTestBackend({
|
||||
features: [
|
||||
import('../alpha'),
|
||||
import('..'),
|
||||
mockServices.rootConfig.factory({ data: config }),
|
||||
authServiceFactory,
|
||||
httpAuthServiceFactory,
|
||||
|
||||
@@ -14,12 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import {
|
||||
HostDiscovery,
|
||||
loggerToWinstonLogger,
|
||||
} from '@backstage/backend-common';
|
||||
import { mockServices } from '@backstage/backend-test-utils';
|
||||
import { ConfigReader } from '@backstage/config';
|
||||
import { Request, Response } from 'express';
|
||||
import * as http from 'http';
|
||||
import {
|
||||
@@ -39,27 +34,37 @@ const mockCreateProxyMiddleware = createProxyMiddleware as jest.MockedFunction<
|
||||
>;
|
||||
|
||||
describe('createRouter', () => {
|
||||
const deps = {
|
||||
logger: mockServices.logger.mock(),
|
||||
discovery: mockServices.discovery(),
|
||||
httpRouterService: mockServices.httpRouter.mock(),
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
jest.clearAllMocks();
|
||||
});
|
||||
|
||||
describe('where all proxy config are valid', () => {
|
||||
const logger = loggerToWinstonLogger(mockServices.logger.mock());
|
||||
const config = new ConfigReader({
|
||||
backend: {
|
||||
baseUrl: 'https://example.com:7007',
|
||||
listen: {
|
||||
port: 7007,
|
||||
const config = mockServices.rootConfig({
|
||||
data: {
|
||||
backend: {
|
||||
baseUrl: 'https://example.com:7007',
|
||||
listen: {
|
||||
port: 7007,
|
||||
},
|
||||
},
|
||||
},
|
||||
proxy: {
|
||||
endpoints: {
|
||||
'/test': {
|
||||
target: 'https://example.com',
|
||||
headers: {
|
||||
Authorization: 'Bearer supersecret',
|
||||
proxy: {
|
||||
endpoints: {
|
||||
'/test': {
|
||||
target: 'https://example.com',
|
||||
headers: {
|
||||
Authorization: 'Bearer supersecret',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
const discovery = HostDiscovery.fromConfig(config);
|
||||
|
||||
beforeEach(() => {
|
||||
mockCreateProxyMiddleware.mockClear();
|
||||
@@ -67,29 +72,29 @@ describe('createRouter', () => {
|
||||
|
||||
it('works', async () => {
|
||||
const router = await createRouter({
|
||||
...deps,
|
||||
config,
|
||||
logger,
|
||||
discovery,
|
||||
});
|
||||
expect(router).toBeDefined();
|
||||
});
|
||||
|
||||
it('supports deprecated proxy configuration', async () => {
|
||||
const router = await createRouter({
|
||||
...deps,
|
||||
config: mockServices.rootConfig({
|
||||
data: {
|
||||
proxy: {
|
||||
'/test': {
|
||||
target: 'https://example.com',
|
||||
headers: {
|
||||
Authorization: 'Bearer supersecret',
|
||||
endpoints: {
|
||||
'/test': {
|
||||
target: 'https://example.com',
|
||||
headers: {
|
||||
Authorization: 'Bearer supersecret',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
logger,
|
||||
discovery,
|
||||
});
|
||||
expect(router).toBeDefined();
|
||||
expect(mockCreateProxyMiddleware).toHaveBeenCalledWith(
|
||||
@@ -102,10 +107,22 @@ describe('createRouter', () => {
|
||||
|
||||
it('revives request bodies when set', async () => {
|
||||
const router = await createRouter({
|
||||
config,
|
||||
logger,
|
||||
discovery,
|
||||
reviveConsumedRequestBodies: true,
|
||||
...deps,
|
||||
config: mockServices.rootConfig({
|
||||
data: {
|
||||
proxy: {
|
||||
endpoints: {
|
||||
'/test': {
|
||||
target: 'https://example.com',
|
||||
headers: {
|
||||
Authorization: 'Bearer supersecret',
|
||||
},
|
||||
},
|
||||
},
|
||||
reviveConsumedRequestBodies: true,
|
||||
},
|
||||
},
|
||||
}),
|
||||
});
|
||||
expect(router).toBeDefined();
|
||||
|
||||
@@ -120,8 +137,7 @@ describe('createRouter', () => {
|
||||
it('does not revive request bodies when not set', async () => {
|
||||
const router = await createRouter({
|
||||
config,
|
||||
logger,
|
||||
discovery,
|
||||
...deps,
|
||||
});
|
||||
expect(router).toBeDefined();
|
||||
|
||||
@@ -133,32 +149,30 @@ describe('createRouter', () => {
|
||||
|
||||
describe('where buildMiddleware would fail', () => {
|
||||
it('throws an error if skip failures is not set', async () => {
|
||||
const logger = loggerToWinstonLogger(mockServices.logger.mock());
|
||||
logger.warn = jest.fn();
|
||||
const config = new ConfigReader({
|
||||
backend: {
|
||||
baseUrl: 'https://example.com:7007',
|
||||
listen: {
|
||||
port: 7007,
|
||||
const config = mockServices.rootConfig({
|
||||
data: {
|
||||
backend: {
|
||||
baseUrl: 'https://example.com:7007',
|
||||
listen: {
|
||||
port: 7007,
|
||||
},
|
||||
},
|
||||
},
|
||||
// no target would cause the buildMiddleware to fail
|
||||
proxy: {
|
||||
endpoints: {
|
||||
'/test': {
|
||||
headers: {
|
||||
Authorization: 'Bearer supersecret',
|
||||
// no target would cause the buildMiddleware to fail
|
||||
proxy: {
|
||||
endpoints: {
|
||||
'/test': {
|
||||
headers: {
|
||||
Authorization: 'Bearer supersecret',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
const discovery = HostDiscovery.fromConfig(config);
|
||||
await expect(
|
||||
createRouter({
|
||||
...deps,
|
||||
config,
|
||||
logger,
|
||||
discovery,
|
||||
}),
|
||||
).rejects.toThrow(
|
||||
new Error(
|
||||
@@ -168,34 +182,32 @@ describe('createRouter', () => {
|
||||
});
|
||||
|
||||
it('works if skip failures is set', async () => {
|
||||
const logger = loggerToWinstonLogger(mockServices.logger.mock());
|
||||
logger.warn = jest.fn();
|
||||
const config = new ConfigReader({
|
||||
backend: {
|
||||
baseUrl: 'https://example.com:7007',
|
||||
listen: {
|
||||
port: 7007,
|
||||
},
|
||||
},
|
||||
// no target would cause the buildMiddleware to fail
|
||||
proxy: {
|
||||
endpoints: {
|
||||
'/test': {
|
||||
headers: {
|
||||
Authorization: 'Bearer supersecret',
|
||||
},
|
||||
const config = mockServices.rootConfig({
|
||||
data: {
|
||||
backend: {
|
||||
baseUrl: 'https://example.com:7007',
|
||||
listen: {
|
||||
port: 7007,
|
||||
},
|
||||
},
|
||||
// no target would cause the buildMiddleware to fail
|
||||
proxy: {
|
||||
endpoints: {
|
||||
'/test': {
|
||||
headers: {
|
||||
Authorization: 'Bearer supersecret',
|
||||
},
|
||||
},
|
||||
},
|
||||
skipInvalidProxies: true,
|
||||
},
|
||||
},
|
||||
});
|
||||
const discovery = HostDiscovery.fromConfig(config);
|
||||
const router = await createRouter({
|
||||
...deps,
|
||||
config,
|
||||
logger,
|
||||
discovery,
|
||||
skipInvalidProxies: true,
|
||||
});
|
||||
expect((logger.warn as jest.Mock).mock.calls[0][0]).toEqual(
|
||||
expect(deps.logger.warn.mock.calls[0][0]).toEqual(
|
||||
'skipped configuring /test due to Proxy target for route "/test" must be a string, but is of type undefined',
|
||||
);
|
||||
expect(router).toBeDefined();
|
||||
@@ -204,14 +216,21 @@ describe('createRouter', () => {
|
||||
});
|
||||
|
||||
describe('buildMiddleware', () => {
|
||||
const logger = loggerToWinstonLogger(mockServices.logger.mock());
|
||||
const logger = mockServices.logger.mock();
|
||||
const httpRouterService = mockServices.httpRouter.mock();
|
||||
|
||||
beforeEach(() => {
|
||||
mockCreateProxyMiddleware.mockClear();
|
||||
});
|
||||
|
||||
it('accepts strings prefixed by /', async () => {
|
||||
buildMiddleware('/proxy', logger, '/test', 'http://mocked');
|
||||
buildMiddleware(
|
||||
'/proxy',
|
||||
logger,
|
||||
'/test',
|
||||
'http://mocked',
|
||||
httpRouterService,
|
||||
);
|
||||
|
||||
expect(createProxyMiddleware).toHaveBeenCalledTimes(1);
|
||||
|
||||
@@ -227,11 +246,20 @@ describe('buildMiddleware', () => {
|
||||
|
||||
expect(fullConfig.pathRewrite).toEqual({ '^/proxy/test/?': '/' });
|
||||
expect(fullConfig.changeOrigin).toBe(true);
|
||||
expect(fullConfig.logProvider!(logger)).toBe(logger);
|
||||
|
||||
expect(logger.info).not.toHaveBeenCalled();
|
||||
fullConfig.logProvider!({} as any).log('test');
|
||||
expect(logger.info).toHaveBeenCalledWith('test');
|
||||
});
|
||||
|
||||
it('accepts routes not prefixed with / when path is not suffixed with /', async () => {
|
||||
buildMiddleware('/proxy', logger, 'test', 'http://mocked');
|
||||
buildMiddleware(
|
||||
'/proxy',
|
||||
logger,
|
||||
'test',
|
||||
'http://mocked',
|
||||
httpRouterService,
|
||||
);
|
||||
|
||||
expect(createProxyMiddleware).toHaveBeenCalledTimes(1);
|
||||
|
||||
@@ -247,11 +275,16 @@ describe('buildMiddleware', () => {
|
||||
|
||||
expect(fullConfig.pathRewrite).toEqual({ '^/proxy/test/?': '/' });
|
||||
expect(fullConfig.changeOrigin).toBe(true);
|
||||
expect(fullConfig.logProvider!(logger)).toBe(logger);
|
||||
});
|
||||
|
||||
it('accepts routes prefixed with / when path is suffixed with /', async () => {
|
||||
buildMiddleware('/proxy/', logger, '/test', 'http://mocked');
|
||||
buildMiddleware(
|
||||
'/proxy/',
|
||||
logger,
|
||||
'/test',
|
||||
'http://mocked',
|
||||
httpRouterService,
|
||||
);
|
||||
|
||||
expect(createProxyMiddleware).toHaveBeenCalledTimes(1);
|
||||
|
||||
@@ -267,14 +300,19 @@ describe('buildMiddleware', () => {
|
||||
|
||||
expect(fullConfig.pathRewrite).toEqual({ '^/proxy/test/?': '/' });
|
||||
expect(fullConfig.changeOrigin).toBe(true);
|
||||
expect(fullConfig.logProvider!(logger)).toBe(logger);
|
||||
});
|
||||
|
||||
it('limits allowedMethods', async () => {
|
||||
buildMiddleware('/proxy', logger, '/test', {
|
||||
target: 'http://mocked',
|
||||
allowedMethods: ['GET', 'DELETE'],
|
||||
});
|
||||
buildMiddleware(
|
||||
'/proxy',
|
||||
logger,
|
||||
'/test',
|
||||
{
|
||||
target: 'http://mocked',
|
||||
allowedMethods: ['GET', 'DELETE'],
|
||||
},
|
||||
httpRouterService,
|
||||
);
|
||||
|
||||
expect(createProxyMiddleware).toHaveBeenCalledTimes(1);
|
||||
|
||||
@@ -290,13 +328,18 @@ describe('buildMiddleware', () => {
|
||||
|
||||
expect(fullConfig.pathRewrite).toEqual({ '^/proxy/test/?': '/' });
|
||||
expect(fullConfig.changeOrigin).toBe(true);
|
||||
expect(fullConfig.logProvider!(logger)).toBe(logger);
|
||||
});
|
||||
|
||||
it('permits default headers', async () => {
|
||||
buildMiddleware('/proxy', logger, '/test', {
|
||||
target: 'http://mocked',
|
||||
});
|
||||
buildMiddleware(
|
||||
'/proxy',
|
||||
logger,
|
||||
'/test',
|
||||
{
|
||||
target: 'http://mocked',
|
||||
},
|
||||
httpRouterService,
|
||||
);
|
||||
|
||||
expect(createProxyMiddleware).toHaveBeenCalledTimes(1);
|
||||
|
||||
@@ -334,12 +377,18 @@ describe('buildMiddleware', () => {
|
||||
});
|
||||
|
||||
it('permits default and configured headers', async () => {
|
||||
buildMiddleware('/proxy', logger, '/test', {
|
||||
target: 'http://mocked',
|
||||
headers: {
|
||||
Authorization: 'my-token',
|
||||
buildMiddleware(
|
||||
'/proxy',
|
||||
logger,
|
||||
'/test',
|
||||
{
|
||||
target: 'http://mocked',
|
||||
headers: {
|
||||
Authorization: 'my-token',
|
||||
},
|
||||
},
|
||||
});
|
||||
httpRouterService,
|
||||
);
|
||||
|
||||
expect(createProxyMiddleware).toHaveBeenCalledTimes(1);
|
||||
|
||||
@@ -367,10 +416,16 @@ describe('buildMiddleware', () => {
|
||||
});
|
||||
|
||||
it('permits configured headers', async () => {
|
||||
buildMiddleware('/proxy', logger, '/test', {
|
||||
target: 'http://mocked',
|
||||
allowedHeaders: ['authorization', 'cookie'],
|
||||
});
|
||||
buildMiddleware(
|
||||
'/proxy',
|
||||
logger,
|
||||
'/test',
|
||||
{
|
||||
target: 'http://mocked',
|
||||
allowedHeaders: ['authorization', 'cookie'],
|
||||
},
|
||||
httpRouterService,
|
||||
);
|
||||
|
||||
expect(createProxyMiddleware).toHaveBeenCalledTimes(1);
|
||||
|
||||
@@ -399,9 +454,15 @@ describe('buildMiddleware', () => {
|
||||
});
|
||||
|
||||
it('responds default headers', async () => {
|
||||
buildMiddleware('/proxy', logger, '/test', {
|
||||
target: 'http://mocked',
|
||||
});
|
||||
buildMiddleware(
|
||||
'/proxy',
|
||||
logger,
|
||||
'/test',
|
||||
{
|
||||
target: 'http://mocked',
|
||||
},
|
||||
httpRouterService,
|
||||
);
|
||||
|
||||
expect(createProxyMiddleware).toHaveBeenCalledTimes(1);
|
||||
|
||||
@@ -441,10 +502,16 @@ describe('buildMiddleware', () => {
|
||||
});
|
||||
|
||||
it('responds configured headers', async () => {
|
||||
buildMiddleware('/proxy', logger, '/test', {
|
||||
target: 'http://mocked',
|
||||
allowedHeaders: ['set-cookie'],
|
||||
});
|
||||
buildMiddleware(
|
||||
'/proxy',
|
||||
logger,
|
||||
'/test',
|
||||
{
|
||||
target: 'http://mocked',
|
||||
allowedHeaders: ['set-cookie'],
|
||||
},
|
||||
httpRouterService,
|
||||
);
|
||||
|
||||
expect(createProxyMiddleware).toHaveBeenCalledTimes(1);
|
||||
|
||||
@@ -477,6 +544,7 @@ describe('buildMiddleware', () => {
|
||||
{
|
||||
target: 'http://mocked',
|
||||
},
|
||||
httpRouterService,
|
||||
true,
|
||||
);
|
||||
|
||||
@@ -497,9 +565,15 @@ describe('buildMiddleware', () => {
|
||||
});
|
||||
|
||||
it('does not revive request body when not configured', async () => {
|
||||
buildMiddleware('/proxy', logger, '/test', {
|
||||
target: 'http://mocked',
|
||||
});
|
||||
buildMiddleware(
|
||||
'/proxy',
|
||||
logger,
|
||||
'/test',
|
||||
{
|
||||
target: 'http://mocked',
|
||||
},
|
||||
httpRouterService,
|
||||
);
|
||||
|
||||
expect(createProxyMiddleware).toHaveBeenCalledTimes(1);
|
||||
|
||||
@@ -511,10 +585,22 @@ describe('buildMiddleware', () => {
|
||||
|
||||
it('rejects malformed target URLs', async () => {
|
||||
expect(() =>
|
||||
buildMiddleware('/proxy', logger, '/test', 'backstage.io'),
|
||||
buildMiddleware(
|
||||
'/proxy',
|
||||
logger,
|
||||
'/test',
|
||||
'backstage.io',
|
||||
httpRouterService,
|
||||
),
|
||||
).toThrow(/Proxy target is not a valid URL/);
|
||||
expect(() =>
|
||||
buildMiddleware('/proxy', logger, '/test', { target: 'backstage.io' }),
|
||||
buildMiddleware(
|
||||
'/proxy',
|
||||
logger,
|
||||
'/test',
|
||||
{ target: 'backstage.io' },
|
||||
httpRouterService,
|
||||
),
|
||||
).toThrow(/Proxy target is not a valid URL/);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -14,20 +14,19 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { Config } from '@backstage/config';
|
||||
import express from 'express';
|
||||
import type express from 'express';
|
||||
import Router from 'express-promise-router';
|
||||
import {
|
||||
createProxyMiddleware,
|
||||
fixRequestBody,
|
||||
RequestHandler,
|
||||
} from 'http-proxy-middleware';
|
||||
import { Logger } from 'winston';
|
||||
import http from 'http';
|
||||
import { JsonObject } from '@backstage/types';
|
||||
import {
|
||||
DiscoveryService,
|
||||
HttpRouterService,
|
||||
LoggerService,
|
||||
RootConfigService,
|
||||
} from '@backstage/backend-plugin-api';
|
||||
import { ProxyConfig } from '@backstage/plugin-proxy-node/alpha';
|
||||
@@ -54,15 +53,13 @@ const safeForwardHeaders = [
|
||||
];
|
||||
|
||||
/**
|
||||
* @public
|
||||
* @deprecated Please migrate to the new backend system as this will be removed in the future.
|
||||
* @internal
|
||||
*/
|
||||
export interface RouterOptions {
|
||||
logger: Logger;
|
||||
logger: LoggerService;
|
||||
config: RootConfigService;
|
||||
discovery: DiscoveryService;
|
||||
skipInvalidProxies?: boolean;
|
||||
reviveConsumedRequestBodies?: boolean;
|
||||
httpRouterService: HttpRouterService;
|
||||
additionalEndpoints?: ProxyConfig;
|
||||
}
|
||||
|
||||
@@ -70,11 +67,11 @@ export interface RouterOptions {
|
||||
// given config.
|
||||
export function buildMiddleware(
|
||||
pathPrefix: string,
|
||||
logger: Logger,
|
||||
logger: LoggerService,
|
||||
route: string,
|
||||
config: string | ProxyConfig,
|
||||
httpRouterService: HttpRouterService,
|
||||
reviveConsumedRequestBodies?: boolean,
|
||||
httpRouterService?: HttpRouterService,
|
||||
): RequestHandler {
|
||||
let fullConfig: ProxyConfig;
|
||||
let credentialsPolicy: string;
|
||||
@@ -100,7 +97,7 @@ export function buildMiddleware(
|
||||
}
|
||||
|
||||
if (credentialsPolicy === 'dangerously-allow-unauthenticated') {
|
||||
httpRouterService?.addAuthPolicy({
|
||||
httpRouterService.addAuthPolicy({
|
||||
path: route,
|
||||
allow: 'unauthenticated',
|
||||
});
|
||||
@@ -154,7 +151,13 @@ export function buildMiddleware(
|
||||
}
|
||||
|
||||
// Attach the logger to the proxy config
|
||||
fullConfig.logProvider = () => logger;
|
||||
fullConfig.logProvider = () => ({
|
||||
log: logger.info.bind(logger),
|
||||
debug: logger.debug.bind(logger),
|
||||
info: logger.info.bind(logger),
|
||||
warn: logger.warn.bind(logger),
|
||||
error: logger.error.bind(logger),
|
||||
});
|
||||
// http-proxy-middleware uses this log level to check if it should log the
|
||||
// requests that it proxies. Setting this to the most verbose log level
|
||||
// ensures that it always logs these requests. Our logger ends up deciding
|
||||
@@ -229,7 +232,10 @@ export function buildMiddleware(
|
||||
return createProxyMiddleware(filter, fullConfig);
|
||||
}
|
||||
|
||||
function readProxyConfig(config: Config, logger: Logger): JsonObject {
|
||||
function readProxyConfig(
|
||||
config: RootConfigService,
|
||||
logger: LoggerService,
|
||||
): JsonObject {
|
||||
const endpoints = config
|
||||
.getOptionalConfig('proxy.endpoints')
|
||||
?.get<JsonObject>();
|
||||
@@ -256,49 +262,16 @@ function readProxyConfig(config: Config, logger: Logger): JsonObject {
|
||||
return rootEndpoints;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new
|
||||
* {@link https://expressjs.com/en/api.html#router | "express router"} that
|
||||
* proxies each target configured under the `proxy.endpoints` key of the config.
|
||||
*
|
||||
* @remarks
|
||||
*
|
||||
* Example configuration:
|
||||
*
|
||||
* ```yaml
|
||||
* proxy:
|
||||
* endpoints:
|
||||
* # Option 1: Simple URL String
|
||||
* simple-example: http://simple.example.com:8080
|
||||
* # Option 2: `http-proxy-middleware` compatible object
|
||||
* '/larger-example/v1':
|
||||
* target: http://larger.example.com:8080/svc.v1
|
||||
* headers:
|
||||
* Authorization: Bearer ${EXAMPLE_AUTH_TOKEN}
|
||||
* ```
|
||||
*
|
||||
* @see https://backstage.io/docs/plugins/proxying
|
||||
* @public
|
||||
* @deprecated Please migrate to the new backend system as this will be removed in the future.
|
||||
*/
|
||||
/** @internal */
|
||||
export async function createRouter(
|
||||
options: RouterOptions,
|
||||
): Promise<express.Router> {
|
||||
return createRouterInternal(options);
|
||||
}
|
||||
|
||||
export async function createRouterInternal(
|
||||
options: RouterOptions & { httpRouterService?: HttpRouterService },
|
||||
): Promise<express.Router> {
|
||||
const router = Router();
|
||||
let currentRouter = Router();
|
||||
|
||||
const skipInvalidProxies =
|
||||
options.skipInvalidProxies ??
|
||||
options.config.getOptionalBoolean('proxy.skipInvalidProxies') ??
|
||||
false;
|
||||
options.config.getOptionalBoolean('proxy.skipInvalidProxies') ?? false;
|
||||
const reviveConsumedRequestBodies =
|
||||
options.reviveConsumedRequestBodies ??
|
||||
options.config.getOptionalBoolean('proxy.reviveConsumedRequestBodies') ??
|
||||
false;
|
||||
const proxyOptions = {
|
||||
@@ -345,7 +318,7 @@ export async function createRouterInternal(
|
||||
});
|
||||
}
|
||||
|
||||
options.httpRouterService?.use(router);
|
||||
options.httpRouterService.use(router);
|
||||
return router;
|
||||
}
|
||||
|
||||
@@ -353,12 +326,12 @@ function configureMiddlewares(
|
||||
options: {
|
||||
reviveConsumedRequestBodies: boolean;
|
||||
skipInvalidProxies: boolean;
|
||||
logger: Logger;
|
||||
logger: LoggerService;
|
||||
},
|
||||
router: express.Router,
|
||||
pathPrefix: string,
|
||||
proxyConfig: ProxyConfig,
|
||||
httpRouterService?: HttpRouterService,
|
||||
httpRouterService: HttpRouterService,
|
||||
) {
|
||||
Object.entries(proxyConfig).forEach(([route, proxyRouteConfig]) => {
|
||||
try {
|
||||
@@ -369,8 +342,8 @@ function configureMiddlewares(
|
||||
options.logger,
|
||||
route,
|
||||
proxyRouteConfig,
|
||||
options.reviveConsumedRequestBodies,
|
||||
httpRouterService,
|
||||
options.reviveConsumedRequestBodies,
|
||||
),
|
||||
);
|
||||
} catch (e) {
|
||||
|
||||
Reference in New Issue
Block a user