diff --git a/lib/apis/places.js b/lib/apis/places.js index 717a2fbe24..e6519221e6 100644 --- a/lib/apis/places.js +++ b/lib/apis/places.js @@ -51,13 +51,34 @@ exports.findPlace = { timeout: v.optional(v.number) }), function(query) { - var latLng = /^([-+]?\d{1,2}([.]\d+)?),*([-+]?\d{1,3}([.]\d+)?)$/; - var parts = ['ipbias|point:', '|circle:([1-9]d*)+@', '|rectangle:', '\\|']; - var re = new RegExp(parts.join(latLng.source), 'g'); - if (query.locationbias && !re.test(query.locationbias)) { - throw new v.InvalidValueError('invalid locationbias'); + var isLatLng = function(latLng) { + latLng = latLng.split(','); + return latLng.length == 2 && !isNaN(latLng[0]) && !isNaN(latLng[1]); + }; + var parts = query.locationbias.split(':'); + switch (parts[0]) { + case 'point': + if (isLatLng(parts[parts.length - 1])) { + return query; + } + break; + case 'circle': + parts = parts[parts.length - 1].split('@'); + if (!isNaN(parts[0]) && isLatLng(parts[parts.length - 1])) { + return query; + } + break; + case 'rectangle': + parts = parts[parts.length - 1].split('|'); + if (parts.length == 2 && isLatLng(parts[0]) && isLatLng(parts[1])) { + return query; + } + break; + case 'ipbias': + case '': + return query; } - return query; + throw new v.InvalidValueError('invalid locationbias'); } ]) };