Open
Description
(ps:本文用于交学校素质扩展课作业)
我从大二开始学习关于 http 代理服务器的实现,http 代理服务器(http proxy server)是一个如果你写 tiny 版会很简单,但写成 squid 会很难的东西。
1 原理
要想明白 http 代理就得先明白 http 协议。
http 协议的 request(请求)内容,简单说就是向 web 服务器提交对某个资源的请求,比如“GET /index.html HTTP/1.1”,然后 web 服务器返回资源(比如首页)。
而在浏览器中勾上了 http 代理的选项后,浏览器会向代理服务器发送请求“GET example.com/index.html HTTP/1.1”,即命令代理服务器向 example.com 请求 index.html 资源并把资源转发过来。
参考资料:HTTP 代理原理及实现(一)
2 实现
通过对客户端的请求报文的解析,就能够了解到客户端想要的资源在哪台 web 服务器上,然后将请求报文稍加修改,变成一个普通的 http 协议报文,跟 web 服务器连接,发送报文,并把返回的内容转发给客户端就行了。(对于 https 网站的代理方式不同,这里略过,可见上面参考资料)
参考资料:用python写一个http代(和谐)理
3 坑
- 坑1:微信朋友圈的图片服务器,对于请求报文中含有 Proxy-Connection 键就拒绝(polipo 就会被它坑到)...
- 坑2:Win10 的 Edge 浏览器请求报文中 keep-alive 是首字母大写(Keep-alive)...
- 坑3:http 请求报文中行与行的分割符不一定是“\r\n”,还可以是“\n”...
- 坑4:如何处理高并发问题(多进程 / 多线程 / 异步)...
- 坑5:微信朋友圈的图片资源请求 URL 可能是 IPv6 格式的(http://[::ffff:ip]/xxx)...
- 坑6:待续...
Activity