7 changed files with 143 additions and 134 deletions
@ -0,0 +1,72 @@
@@ -0,0 +1,72 @@
|
||||
package core |
||||
|
||||
import ( |
||||
"context" |
||||
"crypto/tls" |
||||
"log" |
||||
"net" |
||||
"net/http" |
||||
"time" |
||||
|
||||
"github.com/bluenviron/mediamtx/internal/conf" |
||||
) |
||||
|
||||
type nilWriter struct{} |
||||
|
||||
func (nilWriter) Write(p []byte) (int, error) { |
||||
return len(p), nil |
||||
} |
||||
|
||||
type httpServer struct { |
||||
ln net.Listener |
||||
inner *http.Server |
||||
} |
||||
|
||||
func newHTTPServer( |
||||
address string, |
||||
readTimeout conf.StringDuration, |
||||
serverCert string, |
||||
serverKey string, |
||||
handler http.Handler, |
||||
) (*httpServer, error) { |
||||
ln, err := net.Listen(restrictNetwork("tcp", address)) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
var tlsConfig *tls.Config |
||||
if serverCert != "" { |
||||
crt, err := tls.LoadX509KeyPair(serverCert, serverKey) |
||||
if err != nil { |
||||
ln.Close() |
||||
return nil, err |
||||
} |
||||
|
||||
tlsConfig = &tls.Config{ |
||||
Certificates: []tls.Certificate{crt}, |
||||
} |
||||
} |
||||
|
||||
s := &httpServer{ |
||||
ln: ln, |
||||
inner: &http.Server{ |
||||
Handler: handler, |
||||
TLSConfig: tlsConfig, |
||||
ReadHeaderTimeout: time.Duration(readTimeout), |
||||
ErrorLog: log.New(&nilWriter{}, "", 0), |
||||
}, |
||||
} |
||||
|
||||
if tlsConfig != nil { |
||||
go s.inner.ServeTLS(s.ln, "", "") |
||||
} else { |
||||
go s.inner.Serve(s.ln) |
||||
} |
||||
|
||||
return s, nil |
||||
} |
||||
|
||||
func (s *httpServer) close() { |
||||
s.inner.Shutdown(context.Background()) |
||||
s.ln.Close() // in case Shutdown() is called before Serve()
|
||||
} |
||||
Loading…
Reference in new issue