UNPKG

hiproxy

Version:

hiproxy - lightweight and powerful proxy tool for front-end developer based on Node.js.

70 lines (60 loc) 2.08 kB
/** * @file HTTP server CONNECT handler * @author zdying */ 'use strict'; var url = require('url'); var net = require('net'); var utils = require('../../../helpers/utils'); /** * 处理`CONNECT`请求 */ module.exports = function connectHandler (request, socket, head) { var urlObj = url.parse('https://' + request.url); var hostname = urlObj.hostname; var port = Number(urlObj.port) || 443; var rewriteRule = this.rewrite.getRule(hostname); var hostRule = this.hosts.getHost(hostname); var middleManPort = this.httpsPort; request.requestId = utils.randomId(); request._startTime = Date.now(); /** * Emitted each time the server responds to a request with a `CONNECT` method. * @event ProxyServer#connect * @property {http.IncomingMessage} request request object * @property {net.Socket} socket socket object * @property {Buffer} head head */ this.emit('connect', { req: request, socket: socket, head: head }); if (rewriteRule || hostRule) { hostname = '127.0.0.1'; port = middleManPort; log.debug('https proxy -', request.url.bold.green, '==>', hostname.bold.green, String(port).bold.green, 'rule type:', (rewriteRule ? 'rewrite' : 'hosts').bold.green); } else { log.debug('https direc -', request.url.bold); log.access(request); } log.debug('connect to:', hostname, port, 'original info:', JSON.stringify(urlObj)); // if (!this.httpsPort || !this.httpsServer) { // socket.write('HTTP/1.1 200 Error\r\n\r\nThe HTTPS server has not been started.'); // socket.end(); // return; // } var proxySocket = net.connect(port, hostname, function () { socket.write('HTTP/1.1 200 Connection Established\r\n\r\n'); proxySocket.write(head); proxySocket.pipe(socket); }).on('error', function (e) { log.error('proxy error', e.message); log.detail('proxy error', e.stack); socket.end(); }).on('data', function (data) { // console.log('proxy socker data:', hostname, port, data.toString()); // socket.write(data); }); socket.pipe(proxySocket); };