如果在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