实战中看懂HTTP代理原理
(一)HTTP代理原理
HTTP 客户端向代理发送请求报文,代理服务器需要正确地处理请求和连接(例如正确处理 Connection: keep-alive),同时向服务器发送请求,并将收到的响应转发给客户端。
举个例子,当我们在浏览器地址栏输入URL(网址)后,按下回车键之后会执行以下步骤:浏览器先向DNS服务器请求解析该URL(网址)中的域名所对应的IP地址;解析出IP地址后,根据该IP地址和默认端口 80,和服务器建立TCP连接;浏览器发出读取文件URL中域名后面部分对应的文件)的HTTP请求,该请求报文作为TCP三次握手的第三个报文的数据发送给服务器;服务器对浏览器请求作出响应,并把对应的html文本发送给浏览器;释放TCP连接;浏览器将该html文本并显示内容。
(二)代码实现
数据经过代理服务器后可能会经过修改,要小心数据有效性
1 │ var net = require('net')
2 │ var url = require('url')
3 │ var http = require('http')
4 │
5 │ var hostname = '127.0.0.1'
6 │ var port = '8888'
7 │
===================================
这个服务从请求报文中解析出请求 URL 和其他必要参数,新建到服务端的请求,
并把代理收到的请求转发给新建的请求,最后再把服务端响应返回给浏览器。
===================================
8 │ var request = (creq,cres)=>{
9 │ console.log(creq.header);
10 │ var u = url.parse(creq.url);
===============
重新构建请求
===============
11 │ var options = {
12 │ hostname : u.hostname,
13 │ port : u.port || 80,
14 │ path : u.path,
15 │ method : creq.method,
16 │ headers : creq.headers,
17 │ };
18 │
==================
得到响应
==================
19 │ var preq = http.request(options, (pres)=>{
20 │ cres.writeHead(pres.statusCode,pres.headers);//估计是添加头
21 │ pres.pipe(cres);//装入
22 │ }).on('error',function(e){
23 │ cres.end();
24 │ });
25 │ creq.pipe(preq);
26 │ }
27 │
==================================
这个服务从 CONNECT 请求报文中解析出域名和端口,
创建到服务端的 TCP 连接,并和 CONNECT 请求中的 TCP 连接串起来,
最后再响应一个 Connection Established 响应。
===============================
28 │ var connect = (creq, csock) =>{
29 │ console.log(creq.headers);
30 │
31 │ var u = url.parse("http://"+creq.url);
32 │
33 │ var psock = net.connect(u.port, u.hostname, ()=>{
34 │ csock.write('HTTP/1.1 200 Connection Established\r\n\r\n');
35 │ psock.pipe(csock);
36 │ }).on('error',(e)=>{
37 │ csock.end();
38 │ });
39 │ csock.pipe(psock);
40 │ }
41 │
42 │
43 │ var proxy = http.createServer().on('request',request).on('connect',connect);
44 │ proxy.listen(port, hostname,() =>{
45 │ console.log("Proxy run in 127.0.0.1:8888");
46 │ })
以上就是HTTP代理原理及其实现的步骤。
推荐阅读
热门文章
因为专业! 所以简单! 产品至上,价格实惠 是我们服务追求的宗旨
免费试用