带缓存的HTTP代理服务器(三)

CONNECT 方法的支持

通过 CONNECT 方法可以建立 Web 隧道,支持https等。
用 CONNECT建立 Web 隧道的过程如下:
  1. 客户端发送CONNECT 请求给代理服务器;
  2. 代理接收CONNECT请求后建立一条客户端到代理之间的TCP 连接;
  3. 代理建立远程服务器到代理之间的TCP连接,并返回含HTTP 200响应码的报文给客户端;
  4. 之后,两条TCP连接直接进行数据交换。

代码如下:
var HTTP_200 = []byte("HTTP/1.1 200 Connection Established\r\n\r\n")

//HttpsHandler handles any connection which need connect method.
func (proxy *ProxyServer) HttpsHandler(rw http.ResponseWriter, req *http.Request) {
	log.Printf("%v tried to connect to %v", proxy.User, req.RequestURI)

	hj, _ := rw.(http.Hijacker)
	Client, _, err := hj.Hijack()
	if err != nil {
		log.Printf("%v failed to get Tcp connection of \n", proxy.User, req.RequestURI)
		return
	}
	defer Client.Close()

	Remote, err := net.Dial("tcp", req.URL.Host)
	if err != nil {
		log.Printf("%v failed to connect %v\n", proxy.User, req.RequestURI)
		return
	}
	defer Remote.Close()
	Client.Write(HTTP_200)
	go io.Copy(Remote, Client)
	io.Copy(Client, Remote)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值