/go-clash-lite

go-clash-lite

Primary LanguageGoApache License 2.0Apache-2.0

go-clash-lite

这段代码的核心原理是实现一个HTTP和HTTPS代理,通过以下几个关键步骤来完成代理功能:

1. 请求接收

  • 监听连接:代理服务器在指定的端口上监听传入的HTTP和HTTPS请求。对于HTTP请求,使用http.ListenAndServe;对于HTTPS请求,使用net.Listen

2. 请求处理

HTTP请求

  • 通过HTTPHandler接收客户端的HTTP请求。
  • 读取请求体并创建一个新的HTTP请求,设置相同的HTTP方法、URL和请求头。
  • 使用HTTP客户端发送请求到目标服务器,并获取响应。

HTTPS请求

  • 通过HTTPSHandler接收客户端的HTTPS CONNECT请求。
  • 解析CONNECT请求,提取目标地址。
  • 与目标服务器建立TCP连接,这个连接是加密的,但在代理服务器和目标服务器之间是明文的。
  • 发送一个“200 Connection Established”响应,告诉客户端连接已经成功建立。

3. 数据转发

HTTP响应

  • HTTPHandler中,获取目标服务器的响应,将响应状态码和响应头返回给客户端。
  • 使用io.Copy将响应体从目标服务器复制到客户端。

HTTPS数据流

  • HTTPSHandler中,建立与目标服务器的双向数据流连接。使用io.Copy将从客户端和目标服务器的流进行复制,从而实现数据的双向转发。
  • 这个过程确保了客户端与目标服务器之间的通信可以直接传递数据,达到代理的目的。

4. 并发处理

  • 使用goroutine处理每个连接,确保能够同时处理多个请求。这样,代理服务器可以在处理某个连接的同时继续接受其他连接,提高了性能和响应能力。

核心实现概念

  • 代理模式:该实现遵循了传统的代理模式,充当客户端与目标服务器之间的中介。
  • 请求和响应的转发:核心在于重构HTTP和HTTPS请求,将其转发到适当的目标,并将返回的响应发送回原客户端。
  • 双向数据流:通过TCP连接实现了HTTP和HTTPS请求的双向数据流,确保了数据的实时传递。