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:目标服务器返回Header
fs.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 cases
case '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('启动成功');
});
Node.js做的代理转发服务器的更多相关文章
- 使用node.js实现反向代理
一. 反向代理的应用场景 1. 静态资源与动态资源分离 e.g. 图片服务器 2. AJAX跨域访问 3. 搭建统一服务网关接口 二. 使用node.js实现反向代理 1. 安装http-proxy模 ...
- 用Node.js原生代码实现静态服务器
---恢复内容开始--- 后端中服务器类型有两种 1. web服务器[ 静态服务器 ] - 举例: wamp里面www目录 - 目的是为了展示页面内容 - 前端: nginx 2. 应用级服务器[ a ...
- Fenix – 基于 Node.js 的桌面静态 Web 服务器
Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...
- Centos 7 上使用nginx为Node.js配置反向代理时错误:(13: Permission denied) while connecting to upstream
错误来源:Centos 7 上使用nginx为Node.js配置反向代理时产生(13: Permission denied) while connecting to upstream的错误 nginx ...
- node.js中net模块创建服务器和客户端(TCP)
node.js中net模块创建服务器和客户端 1.node.js中net模块创建服务器(net.createServer) // 将net模块 引入进来 var net = require(" ...
- 安装Nginx并为node.js设置反向代理
最近看了反向代理和正向代理的东西,想到自己的node.js服务器是运行在3333端口的,也没有为他设置反向代理,node.js项目的一些静态文件是完全可以部署在Nginx上,以减少对node.js的请 ...
- 初涉node.js做微信测试公众号一路填坑顺便发现个有趣的其他漏洞
[微信测试公众号] 半年前耍着玩搭起来的“微信简历”,是LAMP版的,很皮毛. 微信的官方文档在这 http://mp.weixin.qq.com/wiki/index.php 1.获取access ...
- Node.js 教程 03 - 创建HTTP服务器
前言: 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个"接收 HTTP 请 ...
- 用node.js实现简单的web服务器
node.js实现web服务器还是比较简单的,我了解node.js是从<node入门>开始的,如果你不了解node.js也可以看看! 我根据那书一步一步的练习完了,也的确大概了解了node ...
随机推荐
- 《DSP using MATLAB》Problem 6.13
代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...
- 线程---同步(synchronized)
实现线程同步的一种方式介绍: 思路: 首先,需要被协调的类,先实现线程,并重写run方法 然后,在被协调的类中私有化控制器,控制器实例化,由构造器带入. 其次,由控制器对象具体负责调用. 举例:循环输 ...
- <jsp:include>动作元素,附:最易出错的一点
先定义一个date.jsp,再定义一个main.jsp.用<jsp:include plage = "相对url地址" flush = "true"> ...
- 【java高级编程】jdk自带事件模型编程接口
事件类 java.util.EventObject java.beans.PropertyChangeEvent 事件监听接口 java.util.EventListener java.beans.P ...
- 访问 iframe 内部控件方法
方法虽然简单,但是经常忘记,网上一查,很多方法兼容性都有问题,这段代码至少兼容IE和Chrome setInterval(function(){ document.getElementById('ma ...
- java的数组和arraylist
1.数组 1.0 一开始就错了 int a[8]; //没有像C在内存中开辟了8个区域 改: int a[] = {1,2,3} ; System.out.println(a.length); ...
- CONTINUOUS MIGRATION
转自:https://pgloader.io/blog/continuous-migration/ After having been involved in many migration proje ...
- Singer 学习九 运行&&开发taps、targets (四 开发target)
singer 的target 需要从stdin 的行数据,同时处理schema.record.state 消息 指南 schema 需要进行关联stream records 数据的校验 一旦Targe ...
- MySQL管理实务处理
事物处理可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么全不执行. 事务:指一组sql语句 回退:指撤销指定的sql语句过程 提交:将未存储的sql语句结果写入数据库表 保留点 ...
- Linux+eclipse+maven+tomcat7小项目实战
一.准备工作:CentOS6.5安装linux,maven,tomcat7,eclipse 二.在linux中打开eclipse,创建一个maven项目 修改web.xml 打开Navigator视图 ...