@halsp/http
Version:
支持 Halsp HTTP 请求
118 lines (108 loc) • 3.46 kB
text/typescript
import {
HeadersDict,
HeaderValue,
NumericalHeadersDict,
NumericalHeaderValue,
} from "../types";
export interface HeaderHandler {
setHeaders(headers: NumericalHeadersDict): this;
setHeader(key: string, value: NumericalHeaderValue): this;
set(key: string, value: NumericalHeaderValue): this;
appendHeader(key: string, value: NumericalHeaderValue): this;
append(key: string, value: NumericalHeaderValue): this;
hasHeader(key: string): string | false;
has(key: string): string | false;
removeHeader(key: string): this;
remove(key: string): this;
getHeader<T extends HeaderValue = HeaderValue>(key: string): T | undefined;
get<T extends HeaderValue = HeaderValue>(key: string): T | undefined;
}
export function initHeaderHandler<T extends HeaderHandler>(
target: T,
getHeaders: (this: any) => HeadersDict,
setHeaders: (this: any) => HeadersDict,
) {
function getHeaderFromDict<T extends HeaderValue = HeaderValue>(
key: string,
dict: HeadersDict,
): T | undefined {
const existKey = hasHeaderFromDict(key, dict);
if (existKey) {
return dict[existKey] as T;
}
}
function hasHeaderFromDict(key: string, dict: HeadersDict): string | false {
for (const item in dict) {
if (item.toUpperCase() == key.toUpperCase()) {
return item;
}
}
return false;
}
target.setHeader = function (key: string, value: NumericalHeaderValue): T {
if (value == undefined) return this;
const headers = setHeaders.bind(this)();
if (Array.isArray(value)) {
headers[key] = value.map((item) =>
typeof item == "string" ? item : String(item),
);
} else if (typeof value != "string") {
headers[key] = String(value);
} else {
headers[key] = value;
}
return this;
};
target.setHeaders = function (headers: NumericalHeadersDict): T {
for (const key in headers) {
const value = headers[key];
if (value != undefined) {
this.setHeader(key, value);
}
}
return this;
};
target.set = function (key: string, value: NumericalHeaderValue): T {
return this.setHeader(key, value);
};
target.appendHeader = function (key: string, value: NumericalHeaderValue): T {
const prev = getHeaderFromDict(
key,
setHeaders.bind(this)(),
) as NumericalHeaderValue;
if (prev) {
value = (Array.isArray(prev) ? prev : [prev]).concat(value);
}
return this.setHeader(key, value);
};
target.append = function (key: string, value: NumericalHeaderValue): T {
return this.appendHeader(key, value);
};
target.hasHeader = function (key: string): string | false {
return hasHeaderFromDict(key, getHeaders.bind(this)());
};
target.has = function (key: string): string | false {
return this.hasHeader(key);
};
target.removeHeader = function (key: string): T {
const headers = setHeaders.bind(this)();
const existKey = hasHeaderFromDict(key, headers);
if (existKey) {
delete headers[existKey];
}
return this;
};
target.remove = function (key: string): T {
return this.removeHeader(key);
};
target.getHeader = function <U extends HeaderValue = HeaderValue>(
key: string,
): U | undefined {
return getHeaderFromDict(key, getHeaders.bind(this)());
};
target.get = function <U extends HeaderValue = HeaderValue>(
key: string,
): U | undefined {
return this.getHeader<U>(key);
};
}