84 lines
2.2 KiB
JavaScript
Raw Normal View History

2022-09-30 05:39:11 +00:00
'use strict';
var ProbeError = require('./lib/common').ProbeError;
var request = require('request');
var merge = require('deepmerge');
var pkg = require('./package.json');
var probeStream = require('./stream');
var defaultAgent = pkg.name + '/' + pkg.version + '(+https://github.com/nodeca/probe-image-size)';
var defaults = {
timeout: 60000,
// retries: 1, // needed for `got` only, not supported by `request`
headers: {
'User-Agent': defaultAgent,
// Override default "gzip, deflate" header that is auto-inserted when
// request has gzip option turned on.
//
// It's done so because gzip may have large block size, and we only need
// to know a first few bytes to extract image size.
//
'Accept-Encoding': 'identity'
},
// turn gzip decompression on in case there are misconfigured servers
// that always return gzip encoded content even if not requested
gzip: true
};
module.exports = function probeHttp(src, options) {
return new Promise(function (resolve, reject) {
var stream, length, finalUrl;
try {
stream = request(merge.all([ { url: src }, defaults, options ]));
} catch (err) {
reject(err);
return;
}
stream.on('response', function (res) {
if (res.statusCode !== 200) {
var err = new ProbeError('bad status code: ' + res.statusCode, null, res.statusCode);
stream.abort();
reject(err);
return;
}
var len = res.headers['content-length'];
if (len && len.match(/^\d+$/)) length = +len;
finalUrl = res.request.uri.href;
probeStream(stream)
.then(function (result) {
if (length) result.length = length;
result.url = finalUrl;
resolve(result);
})
.catch(reject)
.then(function () { stream.abort(); });
});
stream.on('error', function (err) {
/* This check needed for `got` only, because it returns 404 as error.
if (err.statusCode) {
reject(new ProbeError('bad status code: ' + err.statusCode, null, err.statusCode));
return;
}*/
reject(err);
});
});
};
module.exports.parsers = require('./lib/parsers_stream');