可以代理苹果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. 03 重定向,请求转发,cookie,session

    重定向: /* 之前的写法 response.setStatus(302); response.setHeader("Location", "login_success. ...

  2. 【HAOI2015】 T1

    为什么感觉越来越迷了X. X 原题: 有一棵点数为 N 的树,树边有边权.给你一个在 0~N 之内的正整数 K,你要在这棵树中选择 K 个点,将其染成黑色,并将其他的N-K 个点染成白色.将所有点染色 ...

  3. 芯灵思SinlinxA33开发板Linux内核定时器编程

    开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 Linux 内核定时器是内核 ...

  4. centos7升级Python版本后,yum不能正常使用

    python升级方法,使用源码编译安装即可,prefix=/usr/local/bin/python3 执行yum list,提示/usr/bin/yum 报错 我是直接在Python2.7的基础上又 ...

  5. hasura graphql-engine v1.0.0-alpha30 功能试用

    hasura graphql-engine v1.0.0-alpha30 有好多新的功能的添加 环境准备 docker-compose 文件 version: '3.6' services: post ...

  6. Abstract Data Types in C

    Interface declares operations, not data structure Implementation is hidden from client (encapsulatio ...

  7. C# Monitor的Wait和Pulse方法使用详解

    [转载]http://blog.csdn.net/qqsttt/article/details/24777553 Monitor的Wait和Pulse方法在线程的同步锁使用中是比较复杂的,理解稍微困难 ...

  8. Java中的数组与集合

    此文转载自:http://student-lp.iteye.com/blog/2082362 在java编程的过程中,我们不能确定某一类型的对象到底会需要多少,为了解决这个问题,java提供了容纳对象 ...

  9. Java Scanner学习记录

    1. Java.util.Scanner可以用来从键盘获取输入 Scanner.next()  只能读取字符,遇到任何的符合都不会输出 Scanner.nextLine()  会完全按照用户输入的st ...

  10. 使用 FreeCAD 打开 KiCad 用于制作外壳

    使用 FreeCAD 打开 KiCad 用于制作外壳 先看导入后的结果. 步骤: 安装 FreeCAD 安装 KiCad StepUp Mod Addon 重启 FreeCAD(非常重要,不重启不生效 ...