看到node.js的httpServer和http.request,第一个想法居然是可以用它做一个代理服务器
下面代码,实现了代理的基本功能,通过网络的代理设置将你的浏览器的请求转到这个httpServer上,其接收到浏览器的http请求,转发到目的服务器,再将收到的数据转移到浏览器~~~就一二道贩子。

var _http = require('http'),
_util = require('util'),
//记录当前是第几个请求
number = 0;
 
_http.createServer(function(req, res){
number++;
res.number = number;
var headers = req.headers,
post = '',
url = req.url; //_url.parse(req.url, true)--解析url
console.log('\n======\n[' + number + ']--http--start--[' + req.method + ']' + url);
if(req.method == 'POST'){
//接收post
req.on('data', function(chunk){
post += chunk;
});
req.on('end', function(){
post = _querystring.parse(post);
httpRequest(res, headers, url, post);
});
}else{
httpRequest(res, headers, url);
}
}).listen(3333);
 
console.log('http server start at parth 3333\n\n\n');
 
/*
* 发送请求
*/
function httpRequest(mainRes, headers, url, post){
var host = headers.host;
host = host.split(':');
var options = {
host : host[0],
port : (host[1] ? host[1] : '80'),
path : url,
method : (post ? 'POST' : 'GET'),
headers : headers
};
//去掉gzip
delete options.headers['accept-encoding'];
console.log('[' + mainRes.number + ']----start http.request-- options:\n%s\n', _util.inspect(options));
 
var req_ = _http.request(options, function(res_){
var status_ = res_.statusCode,
headers_ = res_.headers,
data = '';
console.log('[' + mainRes.number + ']----export http.request-(' + status_ + ')-headers:%s',
_util.inspect(headers_));
 
//写header
mainRes.writeHead(status_, headers_);
 
var encoding = 'utf8';
//根据数据类型确定编码方式
if(headers_['content-type'] && (headers_['content-type'].indexOf('image') >= 0
|| headers_['content-type'].indexOf('application') >= 0
|| headers_['content-type'].indexOf('audio') >= 0
|| headers_['content-type'].indexOf('video') >= 0)){
encoding = 'binary';
}
res_.setEncoding(encoding);
//接收数据,转给原请求
res_.on('data', function(d){
console.log('data-------' + d.length);
var b = new Buffer(d, encoding);
mainRes.write(b, encoding);
});
res_.on('end', function(){
//请求结束
mainRes.end();
console.log('[' + mainRes.number + ']--------http.request---end----');
});
});
req_.on('error', function(e){
console.log([' + mainRes.number + '] + '----ERROR----problem with request: ' + e.message);
});
//发送post
if(post){
req_.write(_querystring.stringify(post));
}
req_.end();
}

当然,这段代码仅仅是学习目的的,并没有什么实际意义,https、gzip的问题都没解决,如果网站是gbk的,拿它访问也会乱码
如果要拿它翻墙,需要部署两个类似的服务,比如墙外A墙内B,将浏览器代理到B,由B将host隐藏起来,再转到A,A将隐藏的目的host恢复过来,再去访问最终的目的网站

用上面的目的试了试非死不可,不稳定,时不时的会出错~~等完善的再分享给大家

nodejs入门-做一个代理服务器的更多相关文章

  1. Fiddler实现手机抓包——小白入门 - 做一个不动声色的大人

    手机用fiddler抓包 电脑最好是笔记本,这样能和手机保持统一局域网内:其他不多说,直接说步骤了. 一.对PC(笔记本)参数进行配置    1. 配置fiddler允许监听到https(fiddle ...

  2. 用Nodejs做一个简单的小爬虫

    Nodejs将JavaScript语言带到了服务器端,作为js主力用户的前端们,因此获得了服务器端的开发能力,但除了用express搭建一个博客外,还有什么好玩的项目可以做呢?不如就做一个网络爬虫吧. ...

  3. TTS-零基础入门-10分钟教你做一个语音功能

    在本片博客正式開始之前,大家先跟我做一个简单的好玩的 小语音. 新建一个文本文档,然后再文档里输入这样 一句话  CreateObject("SAPI.SpVoice").Spea ...

  4. .Net Core 3.0后台使用httpclient请求网络网页和图片_使用Core3.0做一个简单的代理服务器

    目标:使用.net core最新的3.0版本,借助httpclient和本机的host域名代理,实现网络请求转发和内容获取,最终显示到目标客户端! 背景:本人在core领域是个新手,对core的使用不 ...

  5. Vue.js 入门:从零开始做一个极简 To-Do 应用

    Vue.js 入门:从零开始做一个极简 To-Do 应用 写作时间:2019-12-10版本信息:Vue.js 2.6.10官网文档:https://cn.vuejs.org/ 前言  学习 Vue ...

  6. 【 D3.js 入门系列 --- 5.1 】 做一个带坐标轴和标签的图表

    前面几节讲解了图标.坐标轴.比例等等,这一节整合这些内容做一个实用的图表.结果图如下: 代码如下所示: <html> <head> <meta charset=" ...

  7. 【 D3.js 入门系列 --- 3 】 做一个简单的图表!

    前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为 ...

  8. 【 D3.js 入门系列 — 3 】 做一个简单的图表!

    图1. 柱形图 1. 柱形图 前几章的例子,都是对文字进行处理.本章中将用 D3 做一个简单的柱形图.制作柱形图有很多种方法,比如用 HTML 的 <div> 标签,或在 SVG 上绘制 ...

  9. nodeJs入门篇之认识nodejs

    摘要:将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开 ...

随机推荐

  1. Android 消息处理源代码分析(2)

    Android 消息处理源代码分析(1)点击打开链接 继续接着分析剩下的类文件 Looper.java public final class Looper { final MessageQueue m ...

  2. Java集合框架:Collections工具类

    java.util.Collections工具类提供非常多实用的方法.使得程序员操作集合类的时候更加的方便easy,这些方法都是静态的. 整个Collections工具类源代码几乎相同有4000行.我 ...

  3. C#反射实例学习及注意内容

    C#反射的入门学习首先要明白C#反射提供了封装程序集.模块和类型的对象等等.那么这样可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性.如果代码中 ...

  4. [转]C# 获取指定目录下所有文件信息、移动目录、拷贝目录

    原文:http://blog.csdn.net/vchao13/article/details/6200255 1.获取指定目录下所有文件信息 /// <summary> /// 返回指定 ...

  5. openvswitch总述

    前面用了两天时间了解了OpenvSwitch的结构,今天参考其他资料加自己的心得做个总结 一. openvswitch的安装和使用 在前一篇文章中详细的介绍了OpenvSwitch的安装和使用,不再赘 ...

  6. 【BZOJ3166】[Heoi2013]Alo 可持久化Trie树+set

    [BZOJ3166][Heoi2013]Alo Description Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , ...

  7. python的三元运算

    python的三元运算是先输出结果,再判定条件.其格式如下: >>> def f(x,y): return x - y if x>y else abs(x-y) #如果x大于y ...

  8. 淘宝订单数据转CSV

    <html> <body> <div id="result"> </div> <div> <textarea st ...

  9. 解决 free(): invalid pointer: 0x00000000019ff700 运行时报错(caffe)(libtool使用)

    编译成功,运行时报错: 在使用 pytorch or tensorflow or caffe 时,都可能存在这个问题: *** Error in `xxx': free(): invalid poin ...

  10. CNI IPAM插件分析 --- 以hostlocal为示例

    skel.CmdArgs数据结构如下所示: type CmdArgs struct { ContainerID string Netns string IfName string Args strin ...