|
@@ -4,7 +4,7 @@ const { URL } = require('url')
|
|
|
const Uploader = require('../Uploader')
|
|
|
const validator = require('validator')
|
|
|
const utils = require('../helpers/utils')
|
|
|
-const { getProtectedHttpAgent } = require('../helpers/request')
|
|
|
+const { getProtectedHttpAgent, getRedirectEvaluator } = require('../helpers/request')
|
|
|
const logger = require('../logger')
|
|
|
|
|
|
module.exports = () => {
|
|
@@ -31,6 +31,7 @@ const meta = (req, res) => {
|
|
|
.then((meta) => res.json(meta))
|
|
|
.catch((err) => {
|
|
|
logger.error(err, 'controller.url.meta.error', req.id)
|
|
|
+ // @todo send more meaningful error message and status code to client if possible
|
|
|
return res.status(err.status || 500).json({ message: 'failed to fetch URL metadata' })
|
|
|
})
|
|
|
}
|
|
@@ -72,6 +73,7 @@ const get = (req, res) => {
|
|
|
res.status(response.status).json(response.body)
|
|
|
}).catch((err) => {
|
|
|
logger.error(err, 'controller.url.get.error', req.id)
|
|
|
+ // @todo send more meaningful error message and status code to client if possible
|
|
|
return res.status(err.status || 500).json({ message: 'failed to fetch URL metadata' })
|
|
|
})
|
|
|
}
|
|
@@ -113,12 +115,22 @@ const downloadURL = (url, onDataChunk, blockLocalIPs, traceId) => {
|
|
|
const opts = {
|
|
|
uri: url,
|
|
|
method: 'GET',
|
|
|
- followAllRedirects: true,
|
|
|
+ followRedirect: getRedirectEvaluator(url, blockLocalIPs),
|
|
|
agentClass: getProtectedHttpAgent((new URL(url)).protocol, blockLocalIPs)
|
|
|
}
|
|
|
|
|
|
request(opts)
|
|
|
- .on('data', (chunk) => onDataChunk(null, chunk))
|
|
|
+ .on('response', (resp) => {
|
|
|
+ if (resp.statusCode >= 300) {
|
|
|
+ const err = new Error(`URL server responded with status: ${resp.statusCode}`)
|
|
|
+ onDataChunk(err, null)
|
|
|
+ } else {
|
|
|
+ resp.on('data', (chunk) => onDataChunk(null, chunk))
|
|
|
+ }
|
|
|
+ })
|
|
|
.on('end', () => onDataChunk(null, null))
|
|
|
- .on('error', (err) => logger.error(err, 'controller.url.download.error', traceId))
|
|
|
+ .on('error', (err) => {
|
|
|
+ logger.error(err, 'controller.url.download.error', traceId)
|
|
|
+ onDataChunk(err, null)
|
|
|
+ })
|
|
|
}
|