package api import ( "encoding/json" "net/http" "strconv" "github.com/rs/zerolog/log" "github.com/gorilla/mux" ) func (h APIHandler) GetCache(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) cacheid := vars["cacheid"] // Use a channel to synchronize the goroutines ch := make(chan []byte) // Fetch data from cache asynchronously go func() { d, err := h.cache.Get(cacheid) if err != nil { log.Error().Err(err).Msg("") w.WriteHeader(http.StatusNotFound) ch <- nil return } var data []any if val, ok := d.([]any); ok { data = val } else { data = []any{d} } j := toJSON(data, w, r) ch <- j // Signal that the data has been fetched successfully close(ch) }() // wait for the JSON marshaling goroutine to finish j := <-ch if j == nil { return // Stop processing if an error occurred } // Send the JSON response to the client w.WriteHeader(http.StatusOK) w.Header().Set("Content-Type", "application/json") w.Write(j) <-ch } func toJSON(data []any, w http.ResponseWriter, r *http.Request) []byte { result := data if limitsmin, ok := r.URL.Query()["limits.min"]; ok { min, _ := strconv.Atoi(limitsmin[0]) if limitsmax, ok := r.URL.Query()["limits.max"]; ok { max, _ := strconv.Atoi(limitsmax[0]) if max > len(data) { result = data[min:] } else { result = data[min:max] } } else { result = data[min:] } } j, err := json.Marshal(result) if err != nil { w.WriteHeader(http.StatusNotFound) return nil } return j }