1 | var middleware = require('./middleware')
|
2 | var logResponse = require('./log').logResponse
|
3 | var resolveUrl = require('../resolveUrl')
|
4 |
|
5 | function consumeStream (s) {
|
6 | return new Promise(function (resolve, reject) {
|
7 | s.on('end', function () {
|
8 | resolve()
|
9 | })
|
10 |
|
11 | s.on('error', function (e) {
|
12 | reject(e)
|
13 | })
|
14 |
|
15 | s.resume()
|
16 | })
|
17 | }
|
18 |
|
19 | module.exports = middleware('redirect', function (request, next, client) {
|
20 | return next().then(function (response) {
|
21 | var statusCode = response.statusCode
|
22 | var location = response.headers.location
|
23 |
|
24 | if (request.options.redirect !== false && location && (statusCode === 300 || statusCode === 301 || statusCode === 302 || statusCode === 303 || statusCode === 307)) {
|
25 | return consumeStream(response.body).then(function () {
|
26 | logResponse(response)
|
27 | return client.get(resolveUrl(request.url, location), request.options).then(function (redirectResponse) {
|
28 | var error = new Error('redirect')
|
29 | error.redirectResponse = redirectResponse
|
30 | throw error
|
31 | })
|
32 | })
|
33 | } else {
|
34 | return response
|
35 | }
|
36 | })
|
37 | })
|