From e1ee28267ee582feeaaec69105dd73701b8e5a32 Mon Sep 17 00:00:00 2001 From: Rongrong Date: Mon, 30 May 2022 17:30:41 +0800 Subject: [PATCH] fix(core): RequestInProgressError cache age (#9850) * fix(core): RequestInProgressError cache age Signed-off-by: Rongrong * fix: ci test Signed-off-by: Rongrong --- lib/middleware/onerror.js | 1 + lib/v2/test/index.js | 8 +++++++- test/middleware/header.js | 8 +++++++- test/middleware/onerror.js | 10 ++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/lib/middleware/onerror.js b/lib/middleware/onerror.js index f7e66b79a..04c9c4c9f 100644 --- a/lib/middleware/onerror.js +++ b/lib/middleware/onerror.js @@ -62,6 +62,7 @@ module.exports = async (ctx, next) => { if (err instanceof RequestInProgressError) { ctx.status = 503; message = err.message; + ctx.set('Cache-Control', `public, max-age=${config.cache.requestTimeout}`); } else if (ctx.status === 403) { message = err.message; } else { diff --git a/lib/v2/test/index.js b/lib/v2/test/index.js index 73b4df65c..ceb94229a 100644 --- a/lib/v2/test/index.js +++ b/lib/v2/test/index.js @@ -1,6 +1,8 @@ const config = require('@/config').value; -let cacheIndex = 0; const got = require('@/utils/got'); +const wait = require('@/utils/wait'); + +let cacheIndex = 0; module.exports = async (ctx) => { if (ctx.params.id === 'error') { @@ -166,6 +168,10 @@ module.exports = async (ctx) => { ]; } + if (ctx.params.id === 'slow') { + await wait(1000); + } + if (ctx.query.mode === 'fulltext') { item = [ { diff --git a/test/middleware/header.js b/test/middleware/header.js index 1e206f5f9..a874fcb46 100644 --- a/test/middleware/header.js +++ b/test/middleware/header.js @@ -1,4 +1,5 @@ process.env.NODE_NAME = 'mock'; +process.env.ALLOW_ORIGIN = 'rsshub.mock'; const supertest = require('supertest'); jest.mock('request-promise-native'); @@ -11,10 +12,15 @@ afterAll(() => { server.close(); }); +afterAll(() => { + delete process.env.NODE_NAME; + delete process.env.ALLOW_ORIGIN; +}); + describe('header', () => { it(`header`, async () => { const response = await request.get('/test/1'); - expect(response.headers['access-control-allow-origin']).toBe('127.0.0.1:1200'); + expect(response.headers['access-control-allow-origin']).toBe('rsshub.mock'); expect(response.headers['access-control-allow-methods']).toBe('GET'); expect(response.headers['content-type']).toBe('application/xml; charset=utf-8'); expect(response.headers['cache-control']).toBe(`public, max-age=${config.cache.routeExpire}`); diff --git a/test/middleware/onerror.js b/test/middleware/onerror.js index 425e7754f..1d6850cd0 100644 --- a/test/middleware/onerror.js +++ b/test/middleware/onerror.js @@ -4,6 +4,7 @@ process.env.SENTRY_ROUTE_TIMEOUT = '0'; const supertest = require('supertest'); jest.mock('request-promise-native'); const server = require('../../lib/index'); +const config = require('../../lib/config').value; const request = supertest(server); afterAll(() => { @@ -32,3 +33,12 @@ describe('httperror', () => { ); }); }); + +describe('RequestInProgressError', () => { + it(`RequestInProgressError`, async () => { + const responses = await Promise.all([request.get('/test/slow'), request.get('/test/slow')]); + expect(new Set(responses.map((r) => r.status))).toEqual(new Set([200, 503])); + expect(new Set(responses.map((r) => r.headers['cache-control']))).toEqual(new Set([`public, max-age=${config.cache.requestTimeout}`, `public, max-age=${config.cache.routeExpire}`])); + expect(responses.filter((r) => r.text.includes('This path is currently fetching, please come back later!'))).toHaveLength(1); + }); +});