前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【nodejs每日一讲】使用nodejs写一个代理服务器

【nodejs每日一讲】使用nodejs写一个代理服务器

作者头像
theanarkh
发布2021-01-12 14:57:53
3710
发布2021-01-12 14:57:53
举报
文章被收录于专栏:原创分享原创分享

工具函数

代码语言:javascript
复制
function buildHeaders(headers) {
  const arr = [];
  for (const [k, v] of Object.entries(headers)) {
    arr.push(`${k}:${v}\r\n`)
  }
  return arr.join('');
}

function getHostAndPort(req) {
  let host;
  let port;
  try {
    [host, port] = new URL(req.url);
  } catch(e) {
    [host, port] = req.headers.host.split(':');
  } finally {
      if (!port) {
          port = 80;
      }
  }
  console.log(host, port);
  return [host, port];
}

1 http代理

代码语言:javascript
复制
const server = http.createServer((req, res) => {
  const [host, port] = getHostAndPort(req);
  http.get({
    port,
    host,
    path: req.url
  }, (response) => {
    response.pipe(res);
  });
});

2 websocket代理

代码语言:javascript
复制
server.on('upgrade', (req, res, head) => {
  const [host, port] = getHostAndPort(req);
  const client = net.connect({
    port,
    host,
  });
  client.on('connect', () => {
    client.write(`GET ${req.url}\r\n` + buildHeaders(req.headers) + '\r\n');
    res.pipe(client);
    client.pipe(res);
  });
  client.on('error', () => {
    res.destroy();
  })
});

3 https代理

代码语言:javascript
复制
server.on('connect', (req, client, head) => {
  const [host, port] = getHostAndPort(req);
  const socket = net.connect(port, host, () => {
    client.write('HTTP/1.1 200 Connection Established\r\n' +
                    'Proxy-agent: Node.js-Proxy\r\n' +
                    '\r\n');
    socket.write(head);
    socket.pipe(client);
    client.pipe(socket);
  });
});

最后写一个https服务器测试

代码语言:javascript
复制
var https = require('https');
var fs = require('fs');
const WebSocket = require('ws');

var options = {
  key: fs.readFileSync('./files/server-key.pem'),
  ca: [fs.readFileSync('./files/ca-cert.pem')],
  cert: fs.readFileSync('./files/server-cert.pem')
};

const server = https.createServer(options,function(req,res){
  res.end('ok');
}).listen(11111);

同样我们也可以写一个websocket服务器进行测试,写完后把浏览器的代理改成代理服务器的地址就可以了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程杂技 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档