fix http2 failover

This commit is contained in:
ginuerzh 2020-01-09 10:10:22 +08:00
parent 7eea9b3ad7
commit 085b0b30e7

View File

@ -79,6 +79,7 @@ func (c *http2Connector) Connect(conn net.Conn, addr string, options ...ConnectO
}
resp, err := cc.client.Do(req)
if err != nil {
cc.Close()
return nil, err
}
if Debug {
@ -130,11 +131,11 @@ func (tr *http2Transporter) Dial(addr string, options ...DialOption) (net.Conn,
client, ok := tr.clients[addr]
if !ok {
// NOTE: due to the dummy connection, HTTP2 node in a proxy chain can not be marked as dead.
// There is no real connection to the HTTP2 server at this moment.
// So we should try to connect the server.
// NOTE: There is no real connection to the HTTP2 server at this moment.
// So we try to connect to the server to check the server health.
conn, err := opts.Chain.Dial(addr)
if err != nil {
log.Log("http2 dial:", addr, err)
return nil, err
}
conn.Close()
@ -163,6 +164,11 @@ func (tr *http2Transporter) Dial(addr string, options ...DialOption) (net.Conn,
return &http2ClientConn{
addr: addr,
client: client,
onClose: func() {
tr.clientMutex.Lock()
defer tr.clientMutex.Unlock()
delete(tr.clients, addr)
},
}, nil
}
@ -889,8 +895,16 @@ func (c *http2ServerConn) SetWriteDeadline(t time.Time) error {
// a dummy HTTP2 client conn used by HTTP2 client connector
type http2ClientConn struct {
nopConn
addr string
client *http.Client
addr string
client *http.Client
onClose func()
}
func (c *http2ClientConn) Close() error {
if c.onClose != nil {
c.onClose()
}
return nil
}
type flushWriter struct {