是怎么判断IO的数据是不是被读完了

到底是怎么判断出来说一个response是读结束了。应该读出来一个完整的response的数据包,就可以认为都执行结束了吧?读结束了,不close,http链接照样复用。最关键的数据结构应该是bodyEOFSignal

这一部分需要和httpClient.Do函数联合起来看

http的外部函数是怎么和transport函数集合在机器的

do函数里面直接调用transport的roundtrip函数,在roundtrip中选择了一个链接persistConn,然后在这个链接上发送请求,请求就发到了链接的Readloop函数里,染后在这个readloop函数里去获取response,这个response又被返回到链接peristConn的管道中,返回给用户,在这个response中,其实是过滤了若干个钩子,最主要的钩子,是把response的Body给封装了一层,这一层中的函数,就是在transpor中的函数

2851 type bodyEOFSignal struct {
2852   body         io.ReadCloser
2853   mu           sync.Mutex        // guards following 4 fields
2854   closed       bool              // whether Close has been called
2855   rerr         error             // sticky Read error
2856   fn           func(error) error // err will be nil on Read io.EOF
2857   earlyCloseFn func() error      // optional alt Close func used if io.EOF not seen
2858 }

然后在这个函数中会有 n, err = es.body.Read(p)
这里会有一个EOF的错误,其实这不是一个错误,这是一个数据流结束的标识!!!!!!!
这应该是http协议的实现!!!!!!!!!!!

posted @ 2021-01-31 13:59  honpey  阅读(280)  评论(0编辑  收藏  举报