nodejs 使用代理髮送http/https請求

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   使用   ar   for   

http的比較簡單:

var Http = require(‘http‘); var req = Http.request(    {        host: ‘192.168.5.8‘, // 代理 IP        port: 3128, // 代理連接埠        method: ‘GET‘,        path: ‘http://baidu.com‘ // 要訪問的url    },    function(res)    {        res.on(‘data‘, function(data)        {            console.log(data.toString());        });    }); req.end();

 

 

https的要複雜一些: https://gist.github.com/matthias-christen/6beb3b4dda26bd6a221d

var Util = require(‘util‘);var Https = require(‘https‘);var Tls = require(‘tls‘); function HttpsProxyAgent(options){    Https.Agent.call(this, options);     this.proxyHost = options.proxyHost;    this.proxyPort = options.proxyPort;     this.createConnection = function(opts, callback)    {        // do a CONNECT request        var req = Http.request({            host: options.proxyHost,            port: options.proxyPort,            method: ‘CONNECT‘,            path: opts.host + ‘:‘ + opts.port,            headers: {                host: opts.host            }        });         req.on(‘connect‘, function(res, socket, head)        {            var cts = Tls.connect(                {                    host: opts.host,                    socket: socket                },                function()                {                    callback(false, cts);                }            );        });         req.on(‘error‘, function(err)        {            callback(err, null);        });         req.end();    }} Util.inherits(HttpsProxyAgent, Https.Agent); // Almost verbatim copy of http.Agent.addRequestHttpsProxyAgent.prototype.addRequest = function(req, host, port, localAddress){    var name = host + ‘:‘ + port;    if (localAddress)        name += ‘:‘ + localAddress;     if (!this.sockets[name])        this.sockets[name] = [];     if (this.sockets[name].length < this.maxSockets)    {        // if we are under maxSockets create a new one.        this.createSocket(name, host, port, localAddress, req, function(socket)        {            req.onSocket(socket);        });    }    else    {        // we are over limit so we‘ll add it to the queue.        if (!this.requests[name])            this.requests[name] = [];        this.requests[name].push(req);    }}; // Almost verbatim copy of http.Agent.createSocketHttpsProxyAgent.prototype.createSocket = function(name, host, port, localAddress, req, callback){    var self = this;    var options = Util._extend({}, self.options);    options.port = port;    options.host = host;    options.localAddress = localAddress;     options.servername = host;    if (req)    {        var hostHeader = req.getHeader(‘host‘);        if (hostHeader)            options.servername = hostHeader.replace(/:.*$/, ‘‘);    }     self.createConnection(options, function(err, s)    {        if (err)        {            err.message += ‘ while connecting to HTTP(S) proxy server ‘ + self.proxyHost + ‘:‘ + self.proxyPort;             if (req)                req.emit(‘error‘, err);            else                throw err;             return;        }         if (!self.sockets[name])            self.sockets[name] = [];         self.sockets[name].push(s);         var onFree = function()        {            self.emit(‘free‘, s, host, port, localAddress);        };         var onClose = function(err)        {            // this is the only place where sockets get removed from the Agent.            // if you want to remove a socket from the pool, just close it.            // all socket errors end in a close event anyway.            self.removeSocket(s, name, host, port, localAddress);        };         var onRemove = function()        {            // we need this function for cases like HTTP ‘upgrade‘            // (defined by WebSockets) where we need to remove a socket from the pool            // because it‘ll be locked up indefinitely            self.removeSocket(s, name, host, port, localAddress);            s.removeListener(‘close‘, onClose);            s.removeListener(‘free‘, onFree);            s.removeListener(‘agentRemove‘, onRemove);        };         s.on(‘free‘, onFree);        s.on(‘close‘, onClose);        s.on(‘agentRemove‘, onRemove);         callback(s);  });};

 

nodejs 使用代理髮送http/https請求

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.