fix: Fix broken shutdown handler

This is a #PATCH release.
This commit is contained in:
Harrison (Harry) Cramer
2024-09-14 18:34:05 -04:00
committed by GitHub
parent 22bfd0c83e
commit dba15127fe
3 changed files with 21 additions and 54 deletions

View File

@@ -3,9 +3,7 @@ package app
import (
"context"
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"os"
)
@@ -19,22 +17,20 @@ func (k killer) String() string {
type ShutdownHandler interface {
WatchForShutdown(server *http.Server)
shutdownHandler(w http.ResponseWriter, r *http.Request)
ServeHTTP(w http.ResponseWriter, r *http.Request)
}
type shutdown struct {
type shutdownService struct {
sigCh chan os.Signal
}
func (s shutdown) WatchForShutdown(server *http.Server) {
func (s shutdownService) WatchForShutdown(server *http.Server) {
/* Handles shutdown requests */
<-s.sigCh
err := server.Shutdown(context.Background())
if err != nil {
fmt.Fprintf(os.Stderr, "Server could not shut down gracefully: %s\n", err)
os.Exit(1)
} else {
os.Exit(0)
}
}
@@ -42,36 +38,20 @@ type ShutdownRequest struct {
Restart bool `json:"restart"`
}
/* shutdownHandler will shutdown the HTTP server and exit the process by signaling to the shutdown channel */
func (s shutdown) shutdownHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
w.Header().Set("Allow", http.MethodPost)
handleError(w, errors.New("Invalid request type"), "That request type is not allowed", http.StatusMethodNotAllowed)
return
}
/* Shuts down the HTTP server and exit the process by signaling to the shutdown channel */
func (s shutdownService) ServeHTTP(w http.ResponseWriter, r *http.Request) {
body, err := io.ReadAll(r.Body)
if err != nil {
handleError(w, err, "Could not read request body", http.StatusBadRequest)
return
}
var shutdownRequest ShutdownRequest
err = json.Unmarshal(body, &shutdownRequest)
if err != nil {
handleError(w, err, "Could not unmarshal data from request body", http.StatusBadRequest)
return
}
payload := r.Context().Value(payload("payload")).(*ShutdownRequest)
var text = "Shut down server"
if shutdownRequest.Restart {
if payload.Restart {
text = "Restarted server"
}
w.WriteHeader(http.StatusOK)
response := SuccessResponse{Message: text}
err = json.NewEncoder(w).Encode(response)
err := json.NewEncoder(w).Encode(response)
if err != nil {
handleError(w, err, "Could not encode response", http.StatusInternalServerError)
} else {