Blame view

node_modules/needle/test/socket_cleanup_spec.js 1.85 KB
7820380e   “wangming”   1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  var should = require('should'),
      needle = require('./../'),
      fs = require('fs'),
      https = require('https'),
      stream = require('stream');
  
  describe('socket cleanup', function(){
  
    var outFile = 'test/tmp';
    var httpAgent, readStream, writeStream
  
    var file = 'ubuntu-21.04-desktop-amd64.iso',
        url = 'https://releases.ubuntu.com/21.04/' + file;
  
    function getActiveSockets() {
      return Object.keys(httpAgent.sockets).length
    }
  
    before(function() {
      httpAgent = new https.Agent({
        keepAlive  : true,
        maxSockets : 1
      });
    })
  
    after(function() {
      httpAgent.destroy()
      fs.unlinkSync(outFile);
    })
  
    it('should cleanup sockets on ERR_STREAM_PREMATURE_CLOSE (using .pipe)', function(done) {
      getActiveSockets().should.eql(0);
  
      var resp = needle.get(url, { agent: httpAgent });
      var writable = fs.createWriteStream(outFile);
      resp.pipe(writable);
  
      writable.on('close', function(e) {
        if (!resp.done) resp.abort();
      })
  
      setTimeout(function() {
        getActiveSockets().should.eql(1);
        writable.destroy();
      }, 50);
  
      setTimeout(function() {
        getActiveSockets().should.eql(0);
        done();
      }, 500); // takes a bit
    })
  
    it('should cleanup sockets on ERR_STREAM_PREMATURE_CLOSE (using stream.pipeline)', function(done) {
      if (!stream.pipeline)
        return done()
  
      getActiveSockets().should.eql(0);
  
      var resp = needle.get(url, { agent: httpAgent });
      var writable = fs.createWriteStream(outFile);
  
      stream.pipeline(resp, writable, function(err) {
        err.code.should.eql('ERR_STREAM_PREMATURE_CLOSE')
        if (err) resp.request.destroy();
      });
  
      setTimeout(function() {
        getActiveSockets().should.eql(1);
        writable.destroy();
      }, 50);
  
      setTimeout(function() {
        getActiveSockets().should.eql(0);
        done();
      }, 1000); // takes a bit
  
    })
  
  })