diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 00000000..328f853f --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,33 @@ +name: publish to npmjs +on: + release: + types: [prereleased, released] +jobs: + build-and-publish: + # prevents this action from running on forks + if: github.repository == 'chimurai/http-proxy-middleware' + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '22.x' + registry-url: 'https://registry.npmjs.org' + + - name: Install Dependencies + run: yarn install + + - name: Publish to NPM (beta) + if: 'github.event.release.prerelease' + run: npm publish --provenance --access public --tag v2-beta + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Publish to NPM (stable) + if: '!github.event.release.prerelease' + run: npm publish --provenance --access public --tag v2-latest + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 1bc441d0..de9c1b0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## [v2.0.7](https://github.com/chimurai/http-proxy-middleware/releases/tag/v2.0.7) + +- ci(github actions): add publish.yml +- fix(filter): handle errors + ## [v2.0.6](https://github.com/chimurai/http-proxy-middleware/releases/tag/v2.0.6) - fix(proxyReqWs): catch socket errors ([#763](https://github.com/chimurai/http-proxy-middleware/pull/763)) diff --git a/package.json b/package.json index 4b47b4ca..329e6db2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "http-proxy-middleware", - "version": "2.0.6", + "version": "2.0.7", "description": "The one-liner node.js proxy middleware for connect, express and browser-sync", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/http-proxy-middleware.ts b/src/http-proxy-middleware.ts index b93ae92f..a241cd68 100644 --- a/src/http-proxy-middleware.ts +++ b/src/http-proxy-middleware.ts @@ -109,8 +109,13 @@ export class HttpProxyMiddleware { * @return {Boolean} */ private shouldProxy = (context, req: Request): boolean => { - const path = req.originalUrl || req.url; - return contextMatcher.match(context, path, req); + try { + const path = req.originalUrl || req.url; + return contextMatcher.match(context, path, req); + } catch (error) { + this.logger.error(error); + return false; + } }; /** diff --git a/test/e2e/http-proxy-middleware.spec.ts b/test/e2e/http-proxy-middleware.spec.ts index 4685cc07..15355e91 100644 --- a/test/e2e/http-proxy-middleware.spec.ts +++ b/test/e2e/http-proxy-middleware.spec.ts @@ -153,6 +153,34 @@ describe('E2E http-proxy-middleware', () => { const response = await agent.get(`/api/b/c/d`).expect(404); expect(response.status).toBe(404); }); + + it('should not proxy when filter throws Error', async () => { + const myError = new Error('MY_ERROR'); + const filter = (path, req) => { + throw myError; + }; + + const logger = { + log: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + }; + + agent = request( + createApp( + createProxyMiddleware(filter, { + target: `http://localhost:${mockTargetServer.port}`, + logProvider: () => logger, + }) + ) + ); + + await mockTargetServer.get('/api/b/c/d').thenReply(200, 'HELLO WEB'); + const response = await agent.get(`/api/b/c/d`).expect(404); + expect(response.status).toBe(404); + expect(logger.error).toHaveBeenCalledWith(expect.objectContaining(myError)); + }); }); describe('multi path', () => {