var util = require('util'); /** * Module exports. */ exports.parse = parse; exports.format = format; /** * Parse extensions header value */ function parse(value) { value = value || ''; var extensions = {}; value.split(',').forEach(function(v) { var params = v.split(';'); var token = params.shift().trim(); var paramsList = extensions[token] = extensions[token] || []; var parsedParams = {}; params.forEach(function(param) { var parts = param.trim().split('='); var key = parts[0]; var value = parts[1]; if (typeof value === 'undefined') { value = true; } else { // unquote value if (value[0] === '"') { value = value.slice(1); } if (value[value.length - 1] === '"') { value = value.slice(0, value.length - 1); } } (parsedParams[key] = parsedParams[key] || []).push(value); }); paramsList.push(parsedParams); }); return extensions; } /** * Format extensions header value */ function format(value) { return Object.keys(value).map(function(token) { var paramsList = value[token]; if (!util.isArray(paramsList)) { paramsList = [paramsList]; } return paramsList.map(function(params) { return [token].concat(Object.keys(params).map(function(k) { var p = params[k]; if (!util.isArray(p)) p = [p]; return p.map(function(v) { return v === true ? k : k + '=' + v; }).join('; '); })).join('; '); }).join(', '); }).join(', '); }