bddjr / hlfhr

🚀HTTPS Listener For HTTP Redirect✔ If a user accesses an https port using http, the server returns 302 redirection. 当用户使用 http 协议访问 https 端口时,服务器返回302重定向。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

大致描述一下模块干了什么

bddjr opened this issue · comments

大致描述一下模块干了什么

核心部分是 listener.go ,一些原理主要参考了golang标准库的 tls.NewListener


connRead 函数:
检测到是tcp连接第一次读取,
读取前 5 个字节,并检测会不会被 net/http 标准库认为是一个http请求,

如果会,(HTTP/1.1)继续读取 4096-5 个字节并缓存(再从标准库转一圈就会来到 Write 函数),
否则,(HTTPS)继续读取 576-5 个字节,不缓存。


connWrite 函数:
检测到是tcp连接第一次写入,
检测有没有来自 Read 的缓存,
然后检测是不是 net/http 默认的写入行为(HTTP/1.0 400 Bad Request),

如果以上条件符合,则执行:
检测有没有自定义的handler,
如果有,执行handler然后退出,
否则,执行这个模块内置的重定向行为。


其余的 Listener 类型是用来修改 Accept 行为,在接受新的连接时,注入自定义的 conn

readreq.go 用来从字节组解析所需的请求内容,给 listener.go 用的

server.goServeTLS 的时候将默认的 net.Listener 变成自己的 Listener ,再执行 net/http 标准库的 srv.ServeTLS

大致描述一下模块干了什么

核心部分是 `listener.go` ,一些原理主要参考了golang标准库的 `tls.NewListener` 。

---

`conn` 的 `Read` 函数:  
检测到是tcp连接第一次读取,  
读取前 5 个字节,并检测会不会被 `net/http` 标准库认为是一个http请求,  

如果会,(HTTP/1.1)继续读取 4096-5 个字节并缓存(再从标准库转一圈就会来到 `Write` 函数),  
否则,(HTTPS)继续读取 576-5 个字节,不缓存。  

---

`conn` 的 `Write` 函数:  
检测到是tcp连接第一次写入,  
检测有没有来自 `Read` 的缓存,  
然后检测是不是 `net/http` 默认的写入行为(HTTP/1.0 400 Bad Request),  

如果以上条件符合,则执行:  
检测有没有自定义的handler,
如果有,执行handler然后退出,    
否则,执行这个模块内置的重定向行为。  

---

其余的 `Listener` 类型是用来修改 `Accept` 行为,在接受新的连接时,注入自定义的 `conn` 。  

`readreq.go` 用来从字节组解析所需的请求内容,给 `listener.go` 用的

`server.go` 在 `ServeTLS` 的时候将默认的 `net.Listener` 变成自己的 `Listener` ,再执行 `net/http` 标准库的 `srv.ServeTLS` 。