|
@@ -104,11 +104,11 @@ module.exports.getProtectedHttpAgent = (protocol, blockPrivateIPs) => {
|
|
|
* @param {boolean} blockLocalIPs
|
|
|
* @returns {Promise<{type: string, size: number}>}
|
|
|
*/
|
|
|
-exports.getURLMeta = (url, blockLocalIPs = false) => {
|
|
|
- return new Promise((resolve, reject) => {
|
|
|
+exports.getURLMeta = async (url, blockLocalIPs = false) => {
|
|
|
+ const requestWithMethod = async (method) => new Promise((resolve, reject) => {
|
|
|
const opts = {
|
|
|
uri: url,
|
|
|
- method: 'GET',
|
|
|
+ method,
|
|
|
followRedirect: exports.getRedirectEvaluator(url, blockLocalIPs),
|
|
|
agentClass: exports.getProtectedHttpAgent((new URL(url)).protocol, blockLocalIPs),
|
|
|
}
|
|
@@ -117,20 +117,39 @@ exports.getURLMeta = (url, blockLocalIPs = false) => {
|
|
|
if (err) reject(err)
|
|
|
})
|
|
|
req.on('response', (response) => {
|
|
|
- if (response.statusCode >= 300) {
|
|
|
-
|
|
|
-
|
|
|
- reject(new Error(`URL server responded with status: ${response.statusCode}`))
|
|
|
- } else {
|
|
|
- req.abort()
|
|
|
-
|
|
|
-
|
|
|
- const contentLength = parseInt(response.headers['content-length'], 10)
|
|
|
- resolve({
|
|
|
- type: response.headers['content-type'],
|
|
|
- size: Number.isNaN(contentLength) ? null : contentLength,
|
|
|
- })
|
|
|
- }
|
|
|
+
|
|
|
+ const contentLength = parseInt(response.headers['content-length'], 10)
|
|
|
+
|
|
|
+
|
|
|
+ req.abort()
|
|
|
+
|
|
|
+ resolve({
|
|
|
+ type: response.headers['content-type'],
|
|
|
+ size: Number.isNaN(contentLength) ? null : contentLength,
|
|
|
+ statusCode: response.statusCode,
|
|
|
+ })
|
|
|
})
|
|
|
})
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ let urlMeta = await requestWithMethod('HEAD')
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if (urlMeta.statusCode >= 400 || urlMeta.size === 0 || urlMeta.size == null) {
|
|
|
+ urlMeta = await requestWithMethod('GET')
|
|
|
+ }
|
|
|
+
|
|
|
+ if (urlMeta.statusCode >= 300) {
|
|
|
+
|
|
|
+
|
|
|
+ throw new Error(`URL server responded with status: ${urlMeta.statusCode}`)
|
|
|
+ }
|
|
|
+
|
|
|
+ const { size, type } = urlMeta
|
|
|
+ return { size, type }
|
|
|
}
|