From 56dc7058e9f1086a00ae87a0474b3276e80c0953 Mon Sep 17 00:00:00 2001 From: ULIVZ <472590061@qq.com> Date: Wed, 3 Apr 2019 19:01:39 +0800 Subject: [PATCH] fix: check existence of `res.getHeader` and set the correct Content-Type (#385) --- lib/middleware.js | 2 +- test/mock-express/index.js | 42 ++++++++++++++++++++++++++++++++++++++ test/server.test.js | 31 ++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 test/mock-express/index.js diff --git a/lib/middleware.js b/lib/middleware.js index 9a739fbbe..55d2bdea6 100644 --- a/lib/middleware.js +++ b/lib/middleware.js @@ -103,7 +103,7 @@ module.exports = function wrapper(context) { contentType += '; charset=UTF-8'; } - if (!res.getHeader('Content-Type')) { + if (!res.getHeader || !res.getHeader('Content-Type')) { res.setHeader('Content-Type', contentType); } diff --git a/test/mock-express/index.js b/test/mock-express/index.js new file mode 100644 index 000000000..0bdce0914 --- /dev/null +++ b/test/mock-express/index.js @@ -0,0 +1,42 @@ +'use strict'; + +const mockRequest = (options = {}) => + Object.assign( + { + body: {}, + cookies: {}, + query: {}, + params: {}, + get: jest.fn(), + }, + options + ); + +const mockResponse = (options = {}) => { + const res = Object.assign( + { + cookie: jest.fn(), + clearCookie: jest.fn(), + download: jest.fn(), + format: jest.fn(), + json: jest.fn(), + jsonp: jest.fn(), + send: jest.fn(), + sendFile: jest.fn(), + sendStatus: jest.fn(), + setHeader: jest.fn(), + redirect: jest.fn(), + render: jest.fn(), + end: jest.fn(), + set: jest.fn(), + type: jest.fn(), + get: jest.fn(), + }, + options + ); + res.status = jest.fn(() => res); + res.vary = jest.fn(() => res); + return res; +}; + +module.exports = { mockRequest, mockResponse }; diff --git a/test/server.test.js b/test/server.test.js index d61b79679..9147d9032 100644 --- a/test/server.test.js +++ b/test/server.test.js @@ -9,6 +9,8 @@ const request = require('supertest'); const middleware = require('../'); +const { mockRequest, mockResponse } = require('./mock-express'); + const webpackConfig = require('./fixtures/server-test/webpack.config'); const webpackMultiConfig = require('./fixtures/server-test/webpack.array.config'); const webpackQuerystringConfig = require('./fixtures/server-test/webpack.querystring.config'); @@ -311,6 +313,35 @@ describe('Server', () => { }); }); + /** + * ref: #385, for that koa-webpack@4.x doesn't pass in res.getHeader method. + */ + describe('Should work when res.getHeader is undefined', () => { + it('should not throw error', (done) => { + const req = mockRequest({ + url: '/', + method: 'GET', + headers: { + Range: 'bytes=6000-', + }, + }); + + const res = mockResponse({ + getHeader: undefined, + setHeader: jest.fn(), + }); + + const compiler = webpack(webpackConfig); + instance = middleware(compiler, { + stats: 'errors-only', + logLevel, + }); + + instance(req, res, jest.fn()).then(done); + }); + afterAll(close); + }); + describe('custom mimeTypes', () => { beforeAll((done) => { app = express();