Make hls sub session timeout configurable

pull/245/head
thewind296 2 years ago
parent 8ce7d4b730
commit af5e965480

@ -30,7 +30,8 @@
"fragment_num": 6,
"delete_threshold": 6,
"cleanup_mode": 1,
"use_memory_as_disk_flag": false
"use_memory_as_disk_flag": false,
"session_timeout_ms": 10000
},
"httpts": {
"enable": true,

@ -25,22 +25,27 @@ type IHlsServerHandlerObserver interface {
}
type ServerHandler struct {
outPath string
observer IHlsServerHandlerObserver
urlPattern string
sessionMap map[string]*SubSession
mutex sync.Mutex
outPath string
observer IHlsServerHandlerObserver
urlPattern string
sessionMap map[string]*SubSession
mutex sync.Mutex
sessionTimeout time.Duration
}
func NewServerHandler(outPath, urlPattern string, observer IHlsServerHandlerObserver) *ServerHandler {
func NewServerHandler(outPath, urlPattern string, sessionTimeoutMs int, observer IHlsServerHandlerObserver) *ServerHandler {
if strings.HasPrefix(urlPattern, "/") {
urlPattern = urlPattern[1:]
}
if sessionTimeoutMs == 0 {
sessionTimeoutMs = 30000
}
sh := &ServerHandler{
outPath: outPath,
observer: observer,
urlPattern: urlPattern,
sessionMap: make(map[string]*SubSession),
outPath: outPath,
observer: observer,
urlPattern: urlPattern,
sessionMap: make(map[string]*SubSession),
sessionTimeout: time.Duration(sessionTimeoutMs) * time.Millisecond,
}
go sh.runLoop()
return sh
@ -114,7 +119,6 @@ func (s *ServerHandler) ServeHTTPWithUrlCtx(resp http.ResponseWriter, urlCtx bas
return
}
func (s *ServerHandler) keepSessionAlive(sessionId string) error {
s.mutex.Lock()
defer s.mutex.Unlock()
@ -129,7 +133,7 @@ func (s *ServerHandler) keepSessionAlive(sessionId string) error {
func (s *ServerHandler) createSubSession(urlCtx base.UrlContext) (*SubSession, error) {
s.mutex.Lock()
defer s.mutex.Unlock()
session := NewSubSession(urlCtx, s.urlPattern)
session := NewSubSession(urlCtx, s.urlPattern, s.sessionTimeout)
s.sessionMap[session.UniqueKey()] = session
err := s.observer.OnNewHlsSubSession(session)
return session, err
@ -148,7 +152,7 @@ func (s *ServerHandler) handleSubSession(urlCtx base.UrlContext) (redirectUrl st
return "", errors.New("parse url err")
}
sessionId := urlParsed.Query().Get("session_id")
if sessionId != "" {
if sessionId != "" {
err = s.keepSessionAlive(sessionId)
if err != nil {
return "", err

@ -8,29 +8,30 @@ import (
type SubSession struct {
LastRequestTime time.Time
urlCtx base.UrlContext
stat base.StatSession
hlsUrlPattern string
appName string
urlCtx base.UrlContext
stat base.StatSession
hlsUrlPattern string
appName string
timeout time.Duration
}
func (s *SubSession) UniqueKey() string {
return s.stat.SessionId
}
func NewSubSession(urlCtx base.UrlContext, hlsUrlPattern string) *SubSession {
func NewSubSession(urlCtx base.UrlContext, hlsUrlPattern string, timeout time.Duration) *SubSession {
if strings.HasPrefix(hlsUrlPattern, "/") {
hlsUrlPattern = hlsUrlPattern[1:]
}
session := &SubSession{
LastRequestTime: time.Now(),
urlCtx: urlCtx,
hlsUrlPattern: hlsUrlPattern,
urlCtx: urlCtx,
hlsUrlPattern: hlsUrlPattern,
timeout: timeout,
}
session.stat = base.StatSession{
SessionId: base.GenUkHlsSubSession(),
Protocol: base.SessionProtocolHlsStr,
Protocol: base.SessionProtocolHlsStr,
}
return session
}
@ -71,7 +72,7 @@ func (s *SubSession) IsAlive() (readAlive, writeAlive bool) {
}
func (s *SubSession) IsExpired() bool {
return s.LastRequestTime.Add(30 * time.Second).Before(time.Now())
return s.LastRequestTime.Add(s.timeout).Before(time.Now())
}
func (s *SubSession) KeepAlive() {

@ -80,6 +80,7 @@ type HlsConfig struct {
UseMemoryAsDiskFlag bool `json:"use_memory_as_disk_flag"`
hls.MuxerConfig
SessionTimeoutMs int `json:"session_timeout_ms"`
}
type RtspConfig struct {

@ -118,7 +118,7 @@ Doc: %s
sm.config.HlsConfig.Enable || sm.config.HlsConfig.EnableHttps {
sm.httpServerManager = base.NewHttpServerManager()
sm.httpServerHandler = NewHttpServerHandler(sm)
sm.hlsServerHandler = hls.NewServerHandler(sm.config.HlsConfig.OutPath, sm.config.HlsConfig.UrlPattern, sm)
sm.hlsServerHandler = hls.NewServerHandler(sm.config.HlsConfig.OutPath, sm.config.HlsConfig.UrlPattern, sm.config.HlsConfig.SessionTimeoutMs, sm)
}
if sm.config.RtmpConfig.Enable {

Loading…
Cancel
Save