Skip to content

Commit 3dc5179

Browse files
committed
Fix Beacon API support (close #702)
1 parent a7eaa83 commit 3dc5179

File tree

2 files changed

+22
-14
lines changed

2 files changed

+22
-14
lines changed

src/js/out_queue.js

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,17 +67,24 @@
6767
//Force to lower case if its a string
6868
eventMethod = eventMethod.toLowerCase ? eventMethod.toLowerCase() : eventMethod;
6969

70-
//Use the Beacon API if eventMethod is set null, true, or 'beacon'.
71-
var enableBeacon = (eventMethod === null || eventMethod === true || eventMethod === "beacon" || eventMethod === "true") ? true : false;
70+
// Use the Beacon API if eventMethod is set null, true, or 'beacon'.
71+
var isBeaconRequested = (eventMethod === null) || (eventMethod === true) || (eventMethod === "beacon") || (eventMethod === "true");
7272
// Fall back to POST or GET for browsers which don't support Beacon API
73-
useBeacon = enableBeacon && navigator && navigator.sendBeacon;
73+
var isBeaconAvailable = Boolean(isBeaconRequested && navigator && navigator.sendBeacon);
74+
var useBeacon = (isBeaconAvailable && isBeaconRequested);
7475

75-
//Use POST if specified, or beacon is unavailable.
76-
var usePost = (eventMethod === "post" || (enableBeacon && !useBeacon)) ? true : false;
77-
// Fall back to GET for browsers which don't support CORS XMLHttpRequests (e.g. IE <= 9)
78-
usePost = usePost && window.XMLHttpRequest && ('withCredentials' in new XMLHttpRequest());
76+
// Use GET if specified
77+
var isGetRequested = (eventMethod === "get");
7978

80-
var path = useBeacon || usePost ? postPath : '/i';
79+
// Use POST if specified
80+
var isPostRequested = (eventMethod === "post");
81+
// usePost acts like a catch all for POST methods - Beacon or XHR
82+
var usePost = (isPostRequested || useBeacon) && !isGetRequested;
83+
// Don't use POST for browsers which don't support CORS XMLHttpRequests (e.g. IE <= 9)
84+
usePost = usePost && Boolean(window.XMLHttpRequest && ('withCredentials' in new XMLHttpRequest()));
85+
86+
// Resolve all options and capabilities and decide path
87+
var path = usePost ? postPath : '/i';
8188

8289
bufferSize = (localStorageAccessible() && useLocalStorage && usePost && bufferSize) || 1;
8390

@@ -234,7 +241,7 @@
234241

235242
var nextRequest = outQueue[0];
236243

237-
if (usePost || useBeacon) {
244+
if (usePost) {
238245

239246
var xhr = initializeXMLHttpRequest(configCollectorUrl);
240247

@@ -285,15 +292,16 @@
285292
var beaconStatus;
286293

287294
if (useBeacon) {
288-
beaconStatus = navigator.sendBeacon(configCollectorUrl, encloseInPayloadDataEnvelope(attachStmToEvent(batch)));
295+
const headers = { type: 'application/json' };
296+
const blob = new Blob([encloseInPayloadDataEnvelope(attachStmToEvent(batch))], headers);
297+
beaconStatus = navigator.sendBeacon(configCollectorUrl, blob);
289298
}
290299
if (!useBeacon || !beaconStatus) {
291300
xhr.send(encloseInPayloadDataEnvelope(attachStmToEvent(batch)));
292301
}
293302
}
294303

295304
} else {
296-
297305
var image = new Image(1, 1);
298306

299307
image.onload = function () {

tests/local/http-server.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ def do_POST(self):
5050
self.send_header("Content-type", "image/gif")
5151
self.end_headers()
5252
self.wfile.write(''.encode())
53-
#content_len = int(self.headers.get('content-length', 0))
54-
#post_body = self.rfile.read(content_len)
55-
#pprint(post_body)
53+
content_len = int(self.headers.get('content-length', 0))
54+
post_body = self.rfile.read(content_len)
55+
pprint(post_body)
5656

5757
def do_OPTIONS(self):
5858
self.send_response(200)

0 commit comments

Comments
 (0)