| |
| 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(', '); |
| } |