315 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			315 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
import utils from '../utils.js';
 | 
						|
import parseHeaders from '../helpers/parseHeaders.js';
 | 
						|
 | 
						|
const $internals = Symbol('internals');
 | 
						|
 | 
						|
function normalizeHeader(header) {
 | 
						|
  return header && String(header).trim().toLowerCase();
 | 
						|
}
 | 
						|
 | 
						|
function normalizeValue(value) {
 | 
						|
  if (value === false || value == null) {
 | 
						|
    return value;
 | 
						|
  }
 | 
						|
 | 
						|
  return utils.isArray(value) ? value.map(normalizeValue) : String(value);
 | 
						|
}
 | 
						|
 | 
						|
function parseTokens(str) {
 | 
						|
  const tokens = Object.create(null);
 | 
						|
  const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;
 | 
						|
  let match;
 | 
						|
 | 
						|
  while ((match = tokensRE.exec(str))) {
 | 
						|
    tokens[match[1]] = match[2];
 | 
						|
  }
 | 
						|
 | 
						|
  return tokens;
 | 
						|
}
 | 
						|
 | 
						|
const isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());
 | 
						|
 | 
						|
function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {
 | 
						|
  if (utils.isFunction(filter)) {
 | 
						|
    return filter.call(this, value, header);
 | 
						|
  }
 | 
						|
 | 
						|
  if (isHeaderNameFilter) {
 | 
						|
    value = header;
 | 
						|
  }
 | 
						|
 | 
						|
  if (!utils.isString(value)) return;
 | 
						|
 | 
						|
  if (utils.isString(filter)) {
 | 
						|
    return value.indexOf(filter) !== -1;
 | 
						|
  }
 | 
						|
 | 
						|
  if (utils.isRegExp(filter)) {
 | 
						|
    return filter.test(value);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function formatHeader(header) {
 | 
						|
  return header.trim()
 | 
						|
    .toLowerCase().replace(/([a-z\d])(\w*)/g, (w, char, str) => {
 | 
						|
      return char.toUpperCase() + str;
 | 
						|
    });
 | 
						|
}
 | 
						|
 | 
						|
function buildAccessors(obj, header) {
 | 
						|
  const accessorName = utils.toCamelCase(' ' + header);
 | 
						|
 | 
						|
  ['get', 'set', 'has'].forEach(methodName => {
 | 
						|
    Object.defineProperty(obj, methodName + accessorName, {
 | 
						|
      value: function(arg1, arg2, arg3) {
 | 
						|
        return this[methodName].call(this, header, arg1, arg2, arg3);
 | 
						|
      },
 | 
						|
      configurable: true
 | 
						|
    });
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
class AxiosHeaders {
 | 
						|
  constructor(headers) {
 | 
						|
    headers && this.set(headers);
 | 
						|
  }
 | 
						|
 | 
						|
  set(header, valueOrRewrite, rewrite) {
 | 
						|
    const self = this;
 | 
						|
 | 
						|
    function setHeader(_value, _header, _rewrite) {
 | 
						|
      const lHeader = normalizeHeader(_header);
 | 
						|
 | 
						|
      if (!lHeader) {
 | 
						|
        throw new Error('header name must be a non-empty string');
 | 
						|
      }
 | 
						|
 | 
						|
      const key = utils.findKey(self, lHeader);
 | 
						|
 | 
						|
      if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {
 | 
						|
        self[key || _header] = normalizeValue(_value);
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    const setHeaders = (headers, _rewrite) =>
 | 
						|
      utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));
 | 
						|
 | 
						|
    if (utils.isPlainObject(header) || header instanceof this.constructor) {
 | 
						|
      setHeaders(header, valueOrRewrite)
 | 
						|
    } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {
 | 
						|
      setHeaders(parseHeaders(header), valueOrRewrite);
 | 
						|
    } else if (utils.isObject(header) && utils.isIterable(header)) {
 | 
						|
      let obj = {}, dest, key;
 | 
						|
      for (const entry of header) {
 | 
						|
        if (!utils.isArray(entry)) {
 | 
						|
          throw TypeError('Object iterator must return a key-value pair');
 | 
						|
        }
 | 
						|
 | 
						|
        obj[key = entry[0]] = (dest = obj[key]) ?
 | 
						|
          (utils.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]]) : entry[1];
 | 
						|
      }
 | 
						|
 | 
						|
      setHeaders(obj, valueOrRewrite)
 | 
						|
    } else {
 | 
						|
      header != null && setHeader(valueOrRewrite, header, rewrite);
 | 
						|
    }
 | 
						|
 | 
						|
    return this;
 | 
						|
  }
 | 
						|
 | 
						|
  get(header, parser) {
 | 
						|
    header = normalizeHeader(header);
 | 
						|
 | 
						|
    if (header) {
 | 
						|
      const key = utils.findKey(this, header);
 | 
						|
 | 
						|
      if (key) {
 | 
						|
        const value = this[key];
 | 
						|
 | 
						|
        if (!parser) {
 | 
						|
          return value;
 | 
						|
        }
 | 
						|
 | 
						|
        if (parser === true) {
 | 
						|
          return parseTokens(value);
 | 
						|
        }
 | 
						|
 | 
						|
        if (utils.isFunction(parser)) {
 | 
						|
          return parser.call(this, value, key);
 | 
						|
        }
 | 
						|
 | 
						|
        if (utils.isRegExp(parser)) {
 | 
						|
          return parser.exec(value);
 | 
						|
        }
 | 
						|
 | 
						|
        throw new TypeError('parser must be boolean|regexp|function');
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  has(header, matcher) {
 | 
						|
    header = normalizeHeader(header);
 | 
						|
 | 
						|
    if (header) {
 | 
						|
      const key = utils.findKey(this, header);
 | 
						|
 | 
						|
      return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));
 | 
						|
    }
 | 
						|
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
 | 
						|
  delete(header, matcher) {
 | 
						|
    const self = this;
 | 
						|
    let deleted = false;
 | 
						|
 | 
						|
    function deleteHeader(_header) {
 | 
						|
      _header = normalizeHeader(_header);
 | 
						|
 | 
						|
      if (_header) {
 | 
						|
        const key = utils.findKey(self, _header);
 | 
						|
 | 
						|
        if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {
 | 
						|
          delete self[key];
 | 
						|
 | 
						|
          deleted = true;
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    if (utils.isArray(header)) {
 | 
						|
      header.forEach(deleteHeader);
 | 
						|
    } else {
 | 
						|
      deleteHeader(header);
 | 
						|
    }
 | 
						|
 | 
						|
    return deleted;
 | 
						|
  }
 | 
						|
 | 
						|
  clear(matcher) {
 | 
						|
    const keys = Object.keys(this);
 | 
						|
    let i = keys.length;
 | 
						|
    let deleted = false;
 | 
						|
 | 
						|
    while (i--) {
 | 
						|
      const key = keys[i];
 | 
						|
      if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {
 | 
						|
        delete this[key];
 | 
						|
        deleted = true;
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    return deleted;
 | 
						|
  }
 | 
						|
 | 
						|
  normalize(format) {
 | 
						|
    const self = this;
 | 
						|
    const headers = {};
 | 
						|
 | 
						|
    utils.forEach(this, (value, header) => {
 | 
						|
      const key = utils.findKey(headers, header);
 | 
						|
 | 
						|
      if (key) {
 | 
						|
        self[key] = normalizeValue(value);
 | 
						|
        delete self[header];
 | 
						|
        return;
 | 
						|
      }
 | 
						|
 | 
						|
      const normalized = format ? formatHeader(header) : String(header).trim();
 | 
						|
 | 
						|
      if (normalized !== header) {
 | 
						|
        delete self[header];
 | 
						|
      }
 | 
						|
 | 
						|
      self[normalized] = normalizeValue(value);
 | 
						|
 | 
						|
      headers[normalized] = true;
 | 
						|
    });
 | 
						|
 | 
						|
    return this;
 | 
						|
  }
 | 
						|
 | 
						|
  concat(...targets) {
 | 
						|
    return this.constructor.concat(this, ...targets);
 | 
						|
  }
 | 
						|
 | 
						|
  toJSON(asStrings) {
 | 
						|
    const obj = Object.create(null);
 | 
						|
 | 
						|
    utils.forEach(this, (value, header) => {
 | 
						|
      value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);
 | 
						|
    });
 | 
						|
 | 
						|
    return obj;
 | 
						|
  }
 | 
						|
 | 
						|
  [Symbol.iterator]() {
 | 
						|
    return Object.entries(this.toJSON())[Symbol.iterator]();
 | 
						|
  }
 | 
						|
 | 
						|
  toString() {
 | 
						|
    return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\n');
 | 
						|
  }
 | 
						|
 | 
						|
  getSetCookie() {
 | 
						|
    return this.get("set-cookie") || [];
 | 
						|
  }
 | 
						|
 | 
						|
  get [Symbol.toStringTag]() {
 | 
						|
    return 'AxiosHeaders';
 | 
						|
  }
 | 
						|
 | 
						|
  static from(thing) {
 | 
						|
    return thing instanceof this ? thing : new this(thing);
 | 
						|
  }
 | 
						|
 | 
						|
  static concat(first, ...targets) {
 | 
						|
    const computed = new this(first);
 | 
						|
 | 
						|
    targets.forEach((target) => computed.set(target));
 | 
						|
 | 
						|
    return computed;
 | 
						|
  }
 | 
						|
 | 
						|
  static accessor(header) {
 | 
						|
    const internals = this[$internals] = (this[$internals] = {
 | 
						|
      accessors: {}
 | 
						|
    });
 | 
						|
 | 
						|
    const accessors = internals.accessors;
 | 
						|
    const prototype = this.prototype;
 | 
						|
 | 
						|
    function defineAccessor(_header) {
 | 
						|
      const lHeader = normalizeHeader(_header);
 | 
						|
 | 
						|
      if (!accessors[lHeader]) {
 | 
						|
        buildAccessors(prototype, _header);
 | 
						|
        accessors[lHeader] = true;
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);
 | 
						|
 | 
						|
    return this;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
AxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);
 | 
						|
 | 
						|
// reserved names hotfix
 | 
						|
utils.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {
 | 
						|
  let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`
 | 
						|
  return {
 | 
						|
    get: () => value,
 | 
						|
    set(headerValue) {
 | 
						|
      this[mapped] = headerValue;
 | 
						|
    }
 | 
						|
  }
 | 
						|
});
 | 
						|
 | 
						|
utils.freezeMethods(AxiosHeaders);
 | 
						|
 | 
						|
export default AxiosHeaders;
 |