const logger = require( 'pelias-logger' ).get( 'pointinpolygon' ); const request = require('request'); const _ = require('lodash'); function sanitizeUrl(requestUrl) { return requestUrl.replace(/^(.+)\/.+\/.+$/, (match, base) => { return `${base}/[removed]/[removed]`; }); } function parseErrorMessage(requestUrl, body, do_not_track) { if (do_not_track) { return `${sanitizeUrl(requestUrl)} returned status 200 but with non-JSON response: ${body}`; } return `${requestUrl} returned status 200 but with non-JSON response: ${body}`; } function serviceErrorMessage(requestUrl, statusCode, body, do_not_track) { if (do_not_track) { return `${sanitizeUrl(requestUrl)} returned status ${statusCode}: ${body}`; } else { return `${requestUrl} returned status ${statusCode}: ${body}`; } } module.exports = (url) => { if (!_.isEmpty(url)) { logger.info(`using point-in-polygon service at ${url}`); return function pointinpolygon( centroid, do_not_track, callback ) { const requestUrl = `${url}/${centroid.lon}/${centroid.lat}`; const options = { method: 'GET', url: requestUrl }; if (do_not_track) { options.headers = { dnt: '1' }; } request(options, (err, response, body) => { if (err) { logger.error(JSON.stringify(err)); callback(err); } else if (response.statusCode === 200) { try { const parsed = JSON.parse(body); callback(err, parsed); } catch (err) { const parseMsg = parseErrorMessage(requestUrl, body, do_not_track); logger.error(parseMsg); callback(parseMsg); } } else { const errorMsg = serviceErrorMessage(requestUrl, response.statusCode, body, do_not_track); logger.error(errorMsg); callback(errorMsg); } }); }; } else { logger.warn('point-in-polygon service disabled'); return (centroid, do_not_track, callback) => { callback(`point-in-polygon service disabled, unable to resolve ` + (do_not_track ? 'centroid' : JSON.stringify(centroid))); }; } };