您的位置:首页 >文章内容

实战中看懂HTTP代理原理

来源: 作者:admin 时间:2021-01-22 11:14:20

    (一)HTTP代理原理


    HTTP 客户端向代理发送请求报文,代理服务器需要正确地处理请求和连接(例如正确处理 Connection: keep-alive),同时向服务器发送请求,并将收到的响应转发给客户端。


image.png


    举个例子,当我们在浏览器地址栏输入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代理原理及其实现的步骤。


因为专业! 所以简单! 产品至上,价格实惠 是我们服务追求的宗旨

免费试用