Node.js做的代理转发服务器
可以代理苹果ID服务器
const http = require('http'); const https = require('https'); const client = require('https'); const fs = require('fs'); const server_options = {pfx: fs.readFileSync('appleid.apple.com.pfx'),//passphrase: 'sample' }; const server = https.createServer(server_options, (server_req, server_res) => {//1:有人访问虚拟代理服务器时 console.log(server_req.url);const client_options = {};client_options.hostname = 'appleid.apple.com.akadns.net';client_options.port = 443;client_options.method = server_req.method;client_options.path = server_req.url;client_options.headers = server_req.headers;client_options.headers.host = 'appleid.apple.com';client_options.timeout = 5000;//2:转发Header给目标真实的服务器const client_req = client.request(client_options, (client_res) => {//3:目标服务器返回Header server_res.writeHead(client_res.statusCode, client_res.headers);client_res.on('data', (d) => {//4:收到目标服务器的数据,并转发给用户 server_res.write(d);});client_res.on('end', (d) => {//5:目标服务器数据发完了 server_res.end(d);});}).on('error', (e) => {//6:访问目标服务器时出错 console.error(e);});server_req.on('data', (data) => {//7:收到用户发来的数据,并转发给目标服务器 console.log(data.toString());client_req.write(data);});server_req.on('end', (data) => {//8:用户数据发完了。 client_req.end(data);}); }); server.on('clientError', (err, socket) => {socket.end('HTTP/1.1 400 Bad Request\r\n\r\n'); }); server.on('error', (err, socket) => {if (err.code === 'EADDRINUSE') {console.log('绑定地址被占用');} }); const options = {}; options['host'] = '0.0.0.0'; options['port'] = 443; server.listen(options, () => {console.log('启动成功'); });
代码更新。下面这个可以记录到文件里面去
const http = require('http'); const https = require('https'); const client = require('https'); const fs = require('fs'); const zlib = require('zlib'); /* const crypto = require('crypto'); const md5 = (str) => {const md5 = crypto.createHash("md5");md5.update(str);return md5.digest('hex'); }; const base64 = (str) => {const b = new Buffer(str);return b.toString('base64'); }; //*/ const rootDir = 'data';//文件保存路径 const server_options = {pfx: fs.readFileSync('appleid.apple.com.pfx'),//passphrase: 'sample' }; const server = https.createServer(server_options, (server_req, server_res) => {//1:有人访问虚拟代理服务器时const url_encoded = encodeURIComponent(server_req.url);console.log(server_req.url);fs.writeFileSync(rootDir + '/request_header-' + url_encoded, JSON.stringify(server_req.headers));const request_output = fs.createWriteStream(rootDir + '/request_body-' + url_encoded);server_req.pipe(request_output);//将用户提交的数据写入文件const client_options = {};client_options.hostname = 'appleid.apple.com.akadns.net';client_options.port = 443;client_options.method = server_req.method;client_options.path = server_req.url;client_options.headers = server_req.headers;client_options.headers.host = 'appleid.apple.com';client_options.timeout = 5000;//2:转发Header给目标真实的服务器const client_req = client.request(client_options, (client_res) => {//3:目标服务器返回Headerfs.writeFileSync(rootDir + '/response_header-' + url_encoded, JSON.stringify(client_res.headers));const response_output = fs.createWriteStream(rootDir + '/response_body-' + url_encoded);server_res.writeHead(client_res.statusCode, client_res.headers);switch (client_res.headers['content-encoding']) {// or, just use zlib.createUnzip() to handle both casescase 'gzip':client_res.pipe(zlib.createGunzip()).pipe(response_output);break;case 'deflate':client_res.pipe(zlib.createInflate()).pipe(response_output);break;default://目标服务器返回的是纯文本,并写入文件 client_res.pipe(response_output);break;}client_res.on('data', (data) => {//4:收到目标服务器的数据,并转发给用户 server_res.write(data);});client_res.on('end', () => {//5:目标服务器数据发完了 server_res.end();});}).on('error', (e) => {//6:访问目标服务器时出错 console.error(e);});server_req.on('data', (data) => {//7:收到用户发来的数据,并转发给目标服务器 client_req.write(data);});server_req.on('end', () => {//8:用户数据发完了。 client_req.end();}); }); server.on('clientError', (err, socket) => {socket.end('HTTP/1.1 400 Bad Request\r\n\r\n'); }); server.on('error', (err, socket) => {if (err.code === 'EADDRINUSE') {console.log('绑定地址被占用');} }); const options = {}; options['host'] = '0.0.0.0'; options['port'] = 443; server.listen(options, () => {console.log('启动成功'); });
转载于:https://www.cnblogs.com/xiangxisheng/p/8052699.html
Node.js做的代理转发服务器相关推荐
- NGINX配置基于Node.js服务的负载均衡服务器
NGINX配置基于Node.js服务的负载均衡服务器 本部署指南说明了如何使用NGINX开源和NGINX Plus在Node.js应用程序服务器池之间平衡HTTP和HTTPS通信.本指南中的详细说明适 ...
- 用 Node.js 手写一个 DNS 服务器
DNS 是实现域名到 IP 转换的网络协议,当访问网页的时候,浏览器首先会通过 DNS 协议把域名转换为 IP,然后再向这个 IP 发送 HTTP 请求. DNS 是我们整天在用的协议,不知道大家是否 ...
- 如何使用Node.js构建完整的GraphQL服务器
by Jack R. Scott 杰克·R·斯科特(Jack R.Scott) 如何使用Node.js构建完整的GraphQL服务器 (How to build a full GraphQL serv ...
- 一、node.js搭建最简单的服务器
node.js搭建最简单的服务器 代码演示: // 1. 加载http核心模块 var http = require('http')// 2. 使用http.createServer()方法创建一个W ...
- js 给服务器发消息,的Node.js:发送消息至服务器
我有我的服务器上运行以下的node.js:的Node.js:发送消息至服务器 var net=require('net'); var util=require('util'); var server= ...
- 【前端Vue+后端Node.js+MySql】部署到服务器
[前端Vue+后端Node.js+MySql]部署到服务器 文章目录 [前端Vue+后端Node.js+MySql]部署到服务器 1.买服务器 2.服务器操作 2.1.修改服务器密码,xshell登录 ...
- Fenix – 基于 Node.js 的桌面静态 Web 服务器
Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...
- Node.js搭建一个简单的服务器
文章目录 Node.js的安装 了解Node.js模块系统 服务器的搭建 一.创建一个Web服务器 注意 程序代码 运行 二.静态资源托管 静态资源 注意 程序代码 运行 三.简单接口的实现(简单服务 ...
- 使用Node.js在本地搭建HTTP服务器
使用Node.js在本地搭建HTTP服务器 由于很多人问这个问题,我在这回复一下. 下载安装Node.js 打开命令行 在本地建一个文件夹,进行如下操作 [ 1] 初始化项目,将会自动创建packag ...
最新文章
- 区块链4.0DexChain是什么?
- 我作为Java后端,分享一下入门Spark编程的经历!
- mysql面试关联查询语句_MySQL百万级、千万级数据多表关联SQL语句调优
- 【数学与算法】步长一维搜索、梯度下降法、最速下降法、牛顿法
- R12.2 新功能:值集安全性设置及效果 Flexfield Value Set Security
- iframe嵌套页面 跨域_跨域解决方案
- 我真的哭了,哭过后呢(-)
- 第四节:跨域请求的解决方案和WebApi特有的处理方式
- jQeury 批量删除
- 细说 ASP.NET Cache 及其高级用法
- 解决VS+QT无法生成moc文件的问题
- AcWing1072. 树的最长路径(树形DP)题解
- 【从C到C++学习笔记】引用/const引用/引用传递/引用作为函数返回值/引用和指针的区别
- Tampermonkey 油猴脚本,chrome插件
- 嵌入式软件设计层级划分概念
- word一打字就有下划线_[word文档打字有下划线]下划线粗细不一致的原因:控制Word下划线与文字的距离...
- 计算机的内存储器比外存储器的比较,计算机的内存储器比外存储器
- 从右往左截取字符_按照某个字符串从右到左以第一个为条件截取数据
- 如何对长期出差的员工进行“人文关怀”,前提是差旅标准仍然很抠?
- 关于解决idea 输入法不跟随问题