Files
gitlab.nvim/cmd/app/shutdown.go
Harrison (Harry) Cramer 22bfd0c83e fix: date fixes; go middleware refactors; regex fixes; etc (#368)
fix: format of date when MR was closed or merged (#367)
refactor: Add Payload Validators + Middleware In Go Code (#366)
fix: Add better checks for leaving comments (#369)
fix: regex support for http credentials embedded in remote url (#372)
fix: Comment on single line selects two lines (#371)

This is a #PATCH release.
2024-09-14 16:53:00 -04:00

81 lines
1.8 KiB
Go

package app
import (
"context"
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"os"
)
type killer struct{}
func (k killer) Signal() {}
func (k killer) String() string {
return "0"
}
type ShutdownHandler interface {
WatchForShutdown(server *http.Server)
shutdownHandler(w http.ResponseWriter, r *http.Request)
}
type shutdown struct {
sigCh chan os.Signal
}
func (s shutdown) 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)
}
}
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
}
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
}
var text = "Shut down server"
if shutdownRequest.Restart {
text = "Restarted server"
}
w.WriteHeader(http.StatusOK)
response := SuccessResponse{Message: text}
err = json.NewEncoder(w).Encode(response)
if err != nil {
handleError(w, err, "Could not encode response", http.StatusInternalServerError)
} else {
s.sigCh <- killer{}
}
}