package httpapi import ( "context" "encoding/json" "net/http" "time" ) // NewHandler returns health endpoints. ping must honor its context deadline. func NewHandler(ping func(context.Context) error) http.Handler { mux := http.NewServeMux() mux.HandleFunc("GET /healthz", func(w http.ResponseWriter, r *http.Request) { writeStatus(w, http.StatusOK, "ok") }) mux.HandleFunc("GET /readyz", func(w http.ResponseWriter, r *http.Request) { ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second) defer cancel() if err := ping(ctx); err != nil { // Do not expose database connection details through a public endpoint. writeStatus(w, http.StatusServiceUnavailable, "unavailable") return } writeStatus(w, http.StatusOK, "ok") }) return mux } func writeStatus(w http.ResponseWriter, code int, status string) { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Header().Set("Cache-Control", "no-store") w.WriteHeader(code) _ = json.NewEncoder(w).Encode(map[string]string{"status": status}) }