You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lal/pkg/rtsp/server.go

79 lines
1.6 KiB
Go

// Copyright 2020, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package rtsp
import (
"bufio"
"net"
"github.com/q191201771/naza/pkg/nazahttp"
"github.com/q191201771/naza/pkg/nazalog"
)
type Server struct {
addr string
ln net.Listener
}
func NewServer(addr string) *Server {
return &Server{
addr: addr,
}
}
func (s *Server) Listen() (err error) {
s.ln, err = net.Listen("tcp", s.addr)
if err != nil {
return
}
nazalog.Infof("start hls server listen. addr=%s", s.addr)
return
}
func (s *Server) RunLoop() error {
for {
conn, err := s.ln.Accept()
if err != nil {
return err
}
go s.handleTCPConnect(conn)
}
}
func (s *Server) handleTCPConnect(conn net.Conn) {
nazalog.Debugf("handleTCPConnect. conn=%p", conn)
r := bufio.NewReader(conn)
for {
requestLine, headers, err := nazahttp.ReadHTTPHeader(r)
if err != nil {
nazalog.Error(err)
break
}
nazalog.Debugf("requestLine=%s, headers=%+v", requestLine, headers)
method, _, _, err := nazahttp.ParseHTTPRequestLine(requestLine)
if err != nil {
nazalog.Error(err)
break
}
// TODO chef: header field not exist?
switch method {
case MethodOptions:
resp := PackResponseOptions(headers[HeaderFieldCSeq])
_, _ = conn.Write([]byte(resp))
case MethodSetup:
resp := PackResponseSetup(headers[HeaderFieldCSeq], headers[HeaderFieldTransport])
_, _ = conn.Write([]byte(resp))
default:
nazalog.Error(method)
}
}
}