From 0a6bf57aaa63053eb60b49985036b51078741414 Mon Sep 17 00:00:00 2001 From: Jerome Jutteau Date: Sun, 15 Nov 2020 23:30:05 +0100 Subject: [PATCH] [BUGFIX] detect and adapt server limitation 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 --- lib/functions.js.php | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/lib/functions.js.php b/lib/functions.js.php index d9a75ee..73e901f 100644 --- a/lib/functions.js.php +++ b/lib/functions.js.php @@ -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_last_code; 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) { + async_global_last_code = code; 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 () { - 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); - var chunk_size = parseInt (async_global_max_size * 0.50); 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); -- 2.34.1