mirror of
https://github.com/zebrajr/express.git
synced 2025-12-06 12:19:51 +01:00
164 lines
2.9 KiB
JavaScript
164 lines
2.9 KiB
JavaScript
|
|
/*!
|
|
* Express - utils
|
|
* Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca>
|
|
* MIT Licensed
|
|
*/
|
|
|
|
/**
|
|
* Module dependencies.
|
|
*/
|
|
|
|
var mime = require('mime');
|
|
|
|
/**
|
|
* Check if `path` looks absolute.
|
|
*
|
|
* @param {String} path
|
|
* @return {Boolean}
|
|
* @api private
|
|
*/
|
|
|
|
exports.isAbsolute = function(path){
|
|
if ('/' == path[0]) return true;
|
|
if (':' == path[1] && '\\' == path[2]) return true;
|
|
};
|
|
|
|
/**
|
|
* Flatten the given `arr`.
|
|
*
|
|
* @param {Array} arr
|
|
* @return {Array}
|
|
* @api private
|
|
*/
|
|
|
|
exports.flatten = function(arr, ret){
|
|
var ret = ret || []
|
|
, len = arr.length;
|
|
for (var i = 0; i < len; ++i) {
|
|
if (Array.isArray(arr[i])) {
|
|
exports.flatten(arr[i], ret);
|
|
} else {
|
|
ret.push(arr[i]);
|
|
}
|
|
}
|
|
return ret;
|
|
};
|
|
|
|
/**
|
|
* Check if `type` is acceptable based on
|
|
* the given `str`.
|
|
*
|
|
* @param {String} type
|
|
* @param {String} str
|
|
* @return {Boolean}
|
|
* @api public
|
|
*/
|
|
|
|
exports.accepts = function(type, str){
|
|
// accept anything when Accept is not present
|
|
if (!str) return true;
|
|
|
|
// resolve mime
|
|
if (!~type.indexOf('/')) type = mime.lookup(type);
|
|
|
|
// split type/subtype
|
|
type = type.split('/');
|
|
|
|
// parse
|
|
var accepted = exports.parseAccept(str)
|
|
, len = accepted.length
|
|
, obj
|
|
, ok;
|
|
|
|
for (var i = 0; i < len; ++i) {
|
|
obj = accepted[i];
|
|
ok = (type[0] == obj.type || '*' == obj.type)
|
|
&& (type[1] == obj.subtype || '*' == obj.subtype);
|
|
if (ok) return true;
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
/**
|
|
* Parse accept `str`, returning
|
|
* an array objects containing
|
|
* `.type` and `.subtype` along
|
|
* with the values provided by
|
|
* `parseQuality()`.
|
|
*
|
|
* @param {Type} name
|
|
* @return {Type}
|
|
* @api public
|
|
*/
|
|
|
|
exports.parseAccept = function(str){
|
|
return exports
|
|
.parseQuality(str)
|
|
.map(function(obj){
|
|
var parts = obj.value.split('/');
|
|
obj.type = parts[0];
|
|
obj.subtype = parts[1];
|
|
return obj;
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Parse quality `str`, returning an
|
|
* array of objects with `.value` and
|
|
* `.quality`.
|
|
*
|
|
* @param {Type} name
|
|
* @return {Type}
|
|
* @api public
|
|
*/
|
|
|
|
exports.parseQuality = function(str){
|
|
return str
|
|
.split(/ *, */)
|
|
.map(quality)
|
|
.filter(function(obj){
|
|
return obj.quality;
|
|
})
|
|
.sort(function(a, b){
|
|
return b.quality - a.quality;
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Parse quality `str` returning an
|
|
* object with `.value` and `.quality`.
|
|
*
|
|
* @param {String} str
|
|
* @return {Object}
|
|
* @api private
|
|
*/
|
|
|
|
function quality(str) {
|
|
var parts = str.split(/ *; */)
|
|
, val = parts[0];
|
|
|
|
var q = parts[1]
|
|
? parseFloat(parts[1].split(/ *= */)[1])
|
|
: 1;
|
|
|
|
return { value: val, quality: q };
|
|
}
|
|
|
|
/**
|
|
* Escape special characters in the given string of html.
|
|
*
|
|
* @param {String} html
|
|
* @return {String}
|
|
* @api private
|
|
*/
|
|
|
|
exports.escape = function(html) {
|
|
return String(html)
|
|
.replace(/&/g, '&')
|
|
.replace(/"/g, '"')
|
|
.replace(/</g, '<')
|
|
.replace(/>/g, '>');
|
|
};
|