swc/crates/swc_bundler/tests/.cache/deno/88d81ca8b3ebdc9ebf5722a7e77dc0a3f1631e79.ts
2021-11-09 20:42:49 +09:00

93 lines
2.2 KiB
TypeScript

// Loaded from https://deno.land/x/oak@v6.3.1/isMediaType.ts
/*!
* Adapted directly from type-is at https://github.com/jshttp/type-is/
* which is licensed as follows:
*
* Copyright(c) 2014 Jonathan Ong
* Copyright(c) 2014-2015 Douglas Christopher Wilson
* MIT Licensed
*/
import { lookup } from "./deps.ts";
import { format, parse } from "./mediaTyper.ts";
function mimeMatch(expected: string | undefined, actual: string): boolean {
if (expected === undefined) {
return false;
}
const actualParts = actual.split("/");
const expectedParts = expected.split("/");
if (actualParts.length !== 2 || expectedParts.length !== 2) {
return false;
}
const [actualType, actualSubtype] = actualParts;
const [expectedType, expectedSubtype] = expectedParts;
if (expectedType !== "*" && expectedType !== actualType) {
return false;
}
if (expectedSubtype.substr(0, 2) === "*+") {
return (
expectedSubtype.length <= actualSubtype.length + 1 &&
expectedSubtype.substr(1) ===
actualSubtype.substr(1 - expectedSubtype.length)
);
}
if (expectedSubtype !== "*" && expectedSubtype !== actualSubtype) {
return false;
}
return true;
}
function normalize(type: string): string | undefined {
if (type === "urlencoded") {
return "application/x-www-form-urlencoded";
} else if (type === "multipart") {
return "multipart/*";
} else if (type[0] === "+") {
return `*/*${type}`;
}
return type.includes("/") ? type : lookup(type);
}
function normalizeType(value: string): string | undefined {
try {
const val = value.split(";");
const type = parse(val[0]);
return format(type);
} catch {
return;
}
}
/** Given a value of the content type of a request and an array of types,
* provide the matching type or `false` if no types are matched.
*/
export function isMediaType(value: string, types: string[]): string | false {
const val = normalizeType(value);
if (!val) {
return false;
}
if (!types.length) {
return val;
}
for (const type of types) {
if (mimeMatch(normalize(type), val)) {
return type[0] === "+" || type.includes("*") ? val : type;
}
}
return false;
}