Skip to content

Commit e3b61ef

Browse files
committed
Improve TLS server lifecycle management with graceful shutdown
- Add proper goroutine synchronization with WaitGroup - Implement graceful shutdown for both HTTP and HTTPS servers - Move server logging to after server setup for better clarity - Add context-based shutdown with 5-second timeout
1 parent 7ded489 commit e3b61ef

1 file changed

Lines changed: 33 additions & 21 deletions

File tree

pkg/mcp-proxy/main.go

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package mcpproxy
22

33
import (
4+
"context"
45
"crypto/sha256"
56
"fmt"
67
"net/http"
78
"net/url"
89
"os"
910
"path"
11+
"sync"
1012
"time"
1113

1214
"github.com/blendle/zapdriver"
@@ -138,8 +140,6 @@ func Run(
138140
idpRouter.SetupRoutes(router)
139141
proxyRouter.SetupRoutes(router)
140142

141-
logger.Info("Starting server", zap.String("listen", listen))
142-
143143
if tlsHost != "" {
144144
m := autocert.Manager{
145145
Prompt: func(tosURL string) bool {
@@ -153,33 +153,45 @@ func Run(
153153
}
154154

155155
errCh := make(chan error)
156+
var wg sync.WaitGroup
157+
158+
httpServer := &http.Server{
159+
Addr: listen,
160+
Handler: m.HTTPHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
161+
host := r.Host
162+
if host == "" {
163+
host = r.URL.Host
164+
}
165+
target := "https://" + host + r.RequestURI
166+
http.Redirect(w, r, target, http.StatusMovedPermanently)
167+
})),
168+
}
169+
httpsServer := &http.Server{
170+
Addr: listenTLS,
171+
Handler: router,
172+
TLSConfig: m.TLSConfig(),
173+
}
156174

175+
wg.Add(2)
157176
go func() {
158-
s := &http.Server{
159-
Addr: listen,
160-
Handler: m.HTTPHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
161-
host := r.Host
162-
if host == "" {
163-
host = r.URL.Host
164-
}
165-
target := "https://" + host + r.RequestURI
166-
http.Redirect(w, r, target, http.StatusMovedPermanently)
167-
})),
168-
}
169-
errCh <- s.ListenAndServe()
177+
defer wg.Done()
178+
errCh <- httpServer.ListenAndServe()
170179
}()
171180

172181
go func() {
173-
s := &http.Server{
174-
Addr: listenTLS,
175-
Handler: router,
176-
TLSConfig: m.TLSConfig(),
177-
}
178-
errCh <- s.ListenAndServeTLS("", "")
182+
defer wg.Done()
183+
errCh <- httpsServer.ListenAndServeTLS("", "")
179184
}()
180185

181-
return <-errCh
186+
logger.Info("Starting server", zap.Strings("listen", []string{listen, listenTLS}))
187+
err := <-errCh
188+
shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), 5*time.Second)
189+
defer shutdownCancel()
190+
_ = httpServer.Shutdown(shutdownCtx)
191+
_ = httpsServer.Shutdown(shutdownCtx)
192+
return err
182193
} else {
194+
logger.Info("Starting server", zap.String("listen", listen))
183195
return router.Run(listen)
184196
}
185197
}

0 commit comments

Comments
 (0)