]> git.p6c8.net - jirafeau_project.git/commitdiff
[BUGFIX] detect and adapt server limitation
authorJerome Jutteau <jerome@jutteau.fr>
Sun, 15 Nov 2020 22:30:05 +0000 (23:30 +0100)
committerJerome Jutteau <jerome@jutteau.fr>
Sun, 15 Nov 2020 22:35:57 +0000 (23:35 +0100)
This fix retry to transfer when js client gets a 413 (Request Entity Too Large).
Chunk size is lowered at each retry.
Jirafeau administrators seeing 413 errors should check their server settings.

fixes #234

Signed-off-by: Jerome Jutteau <jerome@jutteau.fr>
lib/functions.js.php

index d9a75eec7fb0badb07ac63de3997975fa06d239f..73e901f2b28607760b812bde4fafc0b47a334574 100644 (file)
@@ -398,6 +398,7 @@ var async_global_ref = '';
 var async_global_max_size = 0;
 var async_global_time;
 var async_global_transfering = 0;
 var async_global_max_size = 0;
 var async_global_time;
 var async_global_transfering = 0;
+var async_global_last_code;
 
 function async_upload_start (max_size, file, time, password, one_time, upload_password)
 {
 
 function async_upload_start (max_size, file, time, password, one_time, upload_password)
 {
@@ -470,6 +471,7 @@ function async_upload_progress (e)
 
 function async_upload_push (code)
 {
 
 function async_upload_push (code)
 {
+    async_global_last_code = code;
     if (async_global_transfered == async_global_file.size)
     {
         hide_upload_progression ();
     if (async_global_transfered == async_global_file.size)
     {
         hide_upload_progression ();
@@ -482,27 +484,35 @@ function async_upload_push (code)
     req.addEventListener ("abort", pop_failure, false);
     req.onreadystatechange = function ()
     {
     req.addEventListener ("abort", pop_failure, false);
     req.onreadystatechange = function ()
     {
-        if (req.readyState == 4 && req.status == 200)
+        if (req.readyState == 4)
         {
         {
-            var res = req.responseText;
+            if (req.status == 200)
+            {
+                var res = req.responseText;
 
 
-            if (/^Error/.test(res))
+                if (/^Error/.test(res))
+                {
+                    pop_failure (res);
+                    return;
+                }
+
+                res = res.split ("\n");
+                var code = res[0]
+                async_global_transfered = async_global_transfering;
+                async_upload_push (code);
+            }
+            else if (req.status == 413) // Request Entity Too Large
             {
             {
-                pop_failure (res);
-                return;
+                // lower async_global_max_size and retry
+                async_global_max_size = parseInt (async_global_max_size * 0.8);
+                async_upload_push (async_global_last_code);
             }
             }
-
-            res = res.split ("\n");
-            var code = res[0]
-            async_global_transfered = async_global_transfering;
-            async_upload_push (code);
         }
     }
     req.open ("POST", 'script.php?push_async' , true);
 
         }
     }
     req.open ("POST", 'script.php?push_async' , true);
 
-    var chunk_size = parseInt (async_global_max_size * 0.50);
     var start = async_global_transfered;
     var start = async_global_transfered;
-    var end = start + chunk_size;
+    var end = start + async_global_max_size;
     if (end >= async_global_file.size)
         end = async_global_file.size;
     var blob = async_global_file.slice (start, end);
     if (end >= async_global_file.size)
         end = async_global_file.size;
     var blob = async_global_file.slice (start, end);

patrick-canterino.de