diff --git a/example/index.js b/example/index.js index 156bc36..cc0a18d 100644 --- a/example/index.js +++ b/example/index.js @@ -19,12 +19,11 @@ const pauseResumeTimer = (_dl, wait) => { }, wait); }; -// these are the default options const options = { method: 'GET', // Request Method Verb // Custom HTTP Header ex: Authorization, User-Agent headers: { - 'user-agent': pkg.name + '@' + pkg.version + 'user-agent': pkg.name + '/' + pkg.version }, retry: { maxRetries: 3, delay: 3000 }, // { maxRetries: number, delay: number in ms } or false to disable (default) fileName: filename => `${filename}.gz`, // Custom filename when saved diff --git a/package.json b/package.json index 50889d1..34ef082 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-downloader-helper", - "version": "2.1.0", + "version": "2.1.1", "description": "A simple http file downloader for node.js", "main": "./dist/index.js", "types": "./types/index.d.ts", diff --git a/src/index.js b/src/index.js index 731cc23..95450a5 100644 --- a/src/index.js +++ b/src/index.js @@ -311,35 +311,29 @@ export class DownloaderHelper extends EventEmitter { if (headers.hasOwnProperty('range')) { delete headers['range']; } - const options = this.__getOptions('HEAD', this.url, headers); return new Promise((resolve, reject) => { - const request = this.__protocol.request(options, response => { - if (this.__isRequireRedirect(response)) { - const redirectedURL = /^https?:\/\//.test(response.headers.location) - ? response.headers.location - : new URL(response.headers.location, this.url).href; - const options = this.__getOptions('HEAD', redirectedURL, headers); - const request = this.__protocol.request(options, response => { - if (response.statusCode !== 200) { - reject(new Error(`Response status was ${response.statusCode}`)); - } - resolve({ - name: this.__getFileNameFromHeaders(response.headers, response), - total: parseInt(response.headers['content-length']) || null - }); - }) - request.end(); - return; - } - if (response.statusCode !== 200) { - reject(new Error(`Response status was ${response.statusCode}`)); - } - resolve({ - name: this.__getFileNameFromHeaders(response.headers, response), - total: parseInt(response.headers['content-length']) || null + const getRequest = (url, options) => { + const req = this.__protocol.request(options, response => { + if (this.__isRequireRedirect(response)) { + const redirectedURL = /^https?:\/\//.test(response.headers.location) + ? response.headers.location + : new URL(response.headers.location, url).href; + return getRequest(redirectedURL, this.__getOptions('HEAD', redirectedURL, headers)); + } + if (response.statusCode !== 200) { + return reject(new Error(`Response status was ${response.statusCode}`)); + } + resolve({ + name: this.__getFileNameFromHeaders(response.headers, response), + total: parseInt(response.headers['content-length']) || null + }); }); - }); - request.end(); + req.on('error', (err) => reject(err)); + req.on('timeout', () => reject(new Error('timeout'))); + req.on('uncaughtException', (err) => reject(err)); + req.end(); + }; + getRequest(this.url, this.__getOptions('HEAD', this.url, headers)); }); }