You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					66 lines
				
				2.4 KiB
			
		
		
			
		
	
	
					66 lines
				
				2.4 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								var __importDefault = (this && this.__importDefault) || function (mod) {
							 | 
						||
| 
								 | 
							
								    return (mod && mod.__esModule) ? mod : { "default": mod };
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								Object.defineProperty(exports, "__esModule", { value: true });
							 | 
						||
| 
								 | 
							
								const debug_1 = __importDefault(require("debug"));
							 | 
						||
| 
								 | 
							
								const debug = debug_1.default('https-proxy-agent:parse-proxy-response');
							 | 
						||
| 
								 | 
							
								function parseProxyResponse(socket) {
							 | 
						||
| 
								 | 
							
								    return new Promise((resolve, reject) => {
							 | 
						||
| 
								 | 
							
								        // we need to buffer any HTTP traffic that happens with the proxy before we get
							 | 
						||
| 
								 | 
							
								        // the CONNECT response, so that if the response is anything other than an "200"
							 | 
						||
| 
								 | 
							
								        // response code, then we can re-play the "data" events on the socket once the
							 | 
						||
| 
								 | 
							
								        // HTTP parser is hooked up...
							 | 
						||
| 
								 | 
							
								        let buffersLength = 0;
							 | 
						||
| 
								 | 
							
								        const buffers = [];
							 | 
						||
| 
								 | 
							
								        function read() {
							 | 
						||
| 
								 | 
							
								            const b = socket.read();
							 | 
						||
| 
								 | 
							
								            if (b)
							 | 
						||
| 
								 | 
							
								                ondata(b);
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								                socket.once('readable', read);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        function cleanup() {
							 | 
						||
| 
								 | 
							
								            socket.removeListener('end', onend);
							 | 
						||
| 
								 | 
							
								            socket.removeListener('error', onerror);
							 | 
						||
| 
								 | 
							
								            socket.removeListener('close', onclose);
							 | 
						||
| 
								 | 
							
								            socket.removeListener('readable', read);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        function onclose(err) {
							 | 
						||
| 
								 | 
							
								            debug('onclose had error %o', err);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        function onend() {
							 | 
						||
| 
								 | 
							
								            debug('onend');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        function onerror(err) {
							 | 
						||
| 
								 | 
							
								            cleanup();
							 | 
						||
| 
								 | 
							
								            debug('onerror %o', err);
							 | 
						||
| 
								 | 
							
								            reject(err);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        function ondata(b) {
							 | 
						||
| 
								 | 
							
								            buffers.push(b);
							 | 
						||
| 
								 | 
							
								            buffersLength += b.length;
							 | 
						||
| 
								 | 
							
								            const buffered = Buffer.concat(buffers, buffersLength);
							 | 
						||
| 
								 | 
							
								            const endOfHeaders = buffered.indexOf('\r\n\r\n');
							 | 
						||
| 
								 | 
							
								            if (endOfHeaders === -1) {
							 | 
						||
| 
								 | 
							
								                // keep buffering
							 | 
						||
| 
								 | 
							
								                debug('have not received end of HTTP headers yet...');
							 | 
						||
| 
								 | 
							
								                read();
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            const firstLine = buffered.toString('ascii', 0, buffered.indexOf('\r\n'));
							 | 
						||
| 
								 | 
							
								            const statusCode = +firstLine.split(' ')[1];
							 | 
						||
| 
								 | 
							
								            debug('got proxy server response: %o', firstLine);
							 | 
						||
| 
								 | 
							
								            resolve({
							 | 
						||
| 
								 | 
							
								                statusCode,
							 | 
						||
| 
								 | 
							
								                buffered
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        socket.on('error', onerror);
							 | 
						||
| 
								 | 
							
								        socket.on('close', onclose);
							 | 
						||
| 
								 | 
							
								        socket.on('end', onend);
							 | 
						||
| 
								 | 
							
								        read();
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								exports.default = parseProxyResponse;
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=parse-proxy-response.js.map
							 |