diff --git a/src/server.ts b/src/server.ts index 0043022..69a78f2 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1708,6 +1708,12 @@ class Server< const { createProxyMiddleware } = await import( /* webpackChunkName: "http-proxy-middleware" */ 'http-proxy-middleware' ); + const defaultProxyLogger = { + // HPM logs every successful proxy request at info level, so treat it as verbose output. + info: this.logger.log.bind(this.logger), + warn: this.logger.warn.bind(this.logger), + error: this.logger.error.bind(this.logger), + }; const getProxyMiddleware = ( proxyConfig: DevServerProxyConfigArrayItem, @@ -1720,7 +1726,7 @@ class Server< } if (typeof proxyOptions.logger === 'undefined') { - proxyOptions.logger = this.logger as EXPECTED_ANY; + proxyOptions.logger = defaultProxyLogger; } if (proxyOptions.target || proxyOptions.router) { diff --git a/tests/e2e/proxy-logging.test.js b/tests/e2e/proxy-logging.test.js new file mode 100644 index 0000000..fb79905 --- /dev/null +++ b/tests/e2e/proxy-logging.test.js @@ -0,0 +1,86 @@ +const { once } = require('node:events'); +const http = require('node:http'); +const path = require('node:path'); +const { rspack } = require('@rspack/core'); +const { RspackDevServer } = require('@rspack/dev-server'); +const request = require('../helpers/http-request'); + +describe('proxy logging', () => { + let backend; + let devServer; + + afterEach(async () => { + await devServer?.stop(); + + if (backend?.listening) { + const closed = once(backend, 'close'); + backend.close(); + await closed; + } + }); + + it('uses the expected infrastructure log levels', async () => { + backend = http.createServer((_req, res) => res.end('proxied')); + backend.listen(0, '127.0.0.1'); + await once(backend, 'listening'); + + const backendPort = backend.address().port; + const logs = []; + const compiler = rspack({ + entry: path.resolve(__dirname, '../placeholder.js'), + stats: 'none', + }); + + compiler.hooks.infrastructureLog.tap( + 'proxy-logging-test', + (name, type, args) => { + const message = args.map(String).join(' '); + + if (name === 'rspack-dev-server' && message.includes('[HPM]')) { + logs.push({ message, type }); + } + + return true; + }, + ); + + devServer = new RspackDevServer( + { + client: false, + hot: false, + host: '127.0.0.1', + port: 0, + proxy: [ + { + context: ['/api'], + target: `http://127.0.0.1:${backendPort}`, + }, + ], + static: false, + webSocketServer: false, + }, + compiler, + ); + + await devServer.start(); + const port = devServer.server.address().port; + const proxyRequest = () => + request({ hostname: '127.0.0.1', path: '/api/users', port }); + + expect((await proxyRequest()).status).toBe(200); + expect(logs).toContainEqual({ + message: expect.stringContaining('[HPM] GET /api/users'), + type: 'log', + }); + + const closed = once(backend, 'close'); + backend.close(); + await closed; + + expect((await proxyRequest()).status).toBe(504); + expect(logs).toContainEqual({ + message: expect.stringContaining('[HPM] Error occurred'), + type: 'error', + }); + }); +});