| '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; | |
| };
 |