diff --git a/server/core/BookUpdateChecker/BUCServer.js b/server/core/BookUpdateChecker/BUCServer.js index 4f51d04c..820c44aa 100644 --- a/server/core/BookUpdateChecker/BUCServer.js +++ b/server/core/BookUpdateChecker/BUCServer.js @@ -259,9 +259,8 @@ class BUCServer { try { let unchanged = true; let hash = ''; -log(`head ${row.id}`) + const headers = await this.down.head(row.id); -log(`headers ${row.id}: ${JSON.stringify(headers)}`) const etag = headers['etag'] || ''; const modTime = headers['last-modified'] || ''; @@ -274,9 +273,8 @@ log(`headers ${row.id}: ${JSON.stringify(headers)}`) && (!modTime || !row.modTime || (modTime !== row.modTime)) && (!size || !row.size || (size !== row.size)) ) { -log(`down ${row.id}`) + const downdata = await this.down.load(row.id); -log(`loaded ${row.id}`) size = downdata.length; hash = await utils.getBufHash(downdata, 'sha256', 'hex'); diff --git a/server/core/FileDownloader.js b/server/core/FileDownloader.js index b05fb26a..7061532a 100644 --- a/server/core/FileDownloader.js +++ b/server/core/FileDownloader.js @@ -1,4 +1,5 @@ const axios = require('axios'); +const utils = require('./utils'); const userAgent = 'Mozilla/5.0 (X11; HasCodingOs 1.0; Linux x64) AppleWebKit/637.36 (KHTML, like Gecko) Chrome/70.0.3112.101 Safari/637.36 HasBrowser/5.0'; @@ -77,25 +78,42 @@ class FileDownloader { return res.headers; } - streamToBuffer(stream, progress) { + streamToBuffer(stream, progress, timeout = 30*1000) { return new Promise((resolve, reject) => { if (!progress) progress = () => {}; const _buf = []; + let resolved = false; + let timer = 0; stream.on('data', (chunk) => { + timer = 0; _buf.push(chunk); progress(chunk); }); - stream.on('end', () => resolve(Buffer.concat(_buf))); + stream.on('end', () => { + resolved = true; + timer = timeout; + resolve(Buffer.concat(_buf)); + }); stream.on('error', (err) => { reject(err); }); stream.on('aborted', () => { reject(new Error('aborted')); }); + + //бодяга с timer и timeout, чтобы гарантировать отсутствие зависания по каким-либо причинам + (async() => { + while (timer < timeout) { + await utils.sleep(1000); + timer += 1000; + } + if (!resolved) + reject(new Error('FileDownloader: timed out')) + })(); }); } }