56 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| module.exports = function (req, time) {
 | |
| 	if (req.timeoutTimer) {
 | |
| 		return req;
 | |
| 	}
 | |
| 
 | |
| 	var delays = isNaN(time) ? time : {socket: time, connect: time};
 | |
| 	var host = req._headers ? (' to ' + req._headers.host) : '';
 | |
| 
 | |
| 	if (delays.connect !== undefined) {
 | |
| 		req.timeoutTimer = setTimeout(function timeoutHandler() {
 | |
| 			req.abort();
 | |
| 			var e = new Error('Connection timed out on request' + host);
 | |
| 			e.code = 'ETIMEDOUT';
 | |
| 			req.emit('error', e);
 | |
| 		}, delays.connect);
 | |
| 	}
 | |
| 
 | |
| 	// Clear the connection timeout timer once a socket is assigned to the
 | |
| 	// request and is connected.
 | |
| 	req.on('socket', function assign(socket) {
 | |
| 		// Socket may come from Agent pool and may be already connected.
 | |
| 		if (!(socket.connecting || socket._connecting)) {
 | |
| 			connect();
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		socket.once('connect', connect);
 | |
| 	});
 | |
| 
 | |
| 	function clear() {
 | |
| 		if (req.timeoutTimer) {
 | |
| 			clearTimeout(req.timeoutTimer);
 | |
| 			req.timeoutTimer = null;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	function connect() {
 | |
| 		clear();
 | |
| 
 | |
| 		if (delays.socket !== undefined) {
 | |
| 			// Abort the request if there is no activity on the socket for more
 | |
| 			// than `delays.socket` milliseconds.
 | |
| 			req.setTimeout(delays.socket, function socketTimeoutHandler() {
 | |
| 				req.abort();
 | |
| 				var e = new Error('Socket timed out on request' + host);
 | |
| 				e.code = 'ESOCKETTIMEDOUT';
 | |
| 				req.emit('error', e);
 | |
| 			});
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return req.on('error', clear);
 | |
| };
 |