80 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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
 | |
| 
 | |
|   })
 | |
| 
 | |
| })
 |