فهرست منبع

fix upload: check HTTP status in xhr.onload, expand IIS docs

- speedtest_worker.js: moved HTTP status check from xhr.upload.onload
  (body sent, response may not be available) to xhr.onload
  (full HTTP transaction complete, xhr.status is reliable).
- doc.md: added full IIS web.config example with maxAllowedContentLength.
EmanuelPeixoto 6 روز پیش
والد
کامیت
2afc380e19
2فایلهای تغییر یافته به همراه23 افزوده شده و 15 حذف شده
  1. 10 1
      doc.md
  2. 13 14
      speedtest_worker.js

+ 10 - 1
doc.md

@@ -72,7 +72,16 @@ Apache:
 LimitRequestBody 134217728
 ```
 
-IIS: Set `maxAllowedContentLength` in `web.config`.
+IIS: Add the following to `web.config` (value is in bytes):
+```xml
+<system.webServer>
+  <security>
+    <requestFiltering>
+      <requestLimits maxAllowedContentLength="134217728" />
+    </requestFiltering>
+  </security>
+</system.webServer>
+```
 
 __Important:__ The speed test needs write permissions in the installation folder!
 

+ 13 - 14
speedtest_worker.js

@@ -502,20 +502,9 @@ function ulTest(done) {
 							prevLoaded = event.loaded;
 						}.bind(this);
 						xhr[i].upload.onload = function() {
-							// check HTTP status - non-2xx means server rejected the request (e.g. 413 body too large)
-							if (xhr[i].status >= 200 && xhr[i].status < 300) {
-								// this stream sent all the garbage data, start again
-								tverb("ul stream finished " + i);
-								testStream(i, 0);
-							} else {
-								tverb("ul stream failed with HTTP " + xhr[i].status + " " + i);
-								if (settings.xhr_ignoreErrors === 0) failed = true; //abort
-								try {
-									xhr[i].abort();
-								} catch (e) {}
-								delete xhr[i];
-								if (settings.xhr_ignoreErrors === 1) testStream(i, 0); //restart stream
-							}
+							// this stream sent all the garbage data, start again
+							tverb("ul stream finished " + i);
+							testStream(i, 0);
 						}.bind(this);
 						xhr[i].upload.onerror = function() {
 							tverb("ul stream failed " + i);
@@ -526,6 +515,16 @@ function ulTest(done) {
 							delete xhr[i];
 							if (settings.xhr_ignoreErrors === 1) testStream(i, 0); //restart stream
 						}.bind(this);
+						xhr[i].onload = function() {
+							// check HTTP status after full response is available
+							if (xhr[i].status >= 200 && xhr[i].status < 300) return;
+							tverb("ul stream failed with HTTP " + xhr[i].status + " " + i);
+							if (settings.xhr_ignoreErrors === 0) failed = true; //abort
+							try {
+								xhr[i].abort();
+							} catch (e) {}
+							delete xhr[i];
+						}.bind(this);
 						// send xhr
 						xhr[i].open("POST", settings.url_ul + url_sep(settings.url_ul) + (settings.mpot ? "cors=true&" : "") + "r=" + Math.random(), true); // random string to prevent caching
 						try {