Files
w4rpservices/vendor/snowplow/referer-parser/nodejs/index.js
2019-12-26 05:03:41 +00:00

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)