commit 5ddb2483136de85148273a62248ea84045258be7
parent 1d8690da63106655833033f686e468d12f805fc5
Author: Sergej Orlov <wladimirych@gmail.com>
Date: Sun, 19 Mar 2017 22:49:21 +0300
[tracks] load tracks from gpsies url
Diffstat:
4 files changed, 71 insertions(+), 7 deletions(-)
diff --git a/src/lib/leaflet.control.track-list/lib/geo_file_formats.js b/src/lib/leaflet.control.track-list/lib/geo_file_formats.js
@@ -16,7 +16,7 @@ function xmlGetNodeText(node) {
}
-function parseGpx(txt, name) {
+function parseGpx(txt, name, preferNameFromFile) {
var error;
function getSegmentPoints(segment_element) {
@@ -85,6 +85,18 @@ function parseGpx(txt, name) {
if (dom.getElementsByTagName('gpx').length === 0) {
return null;
}
+ if (preferNameFromFile) {
+ for (let trk of [...dom.getElementsByTagName('trk')]) {
+ let trkName = trk.getElementsByTagName('name')[0];
+ if (trkName) {
+ trkName = utf8_decode(xmlGetNodeText(trkName));
+ if (trkName.length) {
+ name = trkName;
+ break;
+ }
+ }
+ }
+ }
return [{
name: name,
tracks: getTrackSegments(dom),
@@ -670,7 +682,7 @@ function parseNakarteUrl(s) {
return geodataArray;
}
-function parseGeoFile(name, data) {
+function parseGeoFile(name, data, preferNameFromFile) {
var parsers = [
parseTrackUrl,
parseNakarteUrl,
@@ -684,7 +696,7 @@ function parseGeoFile(name, data) {
// parseYandexMap
];
for (var i = 0; i < parsers.length; i++) {
- var parsed = parsers[i](data, name);
+ var parsed = parsers[i](data, name, preferNameFromFile);
if (parsed !== null) {
return parsed;
}
diff --git a/src/lib/leaflet.control.track-list/lib/gpsies.js b/src/lib/leaflet.control.track-list/lib/gpsies.js
@@ -0,0 +1,36 @@
+import urlViaCorsProxy from 'lib/CORSProxy';
+
+function urlEncode(d) {
+ return Object.entries(d).map(([k, v]) => `${k}=${encodeURIComponent(v)}`).join('&');
+}
+
+const re = /^http:\/\/www\.gpsies\.com\/map\.do\?fileId=([a-z]+)/;
+
+function isGpsiesUrl(url) {
+ return re.test(url);
+}
+
+function gpsiesXhrOptions(url, options) {
+ const m = re.exec(url);
+ if (!m) {
+ throw new Error('Invalid gpsies url');
+ }
+ const trackId = m[1];
+ const newUrl = urlViaCorsProxy('http://www.gpsies.com/download.do');
+ return [newUrl, {
+ method: 'POST',
+ data: urlEncode({
+ fileId: trackId,
+ speed: '10',
+ dataType: '3',
+ filetype: 'gpxTrk',
+ submitButton: '',
+ inappropriate: ''
+ }
+ ),
+ headers: [["Content-type", "application/x-www-form-urlencoded"]],
+ responseType: 'binarystring'
+ }]
+}
+
+export {gpsiesXhrOptions, isGpsiesUrl}
+\ No newline at end of file
diff --git a/src/lib/leaflet.control.track-list/track-list.js b/src/lib/leaflet.control.track-list/track-list.js
@@ -21,6 +21,7 @@ import 'lib/leaflet.polyline-edit';
import 'lib/leaflet.polyline-measure';
import logging from 'lib/logging';
import {notify} from 'lib/notifications';
+import {isGpsiesUrl, gpsiesXhrOptions} from './lib/gpsies';
const TrackSegment = L.MeasuredLine.extend({
@@ -235,16 +236,24 @@ L.Control.TrackList = L.Control.extend({
if (geodata.length === 0 || geodata.length > 1 || geodata[0].error !== 'UNSUPPORTED') {
this.addTracksFromGeodataArray(geodata);
} else {
- var url_for_request = urlViaCorsProxy(url);
var name = url
.split('#')[0]
.split('?')[0]
.replace(/\/*$/, '')
.split('/')
.pop();
- fetch(url_for_request, {responseType: 'binarystring'})
+ let url_for_request, xhrOptions, preferNameFromFile;
+ if (isGpsiesUrl(url)) {
+ [url_for_request, xhrOptions] = gpsiesXhrOptions(url);
+ preferNameFromFile = true;
+ } else {
+ url_for_request = urlViaCorsProxy(url);
+ xhrOptions = {responseType: 'binarystring'};
+ preferNameFromFile = false;
+ }
+ fetch(url_for_request, xhrOptions)
.then(function(xhr) {
- var geodata = parseGeoFile(name, xhr.responseBinaryText);
+ var geodata = parseGeoFile(name, xhr.responseBinaryText, preferNameFromFile);
this.addTracksFromGeodataArray(geodata);
}.bind(this),
function() {
diff --git a/src/lib/xhr-promise/index.js b/src/lib/xhr-promise/index.js
@@ -21,7 +21,8 @@ class XMLHttpRequestPromiseError extends Error {
class XMLHttpRequestPromise {
constructor(
url, {method='GET', data=null, responseType='', timeout=30000, maxTries=3, retryTimeWait=500,
- isResponseSuccess=successIfStatus200, responseNeedsRetry=retryIfNetworkErrorOrServerError} = {}) {
+ isResponseSuccess=successIfStatus200, responseNeedsRetry=retryIfNetworkErrorOrServerError,
+ headers=null} = {}) {
// console.log('promise constructor', url);
const promise = new Promise((resolve, reject) => {
this._resolve = resolve;
@@ -48,6 +49,11 @@ class XMLHttpRequestPromise {
} else {
xhr.responseType = responseType;
}
+ if (headers) {
+ for (let [k, v] of headers) {
+ xhr.setRequestHeader(k, v);
+ }
+ }
}
_open() {