Skip to content

Commit

Permalink
Added options for managing errors during test (abort/retry/ignore)
Browse files Browse the repository at this point in the history
  • Loading branch information
adolfintel committed Jun 13, 2017
1 parent 8b96a21 commit 710887f
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 13 deletions.
10 changes: 8 additions & 2 deletions doc.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# HTML5 Speedtest

> by Federico Dossena
> Version 4.2.1, May 15 2017
> Version 4.2.2, June 13 2017
> [https://github.com/adolfintel/speedtest/](https://github.com/adolfintel/speedtest/)

Expand Down Expand Up @@ -164,6 +164,12 @@ w.postMessage('start {"param1": "value1", "param2": "value2", ...}')
* Recommended: `>=1`
* Default override: 1 on Firefox if enable_quirks is true
* Default override: 10 on Safari if enable_quirks is true
* __xhr_ignoreErrors__: how to react to errors in download/upload streams and the ping test
* `0`: Fail test on error (behaviour of previous versions of this test)
* `1`: Restart a stream/ping when it fails
* `2`: Ignore all errors
* Default: `1`
* Recommended: `1`
* __allow_fetchAPI__: allow the use of Fetch API for the download test instead of regular XHR. Experimental, not recommended.
* Default: `false`
* __force_fetchAPI__: forces the use of Fetch API on all browsers that support it
Expand All @@ -182,7 +188,7 @@ w.postMessage('abort')

This will terminate all network activity and stop the worker.

__Important:__ do not simply kill the worker while it's running, as it will leave pending XHR requests!
__Important:__ do not simply kill the worker while it's running, as it may leave pending XHR requests!


## Using the test without PHP
Expand Down
31 changes: 21 additions & 10 deletions speedtest_worker.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
HTML5 Speedtest v4.2.1
HTML5 Speedtest v4.2.2
by Federico Dossena
https://github.com/adolfintel/speedtest/
GNU LGPLv3 License
Expand All @@ -24,6 +24,7 @@ var settings = {
url_getIp: 'getIP.php', // path to getIP.php relative to this js file, or a similar thing that outputs the client's ip
xhr_dlMultistream: 10, // number of download streams to use (can be different if enable_quirks is active)
xhr_ulMultistream: 3, // number of upload streams to use (can be different if enable_quirks is active)
xhr_ignoreErrors: 1, // 0=fail on errors, 1=attempt to restart a stream if it fails, 2=ignore all errors
xhr_dlUseBlob: false, // if set to true, it reduces ram usage but uses the hard drive (useful with large garbagePhp_chunkSize and/or high xhr_dlMultistream)
garbagePhp_chunkSize: 20, // size of chunks sent by garbage.php (can be different if enable_quirks is active)
enable_quirks: true, // enable quirks for specific browsers. currently it overrides settings to optimize for specific browsers, unless they are already being overridden with the start command
Expand Down Expand Up @@ -180,10 +181,11 @@ function dlTest (done) {
testStream(i, 0)
}.bind(this)
xhr[i].onerror = function () {
// error, abort
failed = true
// error
if (settings.xhr_ignoreErrors === 0) failed=true //abort
try { xhr[i].abort() } catch (e) { }
delete (xhr[i])
if (settings.xhr_ignoreErrors === 1) testStream(i, 100) //restart stream after 100ms
}.bind(this)
// send xhr
try { if (settings.xhr_dlUseBlob) xhr[i].responseType = 'blob'; else xhr[i].responseType = 'arraybuffer' } catch (e) { }
Expand Down Expand Up @@ -251,9 +253,10 @@ function ulTest (done) {
}
xhr[i].onerror = function () {
// error, abort
failed = true
if (settings.xhr_ignoreErrors === 0) failed = true //abort
try { xhr[i].abort() } catch (e) { }
delete (xhr[i])
if (settings.xhr_ignoreErrors === 1) testStatus(i,100); //restart stream after 100ms
}
xhr[i].open('POST', settings.url_ul + '?r=' + Math.random(), true) // random string to prevent caching
xhr[i].setRequestHeader('Content-Encoding', 'identity') // disable compression (some browsers may refuse it, but data is incompressible anyway)
Expand All @@ -273,10 +276,10 @@ function ulTest (done) {
testStream(i, 0)
}.bind(this)
xhr[i].upload.onerror = function () {
// error, abort
failed = true
if (settings.xhr_ignoreErrors === 0) failed=true //abort
try { xhr[i].abort() } catch (e) { }
delete (xhr[i])
if (settings.xhr_ignoreErrors === 1) testStream(i, 100) //restart stream after 100ms
}.bind(this)
// send xhr
xhr[i].open('POST', settings.url_ul + '?r=' + Math.random(), true) // random string to prevent caching
Expand Down Expand Up @@ -337,10 +340,18 @@ function pingTest (done) {
}.bind(this)
xhr[0].onerror = function () {
// a ping failed, cancel test
pingStatus = 'Fail'
jitterStatus = 'Fail'
clearRequests()
done()
if (settings.xhr_ignoreErrors === 0) { //abort
pingStatus = 'Fail'
jitterStatus = 'Fail'
clearRequests()
done()
}
if (settings.xhr_ignoreErrors === 1) doPing() //retry ping

if(settings.xhr_ignoreErrors === 2){ //ignore failed ping
i++
if (i < settings.count_ping) doPing(); else done() // more pings to do?
}
}.bind(this)
// sent xhr
xhr[0].open('GET', settings.url_ping + '?r=' + Math.random(), true) // random string to prevent caching
Expand Down
2 changes: 1 addition & 1 deletion speedtest_worker.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 710887f

Please sign in to comment.