Просмотр исходного кода

fix upload: check HTTP status in onload, document server body size limit

- speedtest_worker.js: xhr.upload.onload now checks xhr.status
  before restarting the upload stream. Non-2xx responses (e.g.
  HTTP 413 from undersized client_max_body_size) are treated as
  failures instead of inflating upload speed measurements.

- doc.md: added explicit nginx/Apache/IIS configuration examples
  for client_max_body_size / LimitRequestBody to prevent HTTP 413
  errors on the 20MB upload test blobs.
EmanuelPeixoto 1 неделя назад
Родитель
Сommit
1b3c0ac9c4
2 измененных файлов с 28 добавлено и 3 удалено
  1. 14 0
      doc.md
  2. 14 3
      speedtest_worker.js

+ 14 - 0
doc.md

@@ -60,6 +60,20 @@ Let's install the speed test.
 
 Put all files on your web server via FTP or by copying them directly. You can install it in the root, or in a subdirectory.
 
+**Web server upload limit:** The upload test sends POST requests up to 20 MB (configurable with `xhr_ul_blob_megabytes`). Without proper configuration, the server will reject these with HTTP 413, causing wildly inaccurate upload speeds. Configure your web server to accept large request bodies:
+
+Nginx:
+```
+client_max_body_size 128m;
+```
+
+Apache:
+```
+LimitRequestBody 134217728
+```
+
+IIS: Set `maxAllowedContentLength` in `web.config`.
+
 __Important:__ The speed test needs write permissions in the installation folder!
 
 #### ipinfo.io

+ 14 - 3
speedtest_worker.js

@@ -502,9 +502,20 @@ function ulTest(done) {
 							prevLoaded = event.loaded;
 						}.bind(this);
 						xhr[i].upload.onload = function() {
-							// this stream sent all the garbage data, start again
-							tverb("ul stream finished " + i);
-							testStream(i, 0);
+							// 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
+							}
 						}.bind(this);
 						xhr[i].upload.onerror = function() {
 							tverb("ul stream failed " + i);