可以代理苹果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做的代理转发服务器的更多相关文章

  1. 使用node.js实现反向代理

    一. 反向代理的应用场景 1. 静态资源与动态资源分离 e.g. 图片服务器 2. AJAX跨域访问 3. 搭建统一服务网关接口 二. 使用node.js实现反向代理 1. 安装http-proxy模 ...

  2. 用Node.js原生代码实现静态服务器

    ---恢复内容开始--- 后端中服务器类型有两种 1. web服务器[ 静态服务器 ] - 举例: wamp里面www目录 - 目的是为了展示页面内容 - 前端: nginx 2. 应用级服务器[ a ...

  3. Fenix – 基于 Node.js 的桌面静态 Web 服务器

    Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...

  4. 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 ...

  5. node.js中net模块创建服务器和客户端(TCP)

    node.js中net模块创建服务器和客户端 1.node.js中net模块创建服务器(net.createServer) // 将net模块 引入进来 var net = require(" ...

  6. 安装Nginx并为node.js设置反向代理

    最近看了反向代理和正向代理的东西,想到自己的node.js服务器是运行在3333端口的,也没有为他设置反向代理,node.js项目的一些静态文件是完全可以部署在Nginx上,以减少对node.js的请 ...

  7. 初涉node.js做微信测试公众号一路填坑顺便发现个有趣的其他漏洞

    [微信测试公众号] 半年前耍着玩搭起来的“微信简历”,是LAMP版的,很皮毛. 微信的官方文档在这 http://mp.weixin.qq.com/wiki/index.php 1.获取access ...

  8. Node.js 教程 03 - 创建HTTP服务器

    前言: 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi. 从这个角度看,整个"接收 HTTP 请 ...

  9. 用node.js实现简单的web服务器

    node.js实现web服务器还是比较简单的,我了解node.js是从<node入门>开始的,如果你不了解node.js也可以看看! 我根据那书一步一步的练习完了,也的确大概了解了node ...

随机推荐

  1. html css input定位 文本框阴影 灰色不可编辑

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 监控页面后退前进,浏览器文档加载事件之pageshow、pagehide

    https://www.cnblogs.com/milo-wjh/p/6811868.html http://www.runoob.com/jsref/event-onpageshow.html on ...

  3. eventEmitter

    wade-mac:fin_server_invest mac$ node > var events =require('events') undefined > var eventEmit ...

  4. Java中的包学习笔记

    一.总结 1.引入包的概念的原因和包的作用比如有多个人开发一个大型程序,A定义了一个Math.java类,B也定义了一个Math.java类,它们放在不同目录,使用的时候也是用目录来区分,包实际上就是 ...

  5. Announcing HashiCorp Consul + Kubernetes

    转自:https://www.hashicorp.com/blog/consul-plus-kubernetes We're excited to announce multiple features ...

  6. jquery trigger函数和triggerHandler函数的对照

    一句话的差别就是:trigger will bubbling jQuery events (not default DOM events) and triggerHnadler will not do ...

  7. 算法(第4版) (Robert Sedgewick / Kevin Wayne 著)

    第1章 基础 第2章 排序 第3章 查找 第4章 图 第5章 字符串 第1章 基础 public class Bag<T> : IEnumerable<T> { ]; ; pu ...

  8. git刚初始化项目的操作

    # Command line instructions ## Git global setup git config --global user.name "iback" git ...

  9. Spring Cloud Eureka 服务发现与消费

    服务发现与消费,其服务发现的任务是由Eureka的客户端完成,而服务的消费任务由Ribbon.JerseyClient等完成,Ribbon是一个基于HTTP和TCP的客户端负载均衡器:使用Jersey ...

  10. 浅析Hyperledger Fabric共识算法 摘自http://www.cocoachina.com/blockchain/20180829/24728.html

    Hyperledger Fabric共识算法 区块链系统是一个分布式架构,交易账本信息由各个节点管理,组成一个庞大的分布式账本.在分布式系统中,各个节点收到的交易信息的顺序可能存在差异(例如,网络延迟 ...