Respond first before exiting

Former-commit-id: d74c643a6d
This commit is contained in:
Owen
2025-12-02 21:53:23 -05:00
parent 293e507000
commit 58ce93f6c3
2 changed files with 12 additions and 13 deletions

View File

@@ -361,20 +361,23 @@ func (s *API) handleExit(w http.ResponseWriter, r *http.Request) {
logger.Info("Received exit request via API")
// Call the exit handler if set
if s.onExit != nil {
if err := s.onExit(); err != nil {
http.Error(w, fmt.Sprintf("Exit failed: %v", err), http.StatusInternalServerError)
return
}
}
// Return a success response
// Return a success response first
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(map[string]string{
"status": "shutdown initiated",
})
// Call the exit handler after responding, in a goroutine with a small delay
// to ensure the response is fully sent before shutdown begins
if s.onExit != nil {
go func() {
time.Sleep(100 * time.Millisecond)
if err := s.onExit(); err != nil {
logger.Error("Exit handler failed: %v", err)
}
}()
}
}
// handleSwitchOrg handles the /switch-org endpoint

View File

@@ -214,10 +214,6 @@ func StartTunnel(config TunnelConfig) {
// debug print out the whole config
logger.Debug("Starting tunnel with config: %+v", config)
if config.Holepunch {
logger.Warn("Hole punching is enabled. This is EXPERIMENTAL and may not work in all environments.")
}
// Create a cancellable context for this tunnel process
tunnelCtx, cancel := context.WithCancel(globalCtx)
tunnelCancel = cancel