如果在Transport的idleConn存在
- 先查看Transport的idleConnWait是否存在需要待分配persistConn的wantConn,idleConnWait由map实现(map[connectMethodKey]wantConnQueue),key为connectMethodKey,value为队列,如果队列中存在,则直接将该persistConn分配给对应的wantConn
type connectMethodKey struct {
proxy, scheme, addr string
onlyH1 bool
}
- 如果不存在等待队列,则将persistConn加入idleConn
- 如果对应host里面的conn过多,则返回errTooManyIdleHost错误,关闭该连接
- 通过LRU加入所有的存储了所有连接的idleLRU里面去
- 如果idleLRU的长度超过Transport的MaxIdleConns,则关闭最久未使用的persistConn
- 如果IdleConnTimeout设置了超时时间,并且persistConn的alt为nil(alt在http2中使用),则设置该persistConn的超时时间,超过时间没有再使用过,则关闭这个连接,DefaultTransport里面设置的为90s