fix keepalive for websocket
This commit is contained in:
parent
661953e09f
commit
fb7b827ea2
@ -167,10 +167,11 @@ func (d *mwsDialer) initSession(ctx context.Context, host string, conn net.Conn)
|
|||||||
|
|
||||||
cc := ws_util.Conn(c)
|
cc := ws_util.Conn(c)
|
||||||
|
|
||||||
if d.md.keepAlive > 0 {
|
if d.md.keepaliveInterval > 0 {
|
||||||
c.SetReadDeadline(time.Now().Add(d.md.keepAlive * 2))
|
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.SetPongHandler(func(string) error {
|
||||||
c.SetReadDeadline(time.Now().Add(d.md.keepAlive * 2))
|
c.SetReadDeadline(time.Now().Add(d.md.keepaliveInterval * 2))
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
go d.keepAlive(cc)
|
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) {
|
func (d *mwsDialer) keepAlive(conn ws_util.WebsocketConn) {
|
||||||
ticker := time.NewTicker(d.md.keepAlive)
|
ticker := time.NewTicker(d.md.keepaliveInterval)
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
|
|
||||||
for range ticker.C {
|
for range ticker.C {
|
||||||
|
d.options.Logger.Debug("send ping")
|
||||||
conn.SetWriteDeadline(time.Now().Add(10 * time.Second))
|
conn.SetWriteDeadline(time.Now().Add(10 * time.Second))
|
||||||
if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil {
|
if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
conn.SetWriteDeadline(time.Time{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
defaultPath = "/ws"
|
defaultPath = "/ws"
|
||||||
|
defaultKeepalivePeriod = 15 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
type metadata struct {
|
type metadata struct {
|
||||||
@ -29,8 +30,8 @@ type metadata struct {
|
|||||||
muxMaxReceiveBuffer int
|
muxMaxReceiveBuffer int
|
||||||
muxMaxStreamBuffer int
|
muxMaxStreamBuffer int
|
||||||
|
|
||||||
header http.Header
|
header http.Header
|
||||||
keepAlive time.Duration
|
keepaliveInterval time.Duration
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *mwsDialer) parseMetadata(md mdata.Metadata) (err error) {
|
func (d *mwsDialer) parseMetadata(md mdata.Metadata) (err error) {
|
||||||
@ -44,8 +45,7 @@ func (d *mwsDialer) parseMetadata(md mdata.Metadata) (err error) {
|
|||||||
writeBufferSize = "writeBufferSize"
|
writeBufferSize = "writeBufferSize"
|
||||||
enableCompression = "enableCompression"
|
enableCompression = "enableCompression"
|
||||||
|
|
||||||
header = "header"
|
header = "header"
|
||||||
keepAlive = "keepAlive"
|
|
||||||
|
|
||||||
muxKeepAliveDisabled = "muxKeepAliveDisabled"
|
muxKeepAliveDisabled = "muxKeepAliveDisabled"
|
||||||
muxKeepAliveInterval = "muxKeepAliveInterval"
|
muxKeepAliveInterval = "muxKeepAliveInterval"
|
||||||
@ -82,7 +82,13 @@ func (d *mwsDialer) parseMetadata(md mdata.Metadata) (err error) {
|
|||||||
}
|
}
|
||||||
d.md.header = h
|
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
|
return
|
||||||
}
|
}
|
||||||
|
@ -106,6 +106,7 @@ func (d *wsDialer) Handshake(ctx context.Context, conn net.Conn, options ...dial
|
|||||||
cc := ws_util.Conn(c)
|
cc := ws_util.Conn(c)
|
||||||
|
|
||||||
if d.md.keepaliveInterval > 0 {
|
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.SetReadDeadline(time.Now().Add(d.md.keepaliveInterval * 2))
|
||||||
c.SetPongHandler(func(string) error {
|
c.SetPongHandler(func(string) error {
|
||||||
c.SetReadDeadline(time.Now().Add(d.md.keepaliveInterval * 2))
|
c.SetReadDeadline(time.Now().Add(d.md.keepaliveInterval * 2))
|
||||||
@ -123,10 +124,12 @@ func (d *wsDialer) keepalive(conn ws_util.WebsocketConn) {
|
|||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
|
|
||||||
for range ticker.C {
|
for range ticker.C {
|
||||||
|
d.options.Logger.Debug("send ping")
|
||||||
conn.SetWriteDeadline(time.Now().Add(10 * time.Second))
|
conn.SetWriteDeadline(time.Now().Add(10 * time.Second))
|
||||||
if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil {
|
if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil {
|
||||||
|
// d.options.Logger.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
d.options.Logger.Debug("send ping")
|
conn.SetWriteDeadline(time.Time{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,7 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
defaultPath = "/ws"
|
defaultPath = "/ws"
|
||||||
defaultKeepAlivePeriod = 15 * time.Second
|
defaultKeepalivePeriod = 15 * time.Second
|
||||||
)
|
)
|
||||||
|
|
||||||
type metadata struct {
|
type metadata struct {
|
||||||
@ -65,7 +65,7 @@ func (d *wsDialer) parseMetadata(md mdata.Metadata) (err error) {
|
|||||||
if mdutil.GetBool(md, "keepalive") {
|
if mdutil.GetBool(md, "keepalive") {
|
||||||
d.md.keepaliveInterval = mdutil.GetDuration(md, "ttl", "keepalive.interval")
|
d.md.keepaliveInterval = mdutil.GetDuration(md, "ttl", "keepalive.interval")
|
||||||
if d.md.keepaliveInterval <= 0 {
|
if d.md.keepaliveInterval <= 0 {
|
||||||
d.md.keepaliveInterval = defaultKeepAlivePeriod
|
d.md.keepaliveInterval = defaultKeepalivePeriod
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user