parent
fa749f3b45
commit
9cbc95a6db
42
web/listener.go
Normal file
42
web/listener.go
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
//go:build !linux
|
||||||
|
// +build !linux
|
||||||
|
|
||||||
|
package web
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/tls"
|
||||||
|
"github.com/go-chi/chi/v5"
|
||||||
|
"github.com/librespeed/speedtest/config"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func startListener(conf *config.Config, r *chi.Mux) error {
|
||||||
|
var s error
|
||||||
|
|
||||||
|
addr := net.JoinHostPort(conf.BindAddress, conf.Port)
|
||||||
|
log.Infof("Starting backend server on %s", addr)
|
||||||
|
|
||||||
|
// TLS and HTTP/2.
|
||||||
|
if conf.EnableTLS {
|
||||||
|
log.Info("Use TLS connection.")
|
||||||
|
if !(conf.EnableHTTP2) {
|
||||||
|
srv := &http.Server{
|
||||||
|
Addr: addr,
|
||||||
|
Handler: r,
|
||||||
|
TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler)),
|
||||||
|
}
|
||||||
|
s = srv.ListenAndServeTLS(conf.TLSCertFile, conf.TLSKeyFile)
|
||||||
|
} else {
|
||||||
|
s = http.ListenAndServeTLS(addr, conf.TLSCertFile, conf.TLSKeyFile, r)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if conf.EnableHTTP2 {
|
||||||
|
log.Errorf("TLS is mandatory for HTTP/2. Ignore settings that enable HTTP/2.")
|
||||||
|
}
|
||||||
|
s = http.ListenAndServe(addr, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
return s
|
||||||
|
}
|
60
web/listener_linux.go
Normal file
60
web/listener_linux.go
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
//go:build linux
|
||||||
|
// +build linux
|
||||||
|
|
||||||
|
package web
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/tls"
|
||||||
|
"github.com/coreos/go-systemd/activation"
|
||||||
|
"github.com/go-chi/chi/v5"
|
||||||
|
"github.com/librespeed/speedtest/config"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func startListener(conf *config.Config, r *chi.Mux) error {
|
||||||
|
// See if systemd socket activation has been used when starting our process
|
||||||
|
listeners, err := activation.Listeners()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Error whilst checking for systemd socket activation %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var s error
|
||||||
|
|
||||||
|
switch len(listeners) {
|
||||||
|
case 0:
|
||||||
|
addr := net.JoinHostPort(conf.BindAddress, conf.Port)
|
||||||
|
log.Infof("Starting backend server on %s", addr)
|
||||||
|
|
||||||
|
// TLS and HTTP/2.
|
||||||
|
if conf.EnableTLS {
|
||||||
|
log.Info("Use TLS connection.")
|
||||||
|
if !(conf.EnableHTTP2) {
|
||||||
|
srv := &http.Server{
|
||||||
|
Addr: addr,
|
||||||
|
Handler: r,
|
||||||
|
TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler)),
|
||||||
|
}
|
||||||
|
s = srv.ListenAndServeTLS(conf.TLSCertFile, conf.TLSKeyFile)
|
||||||
|
} else {
|
||||||
|
s = http.ListenAndServeTLS(addr, conf.TLSCertFile, conf.TLSKeyFile, r)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if conf.EnableHTTP2 {
|
||||||
|
log.Errorf("TLS is mandatory for HTTP/2. Ignore settings that enable HTTP/2.")
|
||||||
|
}
|
||||||
|
s = http.ListenAndServe(addr, r)
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
log.Info("Starting backend server on inherited file descriptor via systemd socket activation")
|
||||||
|
if conf.BindAddress != "" || conf.Port != "" {
|
||||||
|
log.Errorf("Both an address/port (%s:%s) has been specificed in the config AND externally configured socket activation has been detected", conf.BindAddress, conf.Port)
|
||||||
|
log.Fatal(`Please deconfigure socket activation (e.g. in systemd unit files), or set both 'bind_address' and 'listen_port' to ''`)
|
||||||
|
}
|
||||||
|
s = http.Serve(listeners[0], r)
|
||||||
|
default:
|
||||||
|
log.Fatalf("Asked to listen on %s sockets via systemd activation. Sorry we currently only support listening on 1 socket.", len(listeners))
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
46
web/web.go
46
web/web.go
@ -1,7 +1,6 @@
|
|||||||
package web
|
package web
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/tls"
|
|
||||||
"embed"
|
"embed"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io"
|
"io"
|
||||||
@ -14,7 +13,6 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/coreos/go-systemd/activation"
|
|
||||||
"github.com/go-chi/chi/v5"
|
"github.com/go-chi/chi/v5"
|
||||||
"github.com/go-chi/chi/v5/middleware"
|
"github.com/go-chi/chi/v5/middleware"
|
||||||
"github.com/go-chi/cors"
|
"github.com/go-chi/cors"
|
||||||
@ -96,49 +94,7 @@ func ListenAndServe(conf *config.Config) error {
|
|||||||
|
|
||||||
go listenProxyProtocol(conf, r)
|
go listenProxyProtocol(conf, r)
|
||||||
|
|
||||||
// See if systemd socket activation has been used when starting our process
|
return startListener(conf, r)
|
||||||
listeners, err := activation.Listeners()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Error whilst checking for systemd socket activation %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var s error
|
|
||||||
|
|
||||||
switch len(listeners) {
|
|
||||||
case 0:
|
|
||||||
addr := net.JoinHostPort(conf.BindAddress, conf.Port)
|
|
||||||
log.Infof("Starting backend server on %s", addr)
|
|
||||||
|
|
||||||
// TLS and HTTP/2.
|
|
||||||
if conf.EnableTLS {
|
|
||||||
log.Info("Use TLS connection.")
|
|
||||||
if !(conf.EnableHTTP2) {
|
|
||||||
srv := &http.Server{
|
|
||||||
Addr: addr,
|
|
||||||
Handler: r,
|
|
||||||
TLSNextProto: make(map[string]func(*http.Server, *tls.Conn, http.Handler)),
|
|
||||||
}
|
|
||||||
s = srv.ListenAndServeTLS(conf.TLSCertFile, conf.TLSKeyFile)
|
|
||||||
} else {
|
|
||||||
s = http.ListenAndServeTLS(addr, conf.TLSCertFile, conf.TLSKeyFile, r)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if conf.EnableHTTP2 {
|
|
||||||
log.Errorf("TLS is mandatory for HTTP/2. Ignore settings that enable HTTP/2.")
|
|
||||||
}
|
|
||||||
s = http.ListenAndServe(addr, r)
|
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
log.Info("Starting backend server on inherited file descriptor via systemd socket activation")
|
|
||||||
if conf.BindAddress != "" || conf.Port != "" {
|
|
||||||
log.Errorf("Both an address/port (%s:%s) has been specificed in the config AND externally configured socket activation has been detected", conf.BindAddress, conf.Port)
|
|
||||||
log.Fatal(`Please deconfigure socket activation (e.g. in systemd unit files), or set both 'bind_address' and 'listen_port' to ''`)
|
|
||||||
}
|
|
||||||
s = http.Serve(listeners[0], r)
|
|
||||||
default:
|
|
||||||
log.Fatalf("Asked to listen on %s sockets via systemd activation. Sorry we currently only support listening on 1 socket.", len(listeners))
|
|
||||||
}
|
|
||||||
return s
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func listenProxyProtocol(conf *config.Config, r *chi.Mux) {
|
func listenProxyProtocol(conf *config.Config, r *chi.Mux) {
|
||||||
|
Loading…
Reference in New Issue
Block a user