133 lines
3.1 KiB
JavaScript
Vendored
133 lines
3.1 KiB
JavaScript
Vendored
|
|
var fs = require('fs')
|
|
, url = require('url')
|
|
, querystring = require('querystring')
|
|
, yaml = require('js-yaml')
|
|
, path = require('path')
|
|
;
|
|
|
|
module.exports = Referer
|
|
|
|
var dataFile = fs.readFileSync(path.join(__dirname, 'data', 'referers.yml'))
|
|
var REFERERS = loadReferers(yaml.load(dataFile.toString()))
|
|
|
|
function loadReferers (source) {
|
|
var referers_dict = {}
|
|
|
|
for(var medium in source) {
|
|
var conf_list = source[medium]
|
|
|
|
for(var referer_name in conf_list) {
|
|
var config = conf_list[referer_name]
|
|
var params = null
|
|
|
|
if(config.parameters) {
|
|
params = config.parameters.map(function(p) { return p.toLowerCase() })
|
|
}
|
|
config.domains.forEach(function(domain){
|
|
referers_dict[domain] = {
|
|
'name': referer_name,
|
|
'medium': medium
|
|
}
|
|
if(params){
|
|
referers_dict[domain]['params'] = params
|
|
}
|
|
})
|
|
}
|
|
}
|
|
return referers_dict
|
|
}
|
|
|
|
function Referer (referer_url, current_url, referers) {
|
|
this.known = false
|
|
this.referer = null
|
|
this.medium = 'unknown'
|
|
this.search_parameter = null
|
|
this.search_term = null
|
|
this.referers = referers || REFERERS
|
|
|
|
var ref_uri = url.parse(referer_url)
|
|
var ref_host = ref_uri.hostname
|
|
this.known = Boolean(~['http:', 'https:'].indexOf(ref_uri.protocol))
|
|
this.uri = ref_uri
|
|
|
|
if(!this.known) return
|
|
|
|
if(current_url){
|
|
var curr_uri = url.parse(current_url)
|
|
var curr_host = curr_uri.hostname
|
|
|
|
if(curr_host == ref_host) {
|
|
this.medium = 'internal'
|
|
return
|
|
}
|
|
}
|
|
|
|
var referer = this._lookup_referer(ref_host, ref_uri.pathname, true)
|
|
if(!referer){
|
|
referer = this._lookup_referer(ref_host, ref_uri.pathname, false)
|
|
if(!referer){
|
|
this.medium = 'unknown'
|
|
return
|
|
}
|
|
}
|
|
|
|
this.referer = referer['name']
|
|
this.medium = referer['medium']
|
|
|
|
if(referer['medium'] == 'search') {
|
|
if(!referer['params']) return
|
|
|
|
var pqs = querystring.parse(ref_uri.query)
|
|
|
|
for(var param in pqs) {
|
|
var val = pqs[param]
|
|
|
|
if(referer['params'].indexOf(param.toLowerCase()) !== -1) {
|
|
this.search_parameter = param
|
|
this.search_term = val
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Referer.prototype._lookup_referer = function(ref_host, ref_path, include_path) {
|
|
// console.log(ref_host, ref_path, include_path)
|
|
var referer = null
|
|
|
|
if(include_path)
|
|
referer = this.referers[ref_host + ref_path]
|
|
else
|
|
referer = this.referers[ref_host]
|
|
if(!referer) {
|
|
if(include_path){
|
|
var path_parts = ref_path.split('/')
|
|
if(path_parts.length > 1) {
|
|
try {
|
|
referer = this.referers[ref_host + '/' + path_parts[1]]
|
|
} catch (e) {
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(!referer) {
|
|
try{
|
|
var idx = ref_host.indexOf('.')
|
|
if(idx === -1) return null
|
|
|
|
var slicedHost = ref_host.slice(idx + 1)
|
|
return this._lookup_referer(
|
|
slicedHost,
|
|
ref_path, include_path
|
|
)
|
|
} catch (e) {
|
|
console.error(e)
|
|
return null
|
|
}
|
|
} else return referer
|
|
};
|
|
|
|
// var r = new Referer("http://www.google.com/search?q=gateway+oracle+cards+denise+linn&hl=en&client=safari")
|
|
// console.log(r.uri)
|