From 433b51b3c17d605f21df663efe9c822edfeaf2ec Mon Sep 17 00:00:00 2001 From: Vytenis Kuciauskas Date: Tue, 20 Jul 2021 19:02:23 +0300 Subject: [PATCH] Allow wildcarded domains for image optimization --- docs/basic-features/image-optimization.md | 2 +- packages/next/package.json | 2 ++ packages/next/server/image-optimizer.ts | 3 ++- test/integration/image-optimizer/test/index.test.js | 1 + yarn.lock | 12 ++++++++++++ 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/basic-features/image-optimization.md b/docs/basic-features/image-optimization.md index e9da1121f65b6..5ea9ab8fa08f2 100644 --- a/docs/basic-features/image-optimization.md +++ b/docs/basic-features/image-optimization.md @@ -97,7 +97,7 @@ To enable Image Optimization for images hosted on an external website, use an ab ```js module.exports = { images: { - domains: ['example.com'], + domains: ['example.com', '*.example.com'], }, } ``` diff --git a/packages/next/package.json b/packages/next/package.json index 928fd438cc7e0..0d383d688bd8e 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -88,6 +88,7 @@ "https-browserify": "1.0.0", "image-size": "1.0.0", "jest-worker": "27.0.0-next.5", + "micromatch": "^4.0.4", "native-url": "0.3.4", "node-fetch": "2.6.1", "node-html-parser": "1.4.9", @@ -173,6 +174,7 @@ "@types/jsonwebtoken": "8.3.7", "@types/lodash.curry": "4.1.6", "@types/lru-cache": "5.1.0", + "@types/micromatch": "^4.0.2", "@types/node-fetch": "2.3.4", "@types/path-to-regexp": "1.7.0", "@types/react": "16.9.17", diff --git a/packages/next/server/image-optimizer.ts b/packages/next/server/image-optimizer.ts index f815892ea4ba8..78fbafaf4b775 100644 --- a/packages/next/server/image-optimizer.ts +++ b/packages/next/server/image-optimizer.ts @@ -3,6 +3,7 @@ import { createHash } from 'crypto' import { createReadStream, promises } from 'fs' import { getOrientation, Orientation } from 'get-orientation' import { IncomingMessage, ServerResponse } from 'http' +import micromatch from 'micromatch' // @ts-ignore no types for is-animated import isAnimated from 'next/dist/compiled/is-animated' import { join } from 'path' @@ -91,7 +92,7 @@ export async function imageOptimizer( return { finished: true } } - if (!domains.includes(hrefParsed.hostname)) { + if (!micromatch.isMatch(hrefParsed.hostname, domains)) { res.statusCode = 400 res.end('"url" parameter is not allowed') return { finished: true } diff --git a/test/integration/image-optimizer/test/index.test.js b/test/integration/image-optimizer/test/index.test.js index 6a8145b3272f3..c6ec99d8c9b45 100644 --- a/test/integration/image-optimizer/test/index.test.js +++ b/test/integration/image-optimizer/test/index.test.js @@ -780,6 +780,7 @@ describe('Image Optimizer', () => { 'example.com', 'assets.vercel.com', 'image-optimization-test.vercel.app', + '*.vercel.app', ] describe('dev support w/o next.config.js', () => { diff --git a/yarn.lock b/yarn.lock index 74beced370355..a9bcd8bda7fc5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3926,6 +3926,11 @@ "@types/connect" "*" "@types/node" "*" +"@types/braces@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/braces/-/braces-3.0.1.tgz#5a284d193cfc61abb2e5a50d36ebbc50d942a32b" + integrity sha512-+euflG6ygo4bn0JHtn4pYqcXwRtLvElQ7/nnjDu7iYG56H0+OhCd7d6Ug0IE3WcFpZozBKW2+80FUbv5QGk5AQ== + "@types/cacheable-request@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" @@ -4171,6 +4176,13 @@ version "5.1.0" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.0.tgz#57f228f2b80c046b4a1bd5cac031f81f207f4f03" +"@types/micromatch@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/micromatch/-/micromatch-4.0.2.tgz#ce29c8b166a73bf980a5727b1e4a4d099965151d" + integrity sha512-oqXqVb0ci19GtH0vOA/U2TmHTcRY9kuZl4mqUxe0QmJAlIW13kzhuK5pi1i9+ngav8FjpSb9FVS/GE00GLX1VA== + dependencies: + "@types/braces" "*" + "@types/mime@*": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d"