nodejs 使用代理发送http/https请求

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.addRequest
HttpsProxyAgent.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.createSocket
HttpsProxyAgent.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);
  });
};
时间: 2024-10-31 10:43:29

nodejs 使用代理发送http/https请求的相关文章

charles代理抓取https请求

注意!!!!! 手机同网域下代理需要关闭电脑 的防火墙~ 手机代理需要打开浏览器安装证书https://www.charlesproxy.com/getssl

Nodejs后台发送https请求验证证书

项目中用到了很多第三方的库,这些库在生产环境使用的时候的都会发送https的请求出去,但是再发送请求的时候nodejs会验证证书,没有证书的时候都会无法通过,这里可以修改代码进行修改这个问题, 1.在发送https请求的时候添加如下代码: rejectUnauthorized: false, 如图,某个库: 2.还有就是全局设置. 启动程序的时候设置: process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

nodejs通过代理(proxy)发送http请求(request)

var http = require('http') var opt = { host:'这里放代理服务器的ip或者域名', port:'这里放代理服务器的端口号', method:'POST',//这里是发送的方法 path:' https://www.google.com', //这里是访问的路径 headers:{ //这里放期望发送出去的请求头 } } //以下是接受数据的代码 var body = ''; var req = http.request(opt, function(res

通过 Apache Commons HttpClient 发送 HTTPS 请求

1.通过 HTTPS 发送 POST 请求: 2.HTTPS 安全协议采用 TLSv1.2: 3. 使用代理(Proxy)进行 HTTPS 访问: 4.指定 Content-Type 为:application/x-www-form-urlencoded: 5.HTTPS  请求时加载客户端证书(Client Certificate): 6.忽略服务器端证书链(Server Certificate Chain)的校验(Validate). public static void main(Stri

Jmeter发送HTTPS请求

Jmeter一般来说是压力测试的利器,最近想尝试jmeter和BeanShell进行接口测试.由于在云阅读接口测试的过程中需要进行登录操作,而登录请求是HTTPS协议.这就需要对jmeter进行设置. (一)设置HTTP请求 我们首先右键添加线程组,然后继续右键添加控制器,由于登陆操作只请求一次,因而选择仅一次控制器.接下来右键添加sampler->HTTP请求,设置HTTP请求.这里注意的地方首先是端口号,如果只是普通的HTTP协议,默认不填,而这里是HTTPS协议,因而填端口号443.另外“

【转载】JMeter学习(三十六)发送HTTPS请求

Jmeter一般来说是压力测试的利器,最近想尝试jmeter和BeanShell进行接口测试.由于在云阅读接口测试的过程中需要进行登录操作,而登录请求是HTTPS协议.这就需要对jmeter进行设置. (一)设置HTTP请求 我们首先右键添加线程组,然后继续右键添加控制器,由于登陆操作只请求一次,因而选择仅一次控制器.接下来右键添加sampler->HTTP请求,设置HTTP请求.这里注意的地方首先是端口号,如果只是普通的HTTP协议,默认不填,而这里是HTTPS协议,因而填端口号443.另外“

在requests模块中使用代理发送请求

1. 代理概述 玩爬虫为什么我们不能使用一个固定IP发送请求 你使用一个固定IP发送每秒向对方服务器发送10几个请求,对方认为这样操作不是人干的, 就把你IP给封了 服务器端的人可以根据你IP很快锁定你, 要求你对这种窃取行为赔偿. 代理 正向代理与反向代理 正向代理与反向代理的区别 反向代理: 服务器端知道代理的存在,反向代理是为了保护服务器或负责负载均衡 但是客户端不知道代理的存在的 正向代理: 客户端知道代理的存在,正向代理是为保护客户端,防止追究责任. 但是服务端不知道真实的客户端 2.

接口测试——HttpClient工具的https请求、代理设置、请求头设置、获取状态码和响应头

转自:https://www.cnblogs.com/hong-fithing/p/7617855.html https请求 https协议(Secure Hypertext Transfer Protocol) : 安全超文本传输协议, HTTPS以保密为目标研发, 简单讲HTTPS协议是由SSL+HTTP协议构建的可进行加密传输. 身份认证的网络协议, 其安全基础是SSL协议, 因此加密的详细内容请看SSL. 全称Hypertext Transfer Protocol overSecure

java——HttpClient 代理模式发送Http Https(未完成,没贴代码呢)

在setProxy()方法中设置代理IP后可以将url中的域名换成这个代理IP. http很简单,但是https这样会报错. 问题:如何使用代理发送https请求? 客户端发送https请求之前会先向这台服务器请求ssl证书,并在客服端对这个证书做一个校验. 而使用代理IP时,实际上请求打到了这个代理IP上,而客户端并不知道这件事,他仍然在等待url域名中所对应的ssl证书,而这代理ip对应的服务器实际上并没有这个证书,导致了https请求失败. 解决方法: HttpClient中有一个