node http创建正向代理_(原创)Node.JS实战17:开发一个正向代理服务器。

什么是正向代理服务器?

我们在浏览网站时,浏览器直接与网站服务器进行通信。如果在本地建立一个代理服务器,浏览器通过它,再与网站通信,那么这台代理服务器就是正向代理服务器。

正向代理服务器常用于代理上网、数据截取分析等。

91c4b319b40415a91b0ae1fbb4af01e1.png

题外话:

有正向代理,就是反向代理。
与正向代理相对应,反向代理服务器假设在网站一方。
当用户通过浏览器访问网站时,数据收该反向代理服务器接收,再转发给网站服务器,这种代理服务器,称之为反向代理服务器。
反向代理常用于网站防护,WAF(Web应用防火墙),如ShareWAF,就是一种典型的反向代理服务器WAF。
换个角度看:客户端用的是正向代理服务器;服务器端用的是反向代理服务器。

本文将开发一个http正向代理服务器:

完整代码如下:

var http = require("http");
var url = require("url");

http.createServer(function(req,res){
 console.log("start request:",req.url);

 var option = url.parse(req.url);
 option.headers = req.headers;

 var proxyRequest = http.request(option, function(proxyResponse){

 
 proxyResponse.on("data",function(chunk){
 console.log("proxyResponse length",chunk.length);
 });
 proxyResponse.on("end",function(){
 console.log("proxyed request ended");
 res.end();
 })

 res.writeHead(proxyResponse.statusCode,proxyResponse.headers);
 });

 
 req.on("data",function(chunk){
 console.log("in request length:",chunk.length);
 proxyRequest.write(chunk,"binary");
 })

 req.on("end",function(){
 console.log("original request ended");
 proxyRequest.end();
 })

}).listen(8080);

代码解读:

1、整个代码,会建立一个http服务器,并监听8080端口:

9d6d4825169c58291dd617ca8522cfeb.png

2、当接收到请求信息时,从请求头发获取信息并进行转发:

980786409e4f82551d9222237f1497e5.png

3、以上两点最重要,其余就是对信息输出,以方便我们了解到代理是否生效、代理内容如何等:

e05b8f822be3ecbeedd3fb5650750768.png

实际使用测试:

对浏览器设置http代理:

a7d1c45bda1ae4e3bf96b3d3931d5641.png

当然,事先是需要启动我们刚写好的代理服务器的。

访问一个网页,这时可以看到各种信息输出:

7307bcf63e3c40084c40bbcffe070cb3.png

同时,浏览器中也是能看到网页可以正常打开:

aad35b62da60609d1a9f6641fbe486eb.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
class Node: def init(self, value): self.value = value self.prev = None self.next = None class DoublyLinkedList: def init(self): self.head = Node(None) def is_empty(self): return self.head.next == None def insert(self, value): new_node = Node(value) current_node = self.head while current_node.next != None: current_node = current_node.next current_node.next = new_node new_node.prev = current_node def get_length(self): count = 0 current_node = self.head while current_node.next != None: count += 1 current_node = current_node.next return count def insert_at(self, value, position): if position < 1 or position > self.get_length() + 1: print('Invalid position') return new_node = Node(value) current_node = self.head for i in range(position - 1): current_node = current_node.next new_node.prev = current_node new_node.next = current_node.next current_node.next.prev = new_node current_node.next = new_node def append(self, value): new_node = Node(value) current_node = self.head while current_node.next != None: current_node = current_node.next current_node.next = new_node new_node.prev = current_node def remove(self, value): current_node = self.head.next while current_node != None: if current_node.value == value: current_node.prev.next = current_node.next if current_node.next != None: current_node.next.prev = current_node.prev return current_node = current_node.next print('Value not found') def find(self, value): current_node = self.head.next while current_node != None: if current_node.value == value: return current_node current_node = current_node.next print('Value not found') def traverse_prev(self): current_node = self.head.next while current_node != None: print(current_node.value) current_node = current_node.prev def traverse_next(self): current_node = self.head.next while current_node != None: print(current_node.value) current_node = current_node.next #测试 dll = DoublyLinkedList() # (1)初始化一个双链表DLL。 print(dll.is_empty()) # (2)判断DLL是否为空。 dll.insert(14) #(3)将值为14、94、84、56、11的结点依次链入DLL中。 dll.insert(94) dll.insert(84) dll.insert(56) dll.insert(11) print(dll.get_length()) # (4)获取DLL的长度。 dll.insert_at(6, 3) # (5)将值为6的结点插至DLL中第3个位置。 dll.append(23) # (6)在DLL末端插入值为23的结点。 dll.remove(14) # (7)删除DLL中第1个位置的结点。 print(dll.find(94).value) # (8)查找DLL中值为94的结点。 dll.traverse_prev() # (9)按prev域依次遍历DLL中所有结点。 dll.traverse_next() # (10)按next域依次遍历DLL中所有结点。
04-21

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值