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