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.
		
		
		
		
		
			
		
			
				
					164 lines
				
				4.3 KiB
			
		
		
			
		
	
	
					164 lines
				
				4.3 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | exports.randomString = function randomString(length, charSet) { | ||
|  |   var result = []; | ||
|  |   length = length || 16; | ||
|  |   charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; | ||
|  | 
 | ||
|  |   while (length--) { | ||
|  |     result.push(charSet[Math.floor(Math.random() * charSet.length)]); | ||
|  |   } | ||
|  |   return result.join(''); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * split string to array | ||
|  |  * @param  {String} str | ||
|  |  * @param  {String} [sep] default is ',' | ||
|  |  * @return {Array} | ||
|  |  */ | ||
|  | exports.split = function split(str, sep) { | ||
|  |   str = str || ''; | ||
|  |   sep = sep || ','; | ||
|  |   var items = str.split(sep); | ||
|  |   var needs = []; | ||
|  |   for (var i = 0; i < items.length; i++) { | ||
|  |     var s = items[i].trim(); | ||
|  |     if (s.length > 0) { | ||
|  |       needs.push(s); | ||
|  |     } | ||
|  |   } | ||
|  |   return needs; | ||
|  | }; | ||
|  | // always optimized
 | ||
|  | exports.splitAlwaysOptimized = function splitAlwaysOptimized() { | ||
|  |   var str = ''; | ||
|  |   var sep = ','; | ||
|  |   if (arguments.length === 1) { | ||
|  |     str = arguments[0] || ''; | ||
|  |   } else if (arguments.length === 2) { | ||
|  |     str = arguments[0] || ''; | ||
|  |     sep = arguments[1] || ','; | ||
|  |   } | ||
|  |   var items = str.split(sep); | ||
|  |   var needs = []; | ||
|  |   for (var i = 0; i < items.length; i++) { | ||
|  |     var s = items[i].trim(); | ||
|  |     if (s.length > 0) { | ||
|  |       needs.push(s); | ||
|  |     } | ||
|  |   } | ||
|  |   return needs; | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Replace string | ||
|  |  * | ||
|  |  * @param  {String} str | ||
|  |  * @param  {String|RegExp} substr | ||
|  |  * @param  {String|Function} newSubstr | ||
|  |  * @return {String} | ||
|  |  */ | ||
|  | exports.replace = function replace(str, substr, newSubstr) { | ||
|  |   var replaceFunction = newSubstr; | ||
|  |   if (typeof replaceFunction !== 'function') { | ||
|  |     replaceFunction = function () { | ||
|  |       return newSubstr; | ||
|  |     }; | ||
|  |   } | ||
|  |   return str.replace(substr, replaceFunction); | ||
|  | }; | ||
|  | 
 | ||
|  | // original source https://github.com/nodejs/node/blob/v7.5.0/lib/_http_common.js#L300
 | ||
|  | /** | ||
|  |  * True if val contains an invalid field-vchar | ||
|  |  *  field-value    = *( field-content / obs-fold ) | ||
|  |  *  field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ] | ||
|  |  *  field-vchar    = VCHAR / obs-text | ||
|  |  * | ||
|  |  * checkInvalidHeaderChar() is currently designed to be inlinable by v8, | ||
|  |  * so take care when making changes to the implementation so that the source | ||
|  |  * code size does not exceed v8's default max_inlined_source_size setting. | ||
|  |  **/ | ||
|  | var validHdrChars = [ | ||
|  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, // 0 - 15
 | ||
|  |   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31
 | ||
|  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 32 - 47
 | ||
|  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 48 - 63
 | ||
|  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79
 | ||
|  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 80 - 95
 | ||
|  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111
 | ||
|  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, // 112 - 127
 | ||
|  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 128 ...
 | ||
|  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | ||
|  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | ||
|  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | ||
|  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | ||
|  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | ||
|  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | ||
|  |   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  // ... 255
 | ||
|  | ]; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Replace invalid http header characters with replacement | ||
|  |  * | ||
|  |  * @param  {String} val | ||
|  |  * @param  {String|Function} replacement - can be `function(char)` | ||
|  |  * @return {Object} | ||
|  |  */ | ||
|  | exports.replaceInvalidHttpHeaderChar = function replaceInvalidHttpHeaderChar(val, replacement) { | ||
|  |   replacement = replacement || ' '; | ||
|  |   var invalid = false; | ||
|  | 
 | ||
|  |   if (!val || typeof val !== 'string') { | ||
|  |     return { | ||
|  |       val: val, | ||
|  |       invalid: invalid, | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  |   var replacementType = typeof replacement; | ||
|  |   var chars; | ||
|  |   for (var i = 0; i < val.length; ++i) { | ||
|  |     if (!validHdrChars[val.charCodeAt(i)]) { | ||
|  |       // delay create chars
 | ||
|  |       chars = chars || val.split(''); | ||
|  |       if (replacementType === 'function') { | ||
|  |         chars[i] = replacement(chars[i]); | ||
|  |       } else { | ||
|  |         chars[i] = replacement; | ||
|  |       } | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   if (chars) { | ||
|  |     val = chars.join(''); | ||
|  |     invalid = true; | ||
|  |   } | ||
|  | 
 | ||
|  |   return { | ||
|  |     val: val, | ||
|  |     invalid: invalid, | ||
|  |   }; | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Detect invalid http header characters in a string | ||
|  |  * | ||
|  |  * @param {String} val | ||
|  |  * @return {Boolean} | ||
|  |  */ | ||
|  | exports.includesInvalidHttpHeaderChar = function includesInvalidHttpHeaderChar(val) { | ||
|  |   if (!val || typeof val !== 'string') { | ||
|  |     return false; | ||
|  |   } | ||
|  | 
 | ||
|  |   for (var i = 0; i < val.length; ++i) { | ||
|  |     if (!validHdrChars[val.charCodeAt(i)]) { | ||
|  |       return true; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   return false; | ||
|  | }; |