Node.js做的代理转发服务器
生活随笔
收集整理的這篇文章主要介紹了
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:目標服務器返回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做的代理转发服务器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: robotframwork接口测试(五)
- 下一篇: NBA之单例模式