fix keepalive for websocket

This commit is contained in:
ginuerzh 2023-03-21 17:58:10 +08:00
parent 661953e09f
commit fb7b827ea2
4 changed files with 25 additions and 13 deletions

View File

@ -167,10 +167,11 @@ func (d *mwsDialer) initSession(ctx context.Context, host string, conn net.Conn)
cc := ws_util.Conn(c)
if d.md.keepAlive > 0 {
c.SetReadDeadline(time.Now().Add(d.md.keepAlive * 2))
if d.md.keepaliveInterval > 0 {
d.options.Logger.Debugf("keepalive is enabled, ttl: %v", d.md.keepaliveInterval)
c.SetReadDeadline(time.Now().Add(d.md.keepaliveInterval * 2))
c.SetPongHandler(func(string) error {
c.SetReadDeadline(time.Now().Add(d.md.keepAlive * 2))
c.SetReadDeadline(time.Now().Add(d.md.keepaliveInterval * 2))
return nil
})
go d.keepAlive(cc)
@ -203,13 +204,15 @@ func (d *mwsDialer) initSession(ctx context.Context, host string, conn net.Conn)
}
func (d *mwsDialer) keepAlive(conn ws_util.WebsocketConn) {
ticker := time.NewTicker(d.md.keepAlive)
ticker := time.NewTicker(d.md.keepaliveInterval)
defer ticker.Stop()
for range ticker.C {
d.options.Logger.Debug("send ping")
conn.SetWriteDeadline(time.Now().Add(10 * time.Second))
if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil {
return
}
conn.SetWriteDeadline(time.Time{})
}
}

View File

@ -10,6 +10,7 @@ import (
const (
defaultPath = "/ws"
defaultKeepalivePeriod = 15 * time.Second
)
type metadata struct {
@ -30,7 +31,7 @@ type metadata struct {
muxMaxStreamBuffer int
header http.Header
keepAlive time.Duration
keepaliveInterval time.Duration
}
func (d *mwsDialer) parseMetadata(md mdata.Metadata) (err error) {
@ -45,7 +46,6 @@ func (d *mwsDialer) parseMetadata(md mdata.Metadata) (err error) {
enableCompression = "enableCompression"
header = "header"
keepAlive = "keepAlive"
muxKeepAliveDisabled = "muxKeepAliveDisabled"
muxKeepAliveInterval = "muxKeepAliveInterval"
@ -82,7 +82,13 @@ func (d *mwsDialer) parseMetadata(md mdata.Metadata) (err error) {
}
d.md.header = h
}
d.md.keepAlive = mdutil.GetDuration(md, keepAlive)
if mdutil.GetBool(md, "keepalive") {
d.md.keepaliveInterval = mdutil.GetDuration(md, "ttl", "keepalive.interval")
if d.md.keepaliveInterval <= 0 {
d.md.keepaliveInterval = defaultKeepalivePeriod
}
}
return
}

View File

@ -106,6 +106,7 @@ func (d *wsDialer) Handshake(ctx context.Context, conn net.Conn, options ...dial
cc := ws_util.Conn(c)
if d.md.keepaliveInterval > 0 {
d.options.Logger.Debugf("keepalive is enabled, ttl: %v", d.md.keepaliveInterval)
c.SetReadDeadline(time.Now().Add(d.md.keepaliveInterval * 2))
c.SetPongHandler(func(string) error {
c.SetReadDeadline(time.Now().Add(d.md.keepaliveInterval * 2))
@ -123,10 +124,12 @@ func (d *wsDialer) keepalive(conn ws_util.WebsocketConn) {
defer ticker.Stop()
for range ticker.C {
d.options.Logger.Debug("send ping")
conn.SetWriteDeadline(time.Now().Add(10 * time.Second))
if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil {
// d.options.Logger.Error(err)
return
}
d.options.Logger.Debug("send ping")
conn.SetWriteDeadline(time.Time{})
}
}

View File

@ -10,7 +10,7 @@ import (
const (
defaultPath = "/ws"
defaultKeepAlivePeriod = 15 * time.Second
defaultKeepalivePeriod = 15 * time.Second
)
type metadata struct {
@ -65,7 +65,7 @@ func (d *wsDialer) parseMetadata(md mdata.Metadata) (err error) {
if mdutil.GetBool(md, "keepalive") {
d.md.keepaliveInterval = mdutil.GetDuration(md, "ttl", "keepalive.interval")
if d.md.keepaliveInterval <= 0 {
d.md.keepaliveInterval = defaultKeepAlivePeriod
d.md.keepaliveInterval = defaultKeepalivePeriod
}
}