gracenode-server
Version:
server module for gracenode framework.
106 lines (93 loc) • 2.39 kB
JavaScript
var gracenode = require('../../gracenode');
var log = gracenode.log.create('headers');
var osRegex = /(iPhone|Linux|Windows|iPod|iPad|Macintosh|Android)/i;
var browserRegex = /(IE|Chrome|Firefox|Safari|Opera)/i;
module.exports.create = function (reqHeaders) {
return new Headers(reqHeaders);
};
function Headers(reqHeaders) {
this._headers = reqHeaders;
this._os = null;
this._client = null;
this._agent = this.get('user-agent');
this._acceptLang = this.get('accept-language');
this._acceptEnc = this.get('accept-encoding');
}
Headers.prototype.get = function (name) {
return this._headers[name] || null;
};
Headers.prototype.getAll = function () {
return gracenode.lib.cloneObj(this._headers);
};
Headers.prototype.getOs = function () {
this.parseUserAgent();
return this._os;
};
Headers.prototype.getClient = function () {
this.parseUserAgent();
return this._client;
};
Headers.prototype.getDefaultLang = function () {
return this.parseLanguage();
};
Headers.prototype.parseUserAgent = function () {
if (!this._agent) {
return false;
}
if (this._os || this._client) {
return false;
}
// detect OS
var osRes = this._agent.match(osRegex);
if (osRes) {
this._os = osRes[osRes.length - 1];
}
log.verbose('client OS/Device:', this._os);
// detect browser
var browserRes = this._agent.match(browserRegex);
if (browserRes) {
this._client = browserRes[browserRes.length - 1];
}
log.verbose('client browser:', this._client);
};
Headers.prototype.parseLanguage = function () {
if (!this._acceptLang) {
return false;
}
// detect default accept language
var language = '';
var qval = 0.0;
var lang = {};
var x = this._acceptLang.split(',');
for (var i = 0, len = x.length; i < len; i++) {
var matches = x[i].match(/(.*);q=([0-1]{0,1}\.\d{0,4})/i);
if (matches) {
lang[matches[1]] = matches[2];
} else {
lang[x[i]] = 1.0;
}
}
for (var key in lang) {
var value = lang[key];
if (value > qval) {
qval = value;
language = key;
}
}
// force lower case
language = language.toLowerCase();
log.verbose('client default language:', language);
return language;
};
Headers.prototype.isAcceptedEncoding = function (enc) {
if (!this._acceptEnc) {
return false;
}
var x = this._acceptEnc.split(',');
for (var i = 0, len = x.length; i < len; i++) {
if (x[i].trim() === enc) {
return true;
}
}
return false;
};