11package mcpproxy
22
33import (
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