You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					291 lines
				
				6.5 KiB
			
		
		
			
		
	
	
					291 lines
				
				6.5 KiB
			| 
											3 years ago
										 | '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; | ||
|  | } | ||
|  | 
 | ||
|  | function isValidHeaderName(str) { | ||
|  |   return /^[-_a-zA-Z]+$/.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 { | ||
|  |       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'); | ||
|  |   } | ||
|  | 
 | ||
|  |   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']); | ||
|  | 
 | ||
|  | utils.freezeMethods(AxiosHeaders.prototype); | ||
|  | utils.freezeMethods(AxiosHeaders); | ||
|  | 
 | ||
|  | export default AxiosHeaders; |