大致描述一下模块干了什么
bddjr opened this issue · comments
大致描述一下模块干了什么
核心部分是 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
。
大致描述一下模块干了什么
核心部分是 `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` 。