diff --git a/src/index.js b/src/index.js index 6d2132ab7..b716550a8 100644 --- a/src/index.js +++ b/src/index.js @@ -153,6 +153,7 @@ export default function fetch(url, opts) { method: request.method, body: request.body, signal: request.signal, + timeout: request.timeout }; // HTTP-redirect fetch step 9 diff --git a/test/server.js b/test/server.js index 524208fcd..15347885f 100644 --- a/test/server.js +++ b/test/server.js @@ -275,6 +275,14 @@ export default class TestServer { }, 1000); } + if (p === '/redirect/slow-chain') { + res.statusCode = 301; + res.setHeader('Location', '/redirect/slow'); + setTimeout(function() { + res.end(); + }, 100); + } + if (p === '/redirect/slow-stream') { res.statusCode = 301; res.setHeader('Location', '/slow'); diff --git a/test/test.js b/test/test.js index 019ba739a..21d633252 100644 --- a/test/test.js +++ b/test/test.js @@ -799,6 +799,17 @@ describe('node-fetch', () => { }); }); + it('should allow custom timeout on redirected requests', function() { + this.timeout(2000); + const url = `${base}redirect/slow-chain`; + const opts = { + timeout: 200 + }; + return expect(fetch(url, opts)).to.eventually.be.rejected + .and.be.an.instanceOf(FetchError) + .and.have.property('type', 'request-timeout'); + }); + it('should clear internal timeout on fetch response', function (done) { this.timeout(2000); spawn('node', ['-e', `require('./')('${base}hello', { timeout: 10000 })`])