• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

nodeca / probe-image-size / 25263851961

02 May 2026 10:50PM UTC coverage: 99.537% (+0.1%) from 99.441%
25263851961

push

github

puzrin
Fixed max redirects handling, close #81

708 of 714 branches covered (99.16%)

16 of 17 new or added lines in 1 file covered. (94.12%)

1074 of 1079 relevant lines covered (99.54%)

988.53 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.73
/http.js
1
'use strict';
2

3

4
var ProbeError  = require('./lib/common').ProbeError;
3✔
5
var needle      = require('needle');
3✔
6
var lodashMerge       = require('lodash.merge');
3✔
7
var pkg         = require('./package.json');
3✔
8
var probeStream = require('./stream');
3✔
9
var URL         = require('url').URL;
3✔
10

11
var defaultAgent = pkg.name + '/' + pkg.version + '(+https://github.com/nodeca/probe-image-size)';
3✔
12

13
var defaults = {
3✔
14
  open_timeout: 10000,
15
  response_timeout: 60000,
16
  read_timeout: 60000,
17
  follow_max: 10,
18
  parse_response: false,
19
  // Use to ignore bad certificates.
20
  //rejectUnauthorized: false,
21
  headers: {
22
    'User-Agent': defaultAgent
23
  }
24
};
25

26

27
module.exports = function probeHttp(src, options) {
3✔
28
  return new Promise(function (resolve, reject) {
87✔
29
    var stream, len, finalUrl = src, settled = false;
87✔
30

31
    function abortRequest() {
32
      if (stream && stream.request) stream.request.abort();
81!
33
    }
34

35
    function settle(resolveResult, rejectError) {
36
      if (settled) return;
105✔
37
      settled = true;
81✔
38

39
      if (rejectError) {
81✔
40
        reject(rejectError);
36✔
41
        abortRequest();
36✔
42
        return;
36✔
43
      }
44

45
      resolve(resolveResult);
45✔
46
      abortRequest();
45✔
47
    }
48

49
    try {
87✔
50
      var needleOptions = lodashMerge({}, defaults, options);
87✔
51
      stream = needle.get(src, needleOptions);
87✔
52
    } catch (err) {
53
      reject(err);
6✔
54
      return;
6✔
55
    }
56

57
    stream.on('redirect', function (location) {
81✔
58
      try {
24✔
59
        finalUrl = new URL(location, finalUrl).href;
24✔
60
      } catch (err) {
NEW
61
        settle(null, err);
×
62
      }
63
    });
64

65
    stream.on('header', function (statusCode, headers) {
81✔
66
      if (statusCode !== 200) {
66✔
67
        settle(null, new ProbeError('bad status code: ' + statusCode, null, statusCode));
12✔
68
        return;
12✔
69
      }
70

71
      len = headers['content-length'];
54✔
72
    });
73

74
    stream.on('err', function (err) {
81✔
75
      settle(null, err);
12✔
76
    });
77

78
    stream.on('done', function (err) {
81✔
79
      if (err) settle(null, err);
51✔
80
    });
81

82
    probeStream(stream, true)
81✔
83
      .then(function (result) {
84
        if (len && len.match(/^\d+$/)) result.length = +len;
45✔
85

86
        result.url = finalUrl;
45✔
87

88
        settle(result);
45✔
89
      })
90
      .catch(function (err) {
91
        settle(null, err);
21✔
92
      });
93
  });
94
};
95

96

97
module.exports.parsers = require('./lib/parsers_stream');
3✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc