Refactor HTTP control server code
This commit is contained in:
70
internal/server/handler.go
Normal file
70
internal/server/handler.go
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/qdm12/gluetun/internal/dns"
|
||||||
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
"github.com/qdm12/gluetun/internal/openvpn"
|
||||||
|
"github.com/qdm12/gluetun/internal/updater"
|
||||||
|
"github.com/qdm12/golibs/logging"
|
||||||
|
)
|
||||||
|
|
||||||
|
func newHandler(logger logging.Logger, logging bool,
|
||||||
|
buildInfo models.BuildInformation,
|
||||||
|
openvpnLooper openvpn.Looper,
|
||||||
|
unboundLooper dns.Looper,
|
||||||
|
updaterLooper updater.Looper,
|
||||||
|
) http.Handler {
|
||||||
|
return &handler{
|
||||||
|
logger: logger,
|
||||||
|
logging: logging,
|
||||||
|
buildInfo: buildInfo,
|
||||||
|
openvpnLooper: openvpnLooper,
|
||||||
|
unboundLooper: unboundLooper,
|
||||||
|
updaterLooper: updaterLooper,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type handler struct {
|
||||||
|
logger logging.Logger
|
||||||
|
logging bool
|
||||||
|
buildInfo models.BuildInformation
|
||||||
|
openvpnLooper openvpn.Looper
|
||||||
|
unboundLooper dns.Looper
|
||||||
|
updaterLooper updater.Looper
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *handler) ServeHTTP(responseWriter http.ResponseWriter, request *http.Request) {
|
||||||
|
if h.logging {
|
||||||
|
h.logger.Info("HTTP %s %s", request.Method, request.RequestURI)
|
||||||
|
}
|
||||||
|
switch request.Method {
|
||||||
|
case http.MethodGet:
|
||||||
|
switch request.RequestURI {
|
||||||
|
case "/version":
|
||||||
|
h.getVersion(responseWriter)
|
||||||
|
responseWriter.WriteHeader(http.StatusOK)
|
||||||
|
case "/openvpn/actions/restart":
|
||||||
|
h.openvpnLooper.Restart()
|
||||||
|
responseWriter.WriteHeader(http.StatusOK)
|
||||||
|
case "/unbound/actions/restart":
|
||||||
|
h.unboundLooper.Restart()
|
||||||
|
responseWriter.WriteHeader(http.StatusOK)
|
||||||
|
case "/openvpn/portforwarded":
|
||||||
|
h.getPortForwarded(responseWriter)
|
||||||
|
case "/openvpn/settings":
|
||||||
|
h.getOpenvpnSettings(responseWriter)
|
||||||
|
case "/updater/restart":
|
||||||
|
h.updaterLooper.Restart()
|
||||||
|
responseWriter.WriteHeader(http.StatusOK)
|
||||||
|
default:
|
||||||
|
errString := fmt.Sprintf("Nothing here for %s %s", request.Method, request.RequestURI)
|
||||||
|
http.Error(responseWriter, errString, http.StatusBadRequest)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
errString := fmt.Sprintf("Nothing here for %s %s", request.Method, request.RequestURI)
|
||||||
|
http.Error(responseWriter, errString, http.StatusBadRequest)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,32 +5,32 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *server) handleGetPortForwarded(w http.ResponseWriter) {
|
func (h *handler) getPortForwarded(w http.ResponseWriter) {
|
||||||
port := s.openvpnLooper.GetPortForwarded()
|
port := h.openvpnLooper.GetPortForwarded()
|
||||||
data, err := json.Marshal(struct {
|
data, err := json.Marshal(struct {
|
||||||
Port uint16 `json:"port"`
|
Port uint16 `json:"port"`
|
||||||
}{port})
|
}{port})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Warn(err)
|
h.logger.Warn(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if _, err := w.Write(data); err != nil {
|
if _, err := w.Write(data); err != nil {
|
||||||
s.logger.Warn(err)
|
h.logger.Warn(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *server) handleGetOpenvpnSettings(w http.ResponseWriter) {
|
func (h *handler) getOpenvpnSettings(w http.ResponseWriter) {
|
||||||
settings := s.openvpnLooper.GetSettings()
|
settings := h.openvpnLooper.GetSettings()
|
||||||
data, err := json.Marshal(settings)
|
data, err := json.Marshal(settings)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Warn(err)
|
h.logger.Warn(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if _, err := w.Write(data); err != nil {
|
if _, err := w.Write(data); err != nil {
|
||||||
s.logger.Warn(err)
|
h.logger.Warn(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
@@ -19,30 +18,24 @@ type Server interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type server struct {
|
type server struct {
|
||||||
address string
|
address string
|
||||||
logging bool
|
logger logging.Logger
|
||||||
logger logging.Logger
|
handler http.Handler
|
||||||
buildInfo models.BuildInformation
|
|
||||||
openvpnLooper openvpn.Looper
|
|
||||||
unboundLooper dns.Looper
|
|
||||||
updaterLooper updater.Looper
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(address string, logging bool, logger logging.Logger, buildInfo models.BuildInformation,
|
func New(address string, logging bool, logger logging.Logger, buildInfo models.BuildInformation,
|
||||||
openvpnLooper openvpn.Looper, unboundLooper dns.Looper, updaterLooper updater.Looper) Server {
|
openvpnLooper openvpn.Looper, unboundLooper dns.Looper, updaterLooper updater.Looper) Server {
|
||||||
|
serverLogger := logger.WithPrefix("http server: ")
|
||||||
|
handler := newHandler(serverLogger, logging, buildInfo, openvpnLooper, unboundLooper, updaterLooper)
|
||||||
return &server{
|
return &server{
|
||||||
address: address,
|
address: address,
|
||||||
logging: logging,
|
logger: serverLogger,
|
||||||
logger: logger.WithPrefix("http server: "),
|
handler: handler,
|
||||||
buildInfo: buildInfo,
|
|
||||||
openvpnLooper: openvpnLooper,
|
|
||||||
unboundLooper: unboundLooper,
|
|
||||||
updaterLooper: updaterLooper,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *server) Run(ctx context.Context, wg *sync.WaitGroup) {
|
func (s *server) Run(ctx context.Context, wg *sync.WaitGroup) {
|
||||||
server := http.Server{Addr: s.address, Handler: s.makeHandler()}
|
server := http.Server{Addr: s.address, Handler: s.handler}
|
||||||
go func() {
|
go func() {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
<-ctx.Done()
|
<-ctx.Done()
|
||||||
@@ -61,42 +54,3 @@ func (s *server) Run(ctx context.Context, wg *sync.WaitGroup) {
|
|||||||
s.logger.Error(err)
|
s.logger.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *server) makeHandler() http.HandlerFunc {
|
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
s.logger.Info("HTTP %s %s", r.Method, r.RequestURI)
|
|
||||||
switch r.Method {
|
|
||||||
case http.MethodGet:
|
|
||||||
switch r.RequestURI {
|
|
||||||
case "/version":
|
|
||||||
s.handleGetVersion(w)
|
|
||||||
w.WriteHeader(http.StatusOK)
|
|
||||||
case "/openvpn/actions/restart":
|
|
||||||
s.openvpnLooper.Restart()
|
|
||||||
w.WriteHeader(http.StatusOK)
|
|
||||||
case "/unbound/actions/restart":
|
|
||||||
s.unboundLooper.Restart()
|
|
||||||
w.WriteHeader(http.StatusOK)
|
|
||||||
case "/openvpn/portforwarded":
|
|
||||||
s.handleGetPortForwarded(w)
|
|
||||||
case "/openvpn/settings":
|
|
||||||
s.handleGetOpenvpnSettings(w)
|
|
||||||
case "/updater/restart":
|
|
||||||
s.updaterLooper.Restart()
|
|
||||||
w.WriteHeader(http.StatusOK)
|
|
||||||
default:
|
|
||||||
routeDoesNotExist(s.logger, w, r)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
routeDoesNotExist(s.logger, w, r)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func routeDoesNotExist(logger logging.Logger, w http.ResponseWriter, r *http.Request) {
|
|
||||||
w.WriteHeader(http.StatusBadRequest)
|
|
||||||
_, err := w.Write([]byte(fmt.Sprintf("Nothing here for %s %s", r.Method, r.RequestURI)))
|
|
||||||
if err != nil {
|
|
||||||
logger.Error(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -5,15 +5,15 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (s *server) handleGetVersion(w http.ResponseWriter) {
|
func (h *handler) getVersion(w http.ResponseWriter) {
|
||||||
data, err := json.Marshal(s.buildInfo)
|
data, err := json.Marshal(h.buildInfo)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Warn(err)
|
h.logger.Warn(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if _, err := w.Write(data); err != nil {
|
if _, err := w.Write(data); err != nil {
|
||||||
s.logger.Warn(err)
|
h.logger.Warn(err)
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user