@httpland/range-request-middleware
Version:
HTTP range request middleware
47 lines (46 loc) • 1.76 kB
JavaScript
// Copyright 2023-latest the httpland authors. All rights reserved. MIT license.
// This module is browser compatible.
import { filterKeys, isRepresentationHeader, not, parseAcceptRanges, RangeHeader, Status, stringifyContentRange, } from "./deps.js";
export var RangeUnit;
(function (RangeUnit) {
RangeUnit["Bytes"] = "bytes";
RangeUnit["None"] = "none";
})(RangeUnit || (RangeUnit = {}));
/** Shallow merge two headers. */
export function shallowMergeHeaders(left, right) {
const lHeader = new Headers(left);
right.forEach((value, key) => lHeader.set(key, value));
return lHeader;
}
export class RequestedRangeNotSatisfiableResponse extends Response {
constructor(contentRange, init) {
const { statusText } = init ?? {};
const headers = filterKeys(new Headers(init?.headers), not(isRepresentationHeader));
if (!headers.has(RangeHeader.ContentRange)) {
const contentRangeStr = stringifyContentRange(contentRange);
headers.set(RangeHeader.ContentRange, contentRangeStr);
}
super(null, {
status: Status.RequestedRangeNotSatisfiable,
statusText,
headers,
});
}
}
/** Whether the inputs are equal to case sensitivity. */
export function equalsCaseInsensitive(left, right) {
if (left === right)
return true;
return !left.localeCompare(right, undefined, { sensitivity: "accent" });
}
/** Whether the input has {@link Token} or not.
* If the input is invalid [`Accept-Ranges`](https://www.rfc-editor.org/rfc/rfc9110.html#section-14.3-2) then `false`.
*/
export function hasToken(input, token) {
try {
return parseAcceptRanges(input).includes(token);
}
catch {
return false;
}
}