From de219dae264b4e52f1728993c8428dab7d5db60e Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Fri, 19 Jun 2020 11:35:44 -0400 Subject: [PATCH] Reject downloaded lists which are deemed truncated Related feedback: - https://www.reddit.com/r/uBlockOrigin/comments/hbpo86/ For unknown reasons at this point, it appears some users end up with a truncated version of EasyList, leading to improper blocking in uBO. This commit adds a heuristic to discard a downloaded list when its new size is more than 25% smaller than the currently cached version. --- src/js/assets.js | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/js/assets.js b/src/js/assets.js index efbb93535..f74f073bf 100644 --- a/src/js/assets.js +++ b/src/js/assets.js @@ -771,6 +771,22 @@ const getRemote = async function(assetKey) { ? await api.fetchFilterList(contentURL) : await api.fetchText(contentURL); + // https://www.reddit.com/r/uBlockOrigin/comments/hbpo86/ + // Server sent a truncated list? If the new list is smaller than the + // currently cached one by more than 25%, assume a server error. + if ( + stringIsNotEmpty(result.content) && + typeof assetDetails.size === 'number' && + assetDetails.size !== 0 + ) { + const loss = 1 - result.content.length / assetDetails.size; + if ( loss > 0.25 ) { + result.statusCode = 206; + result.statusText = 'Partial Content'; + result.content = ''; + } + } + // Failure if ( stringIsNotEmpty(result.content) === false ) { let error = result.statusText; @@ -788,7 +804,10 @@ const getRemote = async function(assetKey) { content: result.content, url: contentURL }); - registerAssetSource(assetKey, { error: undefined }); + registerAssetSource(assetKey, { + error: undefined, + size: result.content.length + }); return reportBack(result.content); }