@@ -163,8 +163,12 @@ func New(cfg Config) (*Server, error) {
163163 }
164164
165165 s .httpSrv = & http.Server {
166- Addr : cfg .HTTPAddr ,
167- Handler : r ,
166+ Addr : cfg .HTTPAddr ,
167+ Handler : r ,
168+ ReadHeaderTimeout : 10 * time .Second ,
169+ ReadTimeout : 30 * time .Second ,
170+ WriteTimeout : 30 * time .Second ,
171+ IdleTimeout : 60 * time .Second ,
168172 TLSConfig : & tls.Config {
169173 Certificates : []tls.Certificate {cert },
170174 ClientAuth : tls .NoClientCert ,
@@ -175,7 +179,14 @@ func New(cfg Config) (*Server, error) {
175179 s .useTLS = true
176180 s .rootCAPEM = rootCAPEM
177181 } else {
178- s .httpSrv = & http.Server {Addr : cfg .HTTPAddr , Handler : r }
182+ s .httpSrv = & http.Server {
183+ Addr : cfg .HTTPAddr ,
184+ Handler : r ,
185+ ReadHeaderTimeout : 10 * time .Second ,
186+ ReadTimeout : 30 * time .Second ,
187+ WriteTimeout : 30 * time .Second ,
188+ IdleTimeout : 60 * time .Second ,
189+ }
179190 var err error
180191 s .rootCAPEM , err = ca .CertificatePEM ()
181192 if err != nil {
@@ -185,7 +196,13 @@ func New(cfg Config) (*Server, error) {
185196
186197 // Set up Tailscale HTTP server if Tailscale is configured
187198 if tailscaleListener != nil {
188- s .tsHTTP = & http.Server {Handler : r }
199+ s .tsHTTP = & http.Server {
200+ Handler : r ,
201+ ReadHeaderTimeout : 10 * time .Second ,
202+ ReadTimeout : 30 * time .Second ,
203+ WriteTimeout : 30 * time .Second ,
204+ IdleTimeout : 60 * time .Second ,
205+ }
189206 s .tsListener = tailscaleListener
190207 log .Printf ("Tailscale HTTP server configured on %s" , tailscaleListener .Addr ().String ())
191208 }
@@ -248,7 +265,9 @@ func (s *Server) healthHandler(w http.ResponseWriter, r *http.Request) {
248265
249266 w .Header ().Set ("Content-Type" , "application/json" )
250267 w .WriteHeader (http .StatusOK )
251- json .NewEncoder (w ).Encode (health )
268+ if err := json .NewEncoder (w ).Encode (health ); err != nil {
269+ log .Printf ("failed to encode health response: %v" , err )
270+ }
252271}
253272
254273type verifyRequest struct {
@@ -285,7 +304,9 @@ func (s *Server) verifyHandler(w http.ResponseWriter, r *http.Request) {
285304 return
286305 }
287306
288- json .NewEncoder (w ).Encode (verifyResponse {Decision : decision })
307+ if err := json .NewEncoder (w ).Encode (verifyResponse {Decision : decision }); err != nil {
308+ log .Printf ("failed to encode verify response: %v" , err )
309+ }
289310}
290311
291312func (s * Server ) envoyAuthHandler (w http.ResponseWriter , r * http.Request ) {
@@ -364,7 +385,9 @@ func (s *Server) envoyAuthHandler(w http.ResponseWriter, r *http.Request) {
364385 "device_id" : deviceID ,
365386 "session_id" : middleware .GetReqID (r .Context ()),
366387 }
367- json .NewEncoder (w ).Encode (response )
388+ if err := json .NewEncoder (w ).Encode (response ); err != nil {
389+ log .Printf ("failed to encode envoy auth response: %v" , err )
390+ }
368391 default :
369392 http .Error (w , "forbidden" , http .StatusForbidden )
370393 }
@@ -587,7 +610,9 @@ func (s *Server) deviceCertHandler(w http.ResponseWriter, r *http.Request) {
587610 return
588611 }
589612
590- json .NewEncoder (w ).Encode (map [string ]any {"certificate" : string (certPEM )})
613+ if err := json .NewEncoder (w ).Encode (map [string ]any {"certificate" : string (certPEM )}); err != nil {
614+ log .Printf ("failed to encode device cert response: %v" , err )
615+ }
591616}
592617
593618func (s * Server ) caHandler (w http.ResponseWriter , r * http.Request ) {
@@ -597,7 +622,9 @@ func (s *Server) caHandler(w http.ResponseWriter, r *http.Request) {
597622 }
598623 w .Header ().Set ("Content-Type" , "application/x-pem-file" )
599624 w .WriteHeader (http .StatusOK )
600- w .Write (s .rootCAPEM )
625+ if _ , err := w .Write (s .rootCAPEM ); err != nil {
626+ log .Printf ("failed to write CA response: %v" , err )
627+ }
601628}
602629
603630func decodePEMBlock (p string ) ([]byte , error ) {
@@ -751,7 +778,9 @@ func (s *Server) tailscaleStatusHandler(w http.ResponseWriter, r *http.Request)
751778 status := s .getTailscaleInfo ()
752779 w .Header ().Set ("Content-Type" , "application/json" )
753780 w .WriteHeader (http .StatusOK )
754- json .NewEncoder (w ).Encode (status )
781+ if err := json .NewEncoder (w ).Encode (status ); err != nil {
782+ log .Printf ("failed to encode tailscale status: %v" , err )
783+ }
755784}
756785
757786// loggingMiddleware provides structured logging for all requests
0 commit comments