in reference-api/unified_handler.go [52:98]
func (deps *HandlerDeps) UnifiedHandler(w http.ResponseWriter, r *http.Request) {
repo := r.URL.Query().Get("repo")
gitRef := r.URL.Query().Get("gitRef")
if repo == "" || gitRef == "" {
http.Error(w, "Missing 'repo' or 'gitRef' query parameter", http.StatusBadRequest)
return
}
if gitRef == "latest" {
http.Error(w, "'latest' is not a valid value for 'gitRef'. Please use an immutable image.", http.StatusBadRequest)
return
}
cacheKey := fmt.Sprintf("%s:%s", repo, gitRef)
// Check cache first
if cachedResponse, ok := deps.getFromCache(cacheKey); ok {
w.WriteHeader(cachedResponse.StatusCode)
_, _ = w.Write(cachedResponse.Body)
return
}
// Try handling as a release first
releaseRecorder := &responseRecorder{
ResponseWriter: httptest.NewRecorder(),
statusCode: 0, // Use a separate ResponseRecorder
}
deps.ReleasesHandler(releaseRecorder, r)
// If release is found (not 404), cache and return
if releaseRecorder.statusCode != http.StatusNotFound {
w.WriteHeader(releaseRecorder.statusCode)
if _, err := w.Write(releaseRecorder.body.Bytes()); err != nil {
log.Printf("Error writing response: %v", err)
}
deps.storeInCache(cacheKey, releaseRecorder.statusCode, releaseRecorder.body.Bytes())
return
}
// Clear previous response before falling back
w.Header().Del("Content-Type") // Ensure correct content type is set by CommitsHandler
w.WriteHeader(http.StatusOK) // Reset status before falling back
// Fall back to CommitsHandler
deps.processAndCacheResponse(deps.CommitsHandler, w, r, cacheKey)
}