@qiniu/miku-delivery-mp-ks
Version:
Kuaishou Mini Program SDK for Miku Delivery
103 lines (102 loc) • 2.84 kB
JavaScript
/**
* @file class Headers 实现
* @desc 参考 https://github.com/github/fetch
*/
function normalizeName(name) {
if (typeof name !== 'string') {
name = String(name);
}
if (/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {
throw new TypeError('Invalid character in header field name: "' + name + '"');
}
return name.toLowerCase();
}
function normalizeValue(value) {
if (typeof value !== 'string') {
value = String(value);
}
return value;
}
// Build a destructive iterator for the value list
function iteratorFor(items) {
const iterator = {
next: function () {
const value = items.shift();
return { done: value === undefined, value: value };
},
[Symbol.iterator]: () => iterator
};
return iterator;
}
export default class Headers {
constructor(headers) {
Object.defineProperty(this, "map", {
enumerable: true,
configurable: true,
writable: true,
value: {}
});
if (headers instanceof Headers) {
headers.forEach((value, name) => {
this.append(name, value);
});
}
else if (Array.isArray(headers)) {
headers.forEach(header => {
this.append(header[0], header[1]);
});
}
else if (headers != null) {
Object.getOwnPropertyNames(headers).forEach(name => {
this.append(name, headers[name]);
});
}
}
append(name, value) {
name = normalizeName(name);
value = normalizeValue(value);
var oldValue = this.map[name];
this.map[name] = oldValue ? oldValue + ', ' + value : value;
}
delete(name) {
delete this.map[normalizeName(name)];
}
get(name) {
name = normalizeName(name);
return this.has(name) ? this.map[name] : null;
}
has(name) {
return this.map.hasOwnProperty(normalizeName(name));
}
set(name, value) {
this.map[normalizeName(name)] = normalizeValue(value);
}
forEach(callback, thisArg) {
for (var name in this.map) {
if (this.map.hasOwnProperty(name)) {
callback.call(thisArg, this.map[name], name, this);
}
}
}
keys() {
const items = [];
this.forEach((_, name) => {
items.push(name);
});
return iteratorFor(items);
}
values() {
const items = [];
this.forEach(value => {
items.push(value);
});
return iteratorFor(items);
}
entries() {
const items = [];
this.forEach((value, name) => {
items.push([name, value]);
});
return iteratorFor(items);
}
}