in search.go [32:74]
func searchHandlerWithProxyMode(logger *zap.Logger, indexer Indexer, proxyMode *proxymode.ProxyMode, cacheTime time.Duration) func(w http.ResponseWriter, r *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
logger := logger.With(apmzap.TraceContext(r.Context())...)
filter, err := newSearchFilterFromQuery(r.URL.Query())
if err != nil {
badRequest(w, err.Error())
return
}
opts := packages.GetOptions{
Filter: filter,
}
packages, err := indexer.Get(r.Context(), &opts)
if err != nil {
notFoundError(w, fmt.Errorf("fetching package failed: %w", err))
return
}
if proxyMode.Enabled() {
proxiedPackages, err := proxyMode.Search(r)
if err != nil {
logger.Error("proxy mode: search failed", zap.Error(err))
http.Error(w, "internal server error", http.StatusInternalServerError)
return
}
packages = packages.Join(proxiedPackages)
if !opts.Filter.AllVersions {
packages = latestPackagesVersion(packages)
}
}
data, err := getSearchOutput(r.Context(), packages)
if err != nil {
notFoundError(w, err)
return
}
cacheHeaders(w, cacheTime)
jsonHeader(w)
fmt.Fprint(w, string(data))
}
}