OK,我来更新了。
先吐槽下近况。期末考试刚结束不久,我还留在学校里,然后前天晚上突然收到参加全国电子商务竞赛,然后昨天一天在和老师、队友们一起做文档。
吐槽完毕。
项目地址:https://code.youkuaiyun.com/sakeven/httpproxy
首先我们来了解下代理服务器。
代理服务器
根据导师建议,买了一本《HTTP 权威指南》来看,大致粗略浏览了一番。根据书本和网络资料,代理服务器我是这样理解的:
上图~
代理服务器接收然后转发客户端发来的请求(Request),接着从服务器收到响应(Response)并将响应转发给客户端。
应用
- 由于代理服务器在接收到客户端的Request之后可以修改Request,所以可以作为过滤器和访问控制。
- 代理服务器工作时可以隐藏客户端的IP等安全信息,可以作为安全防火墙。
- 代理服务器可以缓存经常访问的网页资源,加速客户端的访问速度。
- 还可以假扮web 服务器,称为反向代理(reverse proxy),提高服务器性能。
实现
提案要求是用golang实现带缓存的HTTP代理服务器,所以根据golang已有的标准包,考虑了两种实现方案。
- 采用socket Tcp底层来写,需要自己解析http协议,实现后发现bug太多和难度较大,就放弃了。
- 利用"net/http"中提供各类函数、结构、接口,方便实现HTTP代理服务器。
目前实现了HTTP中“GET”,“POST”,“HEAD”等除“CONNECT”之外的常用方法,其中主要一点是,去除客户端发来的Request的与proxy有关的headers。
代码如下:
//RmeProxyHeaders remove some headers ralated with proxy.
func RmProxyHeaders(req *http.Request) {
req.RequestURI = ""
req.Header.Del("Proxy-Connection")
req.Header.Del("Connection")
}
其他具体处理http请求的暂且不表。
后记
明天就要回家咯~。但是暑假事情确实挺多的,有开源夏令营,还有那个全国电子商务竞赛,如果进了初赛,7月份还要准备复赛,然后还有7月下旬开始的ACM集训。想想都累
。
