diff --git a/modules/core/src/lib/api/select-loader.ts b/modules/core/src/lib/api/select-loader.ts index 64283c891b..f79abc6bca 100644 --- a/modules/core/src/lib/api/select-loader.ts +++ b/modules/core/src/lib/api/select-loader.ts @@ -7,6 +7,7 @@ import {compareArrayBuffers, path} from '@loaders.gl/loader-utils'; import {normalizeLoader} from '../loader-utils/normalize-loader'; import {log} from '../utils/log'; import {getResourceUrl, getResourceMIMEType} from '../utils/resource-utils'; +import {compareMIMETypes} from '../utils/mime-type-utils'; import {getRegisteredLoaders} from './register-loaders'; import {isBlob} from '../../javascript-utils/is-type'; import {stripQueryString} from '../utils/url-utils'; @@ -216,13 +217,13 @@ function findLoaderByExtension(loaders: Loader[], extension: string): Loader | n function findLoaderByMIMEType(loaders: Loader[], mimeType: string): Loader | null { for (const loader of loaders) { - if (loader.mimeTypes && loader.mimeTypes.includes(mimeType)) { + if (loader.mimeTypes?.some((mimeType1) => compareMIMETypes(mimeType, mimeType1))) { return loader; } // Support referring to loaders using the "unregistered tree" // https://en.wikipedia.org/wiki/Media_type#Unregistered_tree - if (mimeType === `application/x.${loader.id}`) { + if (compareMIMETypes(mimeType, `application/x.${loader.id}`)) { return loader; } } diff --git a/modules/core/src/lib/utils/mime-type-utils.ts b/modules/core/src/lib/utils/mime-type-utils.ts index 363db2ebcd..23d064148c 100644 --- a/modules/core/src/lib/utils/mime-type-utils.ts +++ b/modules/core/src/lib/utils/mime-type-utils.ts @@ -8,6 +8,20 @@ const DATA_URL_PATTERN = /^data:([-\w.]+\/[-\w.+]+)(;|,)/; const MIME_TYPE_PATTERN = /^([-\w.]+\/[-\w.+]+)/; +/** + * Compare two MIME types, case insensitively etc. + * @param mimeType1 + * @param mimeType2 + * @returns true if the MIME types are equivalent + * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#structure_of_a_mime_type + */ +export function compareMIMETypes(mimeType1: string, mimeType2: string): boolean { + if (mimeType1.toLowerCase() === mimeType2.toLowerCase()) { + return true; + } + return false; +} + /** * Remove extra data like `charset` from MIME types * @param mimeString diff --git a/modules/core/test/lib/utils/mime-type-utils.spec.ts b/modules/core/test/lib/utils/mime-type-utils.spec.ts index bc51d449f3..4d2586cb53 100644 --- a/modules/core/test/lib/utils/mime-type-utils.spec.ts +++ b/modules/core/test/lib/utils/mime-type-utils.spec.ts @@ -4,10 +4,18 @@ import test from 'tape-promise/tape'; import {parseMIMEType, parseMIMETypeFromURL} from '@loaders.gl/core/lib/utils/mime-type-utils'; +import {compareMIMETypes} from '@loaders.gl/core/lib/utils/mime-type-utils'; const DATA_URL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACAQMAAABIeJ9nAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAGUExURf///wAAAFXC034AAAAMSURBVAjXY3BgaAAAAUQAwetZAwkAAAAASUVORK5CYII='; +test('compareMIMETypes', (t) => { + t.equal(compareMIMETypes('image/png', 'image/jpeg'), false); + t.equal(compareMIMETypes('image/png', 'image/png'), true); + t.equal(compareMIMETypes('image/png', 'image/PNG'), true); + t.end(); +}); + test('parseMIMEType', (t) => { t.equal(parseMIMEType('image/png;'), 'image/png'); t.equal(parseMIMEType('image/png'), 'image/png');