可以代理苹果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. 【HDOJ1069】【动态规划】

    http://acm.hdu.edu.cn/showproblem.php?pid=1069 Monkey and Banana Time Limit: 2000/1000 MS (Java/Othe ...

  2. hdu6440 Dream(费马小定理)

    保证 当  n^p=n(mod p) 是成立 只要保证n*m=n*m(mod p); #include<bits/stdc++.h> using namespace std; int ma ...

  3. #505 1&2 A-C 后面未完成

    A. Doggo Recoloring 题目意思是给一个字符串(都是小写字母),如果有两个字符相同,我们可以将这两个字符变成其他字符,问能不能使字符串字母都一样 思路  有两个相同字符时就能:  字符 ...

  4. Linux命令速查手册

    Others make 通过外部编译器的,比如linux中的gcc集来编译源码 获取Makefile文件的命令触发编译 curl -X GET/POST -I 获取head curl有cache 查看 ...

  5. 《DSP using MATLAB》Problem 5.3

    这段时间爬山去了,山中林密荆棘多,沟谷纵横,体力增强不少. 代码: %% +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  6. 【java多线程】线程状态分析

    一.java线程的状态 NEW: 新建状态,线程对象已经创建,但尚未启动 RUNNABLE:就绪状态,可运行状态,调用了线程的start方法,已经在java虚拟机中执行,等待获取操作系统资源如CPU, ...

  7. 【javaScript】数组的相关操作

    数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长 ...

  8. cget cmake 包管理工具

    cget 是一个方便的进行cmake 包下载以及安装的工具 包含的特性 非侵入,无需编写特殊钩子就可以使用cmake 开箱即用, 由于使用了标准的基于cmake的方式,直接可以使用基于cmkae 的软 ...

  9. C# HttpClient请求Webapi帮助类

    引用 Newtonsoft.Json // Post请求 public string PostResponse(string url,string postData,out string status ...

  10. c# AddMonths,你了解吗?

    AddMonths:找到对应月的day,如果没有则取最后一个day var d1 = new DateTime(2017, 6, 30); var d2 = d1.AddMonths(-1);//20 ...