IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> nodejs搭建http(s)中转服务 -> 正文阅读

[网络协议]nodejs搭建http(s)中转服务

1. 背景

本文主要介绍如何使用nodejs搭建http(s)中转服务,本文所写内容仅用于学习为目的,请勿作为其他用途使用。阅读本文之前,请先了解:

  1. 如何自建证书,可以参考这里
  2. 如何使用 nodejs 创建http(s) 服务器
  3. 如何使用 nodejs 创建 tls 服务器
  4. 学习 http 协议的格式及请求类型

2. 实现步骤

2.1 http中转思路

  1. 创建 http(s) 服务器作为 proxy server
  2. 监听request请求
  3. 通过 node-fetch 发送并取到数据之后将其返回给客户端即可

2.2 https中转思路

  1. 创建 http(s) 服务器作为 proxy server
  2. 创建 tls 服务器,tls server
  3. 劫持所有请求到 proxy server
  4. 监听connect请求,将所有 connect 请求,全部发送到 tls server
  5. tls server根据客户端请求,使用 axios 发送请求到目标服务器
  6. 通过 node-fetch 发送并取到数据之后,将其返回给 proxy server 的 socket,这样客户端便能拿到数据
  7. 客户端拿到了目标服务器的内容,然后正常显示其内容

3 常见问题

3.1 websocket

针对websocket需做特殊处理,请学习websocket协议。

3.2 二次转发

请学习connect请求的格式。

3.3 内容被截断

请关注 content-length 响应头。

3.4 关于响应数据的压缩

请学习 zlib 库的使用方法。

示例:

const zlib = require('zlib')

async function compressResonpseData (contentEncoding, respBuffer) {
    const NAME = 'compressResonpseData'
    return new Promise((resolve, reject) => {
      let zlibStream = null
      const respDataStream = Readable.from([respBuffer])
      let compressedData = Buffer.alloc(0)
      const zlibCallback = err => {
        if (err) return reject(`${NAME} 管道传送失败: ${err.message}`)
      }
      if (/\bdeflate\b/.test(contentEncoding)) {
        zlibStream = pipeline(
          respDataStream,
          zlib.createDeflate(),
          zlibCallback
        )
      } else if (/\bgzip\b/.test(contentEncoding)) {
        zlibStream = pipeline(respDataStream, zlib.createGzip(), zlibCallback)
      } else if (/\bbr\b/.test(contentEncoding)) {
        zlibStream = pipeline(
          respDataStream,
          zlib.createBrotliCompress(),
          zlibCallback
        )
      }
      if (zlibStream) {
        zlibStream
          .on('data', data => {
            compressedData = Buffer.concat([compressedData, data])
          })
          .on('end', () => {
            resolve(compressedData)
          })
      } else {
        resolve(respBuffer)
      }
    })
  }

3.5 二级转发请不要使用axios

axios 对代理的支持有些问题,此处推荐node-fetch

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 23:16:55  更:2021-07-14 23:18:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/29 0:54:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码