'use strict'; var ProbeError = require('./lib/common').ProbeError; var got = require('got'); 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: 30000, retries: 1, headers: { 'User-Agent': defaultAgent } }; var P; module.exports = function probeHttp(src, options) { // lazy Promise init P = P || require('any-promise'); return new P(function (resolve, reject) { var request, length, finalUrl; var stream = got.stream(src, merge.all([ {}, defaults, options ], { clone: true })); stream.on('request', function (req) { request = req; }); stream.on('response', function (res) { if (res.statusCode === 200) { var len = res.headers['content-length']; if (len && len.match(/^\d+$/)) length = +len; finalUrl = res.url; return; } reject(new ProbeError('bad status code: ' + res.statusCode, null, res.statusCode)); }); stream.on('error', function (err) { if (err.statusCode) { reject(new ProbeError('bad status code: ' + err.statusCode, null, err.statusCode)); return; } reject(err); }); probeStream(stream) .then(function (result) { if (length) result.length = length; result.url = finalUrl; resolve(result); }) .catch(reject) .then(function () { /* istanbul ignore else */ if (request) request.abort(); }); }); }; module.exports.parsers = require('./lib/parsers_stream');