network_geolocation.sjs (1899B)
1 function parseQueryString(str) { 2 if (str == "") { 3 return {}; 4 } 5 6 var paramArray = str.split("&"); 7 var regex = /^([^=]+)=(.*)$/; 8 var params = {}; 9 for (var i = 0, sz = paramArray.length; i < sz; i++) { 10 var match = regex.exec(paramArray[i]); 11 if (!match) { 12 throw new Error(`Bad parameter in queryString! '${paramArray[i]}'`); 13 } 14 params[decodeURIComponent(match[1])] = decodeURIComponent(match[2]); 15 } 16 17 return params; 18 } 19 20 function getPosition(action) { 21 var response = { 22 status: "OK", 23 location: { 24 lat: 37.41857, 25 lng: -122.08769, 26 }, 27 accuracy: action == "worse-accuracy" ? 100 : 42, 28 }; 29 30 return JSON.stringify(response); 31 } 32 33 var timer; 34 function handleRequest(request, response) { 35 var params = parseQueryString(request.queryString); 36 37 if (params.action == "stop-responding") { 38 response.processAsync(); 39 return; 40 } 41 42 var position = getPosition(params.action); 43 44 if (params.action == "respond-garbage") { 45 // better way? 46 var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz"; 47 position = ""; 48 var len = Math.floor(Math.random() * 5000); 49 50 for (var i = 0; i < len; i++) { 51 var c = Math.floor(Math.random() * chars.length); 52 position += chars.substring(c, c + 1); 53 } 54 } 55 56 response.processAsync(); 57 response.setStatusLine("1.0", 200, "OK"); 58 response.setHeader("Cache-Control", "no-cache", false); 59 response.setHeader("Content-Type", "aplication/x-javascript", false); 60 61 var delay = 0; 62 if ("delay" in params) { 63 delay = params.delay; 64 } 65 if (params.action === "send404") { 66 response.setStatusLine("1.0", 404, "Not Found"); 67 position = ""; 68 } 69 timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); 70 timer.initWithCallback( 71 function () { 72 response.write(position); 73 response.finish(); 74 }, 75 delay, 76 timer.TYPE_ONE_SHOT 77 ); 78 }