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

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

作者头像
theanarkh
发布于 2021-01-12 06:57:53
发布于 2021-01-12 06:57:53
39900
代码可运行
举报
文章被收录于专栏:原创分享原创分享
运行总次数:0
代码可运行

工具函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Whistle 实现原理 —— 从 0 开始实现一个抓包工具
导语 通过这篇文章可以大致了解 Whistle 的实现原理,并学习如何实现一个简单的抓包调试工具。 项目 Github 地址:https://github.com/avwo/whistle Whistle 是基于 Node.js 实现的跨平台 Web 抓包调试(HTTP)代理,主要功能: 实时抓包:支持 HTTP、HTTPS、HTTP2、WebSocket、TCP 等常见 Web 请求的抓包; 修改请求响应:与一般抓包调试工具采用断点的方式不同,Whistle 采用类似系统 host 的配置规则方式; 扩展
用户1097444
2022/06/29
1.3K0
Whistle 实现原理 —— 从 0 开始实现一个抓包工具
通过nodejs源码理解http connect的原理和实现
分析http connect实现之前我们首先看一下为什么需要http connect方法或者说他出现的背景。connect方法主要用于代理服务器的请求转发。我们看一下传统http服务器的工作原理。
theanarkh
2020/11/26
2.3K0
通过nodejs源码理解http connect的原理和实现
一探究竟!Whistle拦截HTTPS是如何实现的?
导语 | 本文主要介绍Whistle的实现原理,通过这篇文章读者可以了解Whistle的具体实现过程,并且自己也可以实现一个简单的抓包调试工具。 项目Github地址:https://github.com/avwo/whistle Whistle是基于Node实现的跨平台Web抓包调试(HTTP)代理,主要功能: 实时抓包:支持HTTP、HTTPS、HTTP2、WebSocket、TCP等常见Web请求 修改请求响应:与一般抓包调试工具采用断点的方式不同,Whistle采用类似系统host的配置规则方
腾讯云开发者
2021/12/22
2.6K0
实现nodejs进程间通信
对于有继承关系的进程,nodejs本身为我们提供了进程间通信的方式,但是对于没有继承关系的进程,比如兄弟进程,想要通信最简单的方式就是通过主进程中转,类似前端框架中子组件通过更新父组件的数据,然后父通知其他子组件。因为nodejs内置的进程间通信需要经过序列化和反序列化,所以这种方式可能会带来一定的性能损耗,而且在实现上也比较麻烦。今天介绍的是实现兄弟进程通信的另外一种方式,在windows上使用命名管道,在非windows上使用unix域,另外本文还会介绍基于tcp的远程进程通信的实现。下面具体介绍一下设计和实现。
theanarkh
2020/11/10
1.4K0
实现nodejs进程间通信
Node·七天学会 NodeJS
以上程序使用 fs.readFileSync 从源路径读取文件内容,并使用 fs.writeFileSync 将文件内容写入目标路径。
数媒派
2022/12/01
2.1K0
彻底搞懂HTTP协议 - 天天造轮子
等几个阶段,当然如果详细拆分每个阶段还会在再次被细分,所谓细节决定成败,你谈的细节越多就说明你的知识越系统。唬住唬不住就看你了,不过这确实是一道非常好的考题。
玖柒的小窝
2021/12/08
2790
彻底搞懂HTTP协议 - 天天造轮子
【nodejs每日一讲】nodejs的进程间通信
之前提了一个问题:nodejs中如何实现兄弟进程间的通信,大家分别列举了redis、ZooKeeper,MessageChannel,还有linux操作系统提供的共享内存等一系列的进程间通信方式。所以今天来分享一下到底如何实现nodejs的进程间通信。这里的讨论只限于linux系统,本机的进程。情况分为两种:父子进程,兄弟进程。
theanarkh
2021/01/24
1.1K0
利用whistle调试WebSocket和Socket请求
whistle v1.6.0 (Github地址:https://github.com/avwo/whistle) 开始支持WebSocket和一般Socket的抓包、构造请求、以及修改发送或接收的数
IMWeb前端团队
2017/12/28
4.7K0
利用whistle调试WebSocket和Socket请求
用nodejs实现http代理服务器
这段代码创建了一个 HTTP 代理服务器和一个 TCP 代理服务器,可以同时处理 HTTP 和 HTTPS 请求。当收到一个 HTTP 请求时,它会解析请求 URL,并创建一个向目标服务器的 HTTP 请求。当收到一个 HTTPS 请求时,它会解析请求 URL,并创建一个向目标服务器的 TCP 连接,然后将客户端发送的数据转发给目标服务器,并将目标服务器返回的数据转发给客户端。
用户8703799
2023/05/19
1.9K0
Fiddler助力微信开发调试
Fiddler是一个非常强大的代理工具,可以让你的前端开发调试更加方便。下面介绍在微信开发调试方面的应用。
顾翔
2019/12/12
1.5K0
Fiddler助力微信开发调试
手动实现nodejs代理服务器
最近看到这样一个题目,根据反向代理服务器的原理用nodejs实现一个代理服务器,要求:
挥刀北上
2019/07/19
4.8K0
手动实现nodejs代理服务器
Nodejs创建http客户端及代理服务器
nodejs除了可以通过http模块创建服务器,还能创建客户端,类似于浏览器那样很轻松的去向别的服务器发送请求并获取响应数据。
前端_AWhile
2019/08/29
2.3K0
《Node.js》核心技术教程(笔记)
模块化是一种设计思想,利用模块化可以把一个非常复杂的系统结构细化到具体的功能点,每个功能点看作一个模块,然后通过某种规则把这些小的模块组合到一起,构成模块化系统。
爱学习的程序媛
2022/04/07
1.8K0
《Node.js》核心技术教程(笔记)
Nodejs基础:stream模块入门介绍与使用
nodejs的核心模块,基本上都是stream的的实例,比如process.stdout、http.clientRequest。
全栈程序员站长
2022/07/20
5590
学习 node.js 第八天:Socket 通讯「建议收藏」
一般来讲,HTTP 是基于文本的“单向”通讯机制。这里所谓的“单向”,乃相对于“双向”而言,因为 HTTP 服务器只需根据请求返还恰当的 HTML 给客户端即可,不涉及客户端向服务端的通讯。这种单向的机制比较简单,对网络质量要求也不高。而更多的场景则是需要可靠、稳定的端到端连接。一般这种服务是实时的、有态的而且是长连接,长连接则暗示两段须达致相向通讯的能力,也就说是服务端客户端两者间能够实时地相互间通信。毫无疑问,能够实时通信的服务器正是我们对服务器基本要求之一。区别于 HTTP 服务器以 HTTP 为通讯协议, 实时服务器一般采用较为底层的 TCP/IP 为协议通讯,实现了“套字节 Socket”的双向机制。
全栈程序员站长
2022/07/01
7980
Nodejs基础:stream模块入门介绍与使用
模块概览 nodejs的核心模块,基本上都是stream的的实例,比如process.stdout、http.clientRequest。 对于大部分的nodejs开发者来说,平常并不会直接用到str
IMWeb前端团队
2017/12/28
1.1K0
流动图书馆小程序实战
流动图书馆是一个图书漂流和借阅工具,旨在共享闲置图书,并链接趣味相投的小伙伴。
疯狂的小程序
2018/01/25
2.2K1
搭建简易的物联网服务端和客户端-Nodejs_net(二)
服务端慢慢完善中,一步一步记录学习 代码地址:https://github.com/klren0312/stm32_wifi 2017.3.17 搭建简易的物联网服务端和客户端目录 Nodejs TCP 服务端和客户端 用客户端模拟STM32发送过来的字符串。主要是为了解决对字符串的处理。 1.客户端代码 const net = require('net') const client = net.connect({port:4001},() => {//向服务端发送 console.
治电小白菜
2020/08/25
4990
Nodejs进阶:核心模块https 之 如何优雅的访问12306
IMWeb前端团队
2018/01/08
1.6K0
一篇文章构建你的 NodeJS 知识体系(W字长文)
最近读《重学前端》,开篇就是让你拥有自己的知识体系图谱,后续学的东西补充到相应的模块,既可以加深对原有知识的理解,又可以强化记忆,很不错的学习方案。
coder_koala
2020/08/27
1.9K0
推荐阅读
相关推荐
Whistle 实现原理 —— 从 0 开始实现一个抓包工具
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文