可以代理苹果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做的代理转发服务器相关推荐

  1. NGINX配置基于Node.js服务的负载均衡服务器

    NGINX配置基于Node.js服务的负载均衡服务器 本部署指南说明了如何使用NGINX开源和NGINX Plus在Node.js应用程序服务器池之间平衡HTTP和HTTPS通信.本指南中的详细说明适 ...

  2. 用 Node.js 手写一个 DNS 服务器

    DNS 是实现域名到 IP 转换的网络协议,当访问网页的时候,浏览器首先会通过 DNS 协议把域名转换为 IP,然后再向这个 IP 发送 HTTP 请求. DNS 是我们整天在用的协议,不知道大家是否 ...

  3. 如何使用Node.js构建完整的GraphQL服务器

    by Jack R. Scott 杰克·R·斯科特(Jack R.Scott) 如何使用Node.js构建完整的GraphQL服务器 (How to build a full GraphQL serv ...

  4. 一、node.js搭建最简单的服务器

    node.js搭建最简单的服务器 代码演示: // 1. 加载http核心模块 var http = require('http')// 2. 使用http.createServer()方法创建一个W ...

  5. js 给服务器发消息,的Node.js:发送消息至服务器

    我有我的服务器上运行以下的node.js:的Node.js:发送消息至服务器 var net=require('net'); var util=require('util'); var server= ...

  6. 【前端Vue+后端Node.js+MySql】部署到服务器

    [前端Vue+后端Node.js+MySql]部署到服务器 文章目录 [前端Vue+后端Node.js+MySql]部署到服务器 1.买服务器 2.服务器操作 2.1.修改服务器密码,xshell登录 ...

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

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

  8. Node.js搭建一个简单的服务器

    文章目录 Node.js的安装 了解Node.js模块系统 服务器的搭建 一.创建一个Web服务器 注意 程序代码 运行 二.静态资源托管 静态资源 注意 程序代码 运行 三.简单接口的实现(简单服务 ...

  9. 使用Node.js在本地搭建HTTP服务器

    使用Node.js在本地搭建HTTP服务器 由于很多人问这个问题,我在这回复一下. 下载安装Node.js 打开命令行 在本地建一个文件夹,进行如下操作 [ 1] 初始化项目,将会自动创建packag ...

最新文章

  1. 区块链4.0DexChain是什么?
  2. 我作为Java后端,分享一下入门Spark编程的经历!
  3. mysql面试关联查询语句_MySQL百万级、千万级数据多表关联SQL语句调优
  4. 【数学与算法】步长一维搜索、梯度下降法、最速下降法、牛顿法
  5. R12.2 新功能:值集安全性设置及效果 Flexfield Value Set Security
  6. iframe嵌套页面 跨域_跨域解决方案
  7. 我真的哭了,哭过后呢(-)
  8. 第四节:跨域请求的解决方案和WebApi特有的处理方式
  9. jQeury 批量删除
  10. 细说 ASP.NET Cache 及其高级用法
  11. 解决VS+QT无法生成moc文件的问题
  12. AcWing1072. 树的最长路径(树形DP)题解
  13. 【从C到C++学习笔记】引用/const引用/引用传递/引用作为函数返回值/引用和指针的区别
  14. Tampermonkey 油猴脚本,chrome插件
  15. 嵌入式软件设计层级划分概念
  16. word一打字就有下划线_[word文档打字有下划线]下划线粗细不一致的原因:控制Word下划线与文字的距离...
  17. 计算机的内存储器比外存储器的比较,计算机的内存储器比外存储器
  18. 从右往左截取字符_按照某个字符串从右到左以第一个为条件截取数据
  19. 如何对长期出差的员工进行“人文关怀”,前提是差旅标准仍然很抠?
  20. 关于解决idea 输入法不跟随问题

热门文章

  1. Ubuntu中的默认shell
  2. Python 列表(数组)初识
  3. Shell--shell中的判断
  4. 【洛谷】【动态规划/二维背包】P1855 榨取kkksc03
  5. 受控组件和不受控组件的区别
  6. hdu 4676 Sum Of Gcd 莫队+phi反演
  7. linux 下查看log实时输出
  8. Ubuntu 16.04 LTS下编译GPU版tensorflow
  9. 扫描自己进入VR中 SLAM Scan 3D引擎将做到
  10. Autodesk Cloud Accelerator Program 开始报名