代理分类
-
正向代理:代理客户端
-
反向代理:代理服务器,cdn雏形
-
透明代理:代理客户端
三种代理模式概览

详细对比表

通过curl分析HTTP代理
cpp
curl -x https://127.0.0.1:31181 https://httpbin.org/get?abc=123
-
正常访问
httpbin.org

-
通过代理访问
httpbin.org

通过抓包分析,两个包的请求行分别是/get?abc=123和http://httpbin.org/get?abc=123。所以通过请求行,可以很清楚的知道客户端请求的目的url。
下面是代理服务伪代码:
cpp
#通过代理,访问目的地址
if url.startwith('http'){
#获取headers
#获取cookies
#获取url
#检查授权
if check_auth(){
resp = request(url,heders,cookies)
retrun resp
}
else{
#授权失败
return 403;//forbidden
}
}
此时一个简单的HTTP代理即可完成。至于更多细节,例如请求头是否包含真实客户机IP等细节处理,根据实际业务需求处理即可。
通过浏览器代理分析

发现浏览器并未遵守上述规则,但是都有一个共同点:HOST,始终是目标HOST,所以代理服务进一步优化:
cpp
#通过代理,访问目的地址
{
#获取请求头的HOST 生成完整的URL
#如果状态行的URL包含HOST(eg:curl 代理),则直接使用URL,如果不包含则从请求头获取HOST,拼接URL
#获取cookies
#检查授权
if check_auth(){
resp = request(url,heders,cookies)
retrun resp
}
else{
#授权失败
return 403;//forbidden
}
}
HTTP 代理之tunnel
HTTP tunnel,即CONNECT 方法,通过代理服务建立一条TCP通道,实现客户机和后端服务通讯。当Tunnel建立之后,代理服务只维护通道链接,并不需要解析包,此时传送数据可以是任何数据流,不在受HTTP协议限制。
cpp
CONNECT httpbin.org:80 HTTP/1.1
Host: httpbin.org:80
Proxy-Authorization: basic *
