Browse Source

hls muxer: fix code 500 when a stream is not found

pull/1003/head
aler9 4 years ago
parent
commit
cb610a707c
  1. 15
      internal/core/hls_muxer.go
  2. 16
      internal/core/hls_server.go

15
internal/core/hls_muxer.go

@ -130,10 +130,10 @@ type hlsMuxer struct {
ringBuffer *ringbuffer.RingBuffer ringBuffer *ringbuffer.RingBuffer
lastRequestTime *int64 lastRequestTime *int64
muxer *hls.Muxer muxer *hls.Muxer
requests []hlsMuxerRequest requests []*hlsMuxerRequest
// in // in
request chan hlsMuxerRequest request chan *hlsMuxerRequest
hlsServerAPIMuxersList chan hlsServerAPIMuxersListSubReq hlsServerAPIMuxersList chan hlsServerAPIMuxersListSubReq
} }
@ -149,6 +149,7 @@ func newHLSMuxer(
hlsPartDuration conf.StringDuration, hlsPartDuration conf.StringDuration,
hlsSegmentMaxSize conf.StringSize, hlsSegmentMaxSize conf.StringSize,
readBufferCount int, readBufferCount int,
req *hlsMuxerRequest,
wg *sync.WaitGroup, wg *sync.WaitGroup,
pathName string, pathName string,
pathManager hlsMuxerPathManager, pathManager hlsMuxerPathManager,
@ -176,10 +177,14 @@ func newHLSMuxer(
v := time.Now().Unix() v := time.Now().Unix()
return &v return &v
}(), }(),
request: make(chan hlsMuxerRequest), request: make(chan *hlsMuxerRequest),
hlsServerAPIMuxersList: make(chan hlsServerAPIMuxersListSubReq), hlsServerAPIMuxersList: make(chan hlsServerAPIMuxersListSubReq),
} }
if req != nil {
m.requests = append(m.requests, req)
}
m.log(logger.Info, "created %s", func() string { m.log(logger.Info, "created %s", func() string {
if remoteAddr == "" { if remoteAddr == "" {
return "automatically" return "automatically"
@ -409,7 +414,7 @@ func (m *hlsMuxer) runInner(innerCtx context.Context, innerReady chan struct{})
} }
} }
func (m *hlsMuxer) handleRequest(req hlsMuxerRequest) func() *hls.MuxerFileResponse { func (m *hlsMuxer) handleRequest(req *hlsMuxerRequest) func() *hls.MuxerFileResponse {
atomic.StoreInt64(m.lastRequestTime, time.Now().Unix()) atomic.StoreInt64(m.lastRequestTime, time.Now().Unix())
err := m.authenticate(req.ctx.Request) err := m.authenticate(req.ctx.Request)
@ -508,7 +513,7 @@ func (m *hlsMuxer) authenticate(req *http.Request) error {
} }
// onRequest is called by hlsserver.Server (forwarded from ServeHTTP). // onRequest is called by hlsserver.Server (forwarded from ServeHTTP).
func (m *hlsMuxer) onRequest(req hlsMuxerRequest) { func (m *hlsMuxer) onRequest(req *hlsMuxerRequest) {
select { select {
case m.request <- req: case m.request <- req:
case <-m.ctx.Done(): case <-m.ctx.Done():

16
internal/core/hls_server.go

@ -76,7 +76,7 @@ type hlsServer struct {
// in // in
pathSourceReady chan *path pathSourceReady chan *path
request chan hlsMuxerRequest request chan *hlsMuxerRequest
muxerClose chan *hlsMuxer muxerClose chan *hlsMuxer
apiMuxersList chan hlsServerAPIMuxersListReq apiMuxersList chan hlsServerAPIMuxersListReq
} }
@ -139,7 +139,7 @@ func newHLSServer(
tlsConfig: tlsConfig, tlsConfig: tlsConfig,
muxers: make(map[string]*hlsMuxer), muxers: make(map[string]*hlsMuxer),
pathSourceReady: make(chan *path), pathSourceReady: make(chan *path),
request: make(chan hlsMuxerRequest), request: make(chan *hlsMuxerRequest),
muxerClose: make(chan *hlsMuxer), muxerClose: make(chan *hlsMuxer),
apiMuxersList: make(chan hlsServerAPIMuxersListReq), apiMuxersList: make(chan hlsServerAPIMuxersListReq),
} }
@ -192,12 +192,11 @@ outer:
select { select {
case pa := <-s.pathSourceReady: case pa := <-s.pathSourceReady:
if s.hlsAlwaysRemux { if s.hlsAlwaysRemux {
s.findOrCreateMuxer(pa.Name(), "") s.findOrCreateMuxer(pa.Name(), "", nil)
} }
case req := <-s.request: case req := <-s.request:
r := s.findOrCreateMuxer(req.dir, req.ctx.Request.RemoteAddr) s.findOrCreateMuxer(req.dir, req.ctx.Request.RemoteAddr, req)
r.onRequest(req)
case c := <-s.muxerClose: case c := <-s.muxerClose:
if c2, ok := s.muxers[c.PathName()]; !ok || c2 != c { if c2, ok := s.muxers[c.PathName()]; !ok || c2 != c {
@ -286,7 +285,7 @@ func (s *hlsServer) onRequest(ctx *gin.Context) {
dir = strings.TrimSuffix(dir, "/") dir = strings.TrimSuffix(dir, "/")
cres := make(chan func() *hls.MuxerFileResponse) cres := make(chan func() *hls.MuxerFileResponse)
hreq := hlsMuxerRequest{ hreq := &hlsMuxerRequest{
dir: dir, dir: dir,
file: fname, file: fname,
ctx: ctx, ctx: ctx,
@ -315,7 +314,7 @@ func (s *hlsServer) onRequest(ctx *gin.Context) {
s.log(logger.Debug, "[conn %v] [s->c] %s", ctx.Request.RemoteAddr, logw.dump()) s.log(logger.Debug, "[conn %v] [s->c] %s", ctx.Request.RemoteAddr, logw.dump())
} }
func (s *hlsServer) findOrCreateMuxer(pathName string, remoteAddr string) *hlsMuxer { func (s *hlsServer) findOrCreateMuxer(pathName string, remoteAddr string, req *hlsMuxerRequest) *hlsMuxer {
r, ok := s.muxers[pathName] r, ok := s.muxers[pathName]
if !ok { if !ok {
r = newHLSMuxer( r = newHLSMuxer(
@ -330,11 +329,14 @@ func (s *hlsServer) findOrCreateMuxer(pathName string, remoteAddr string) *hlsMu
s.hlsPartDuration, s.hlsPartDuration,
s.hlsSegmentMaxSize, s.hlsSegmentMaxSize,
s.readBufferCount, s.readBufferCount,
req,
&s.wg, &s.wg,
pathName, pathName,
s.pathManager, s.pathManager,
s) s)
s.muxers[pathName] = r s.muxers[pathName] = r
} else if req != nil {
r.onRequest(req)
} }
return r return r
} }

Loading…
Cancel
Save