Skip to content

Commit 7888296

Browse files
authored
Merge pull request #178 from philippdieter/main
Fix Composer 404 on minified metadata and add debug logging
2 parents bb214bb + 787b76d commit 7888296

1 file changed

Lines changed: 38 additions & 1 deletion

File tree

internal/handler/composer.go

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,10 @@ func (h *ComposerHandler) handleDownload(w http.ResponseWriter, r *http.Request)
316316
// stable and dev versions resolve correctly.
317317
metaURLs := h.metadataURLsForVersion(vendor, pkg, version)
318318

319+
h.proxy.Logger.Debug("resolving download URL",
320+
"package", packageName, "version", version,
321+
"metadata_urls", metaURLs)
322+
319323
var downloadURL string
320324
for _, metaURL := range metaURLs {
321325
url, err := h.findDownloadURLFromMetadata(r.Context(), metaURL, packageName, version)
@@ -331,10 +335,17 @@ func (h *ComposerHandler) handleDownload(w http.ResponseWriter, r *http.Request)
331335
}
332336

333337
if downloadURL == "" {
338+
h.proxy.Logger.Debug("version not found in any metadata source",
339+
"package", packageName, "version", version,
340+
"tried_urls", metaURLs)
334341
http.Error(w, "version not found", http.StatusNotFound)
335342
return
336343
}
337344

345+
h.proxy.Logger.Debug("resolved download URL",
346+
"package", packageName, "version", version,
347+
"download_url", downloadURL)
348+
338349
result, err := h.proxy.GetOrFetchArtifactFromURL(r.Context(), "composer", packageName, version, filename, downloadURL)
339350
if err != nil {
340351
h.proxy.Logger.Error("failed to get artifact", "error", err)
@@ -372,6 +383,9 @@ func (h *ComposerHandler) metadataURLsForVersion(vendor, pkg, version string) []
372383
// An error is returned only on transport failure; a missing document (non-200)
373384
// or a missing version both yield an empty string so the caller can fall back.
374385
func (h *ComposerHandler) findDownloadURLFromMetadata(ctx context.Context, metaURL, packageName, version string) (string, error) {
386+
h.proxy.Logger.Debug("fetching upstream metadata for download lookup",
387+
"url", metaURL, "package", packageName, "version", version)
388+
375389
req, err := http.NewRequestWithContext(ctx, http.MethodGet, metaURL, nil)
376390
if err != nil {
377391
return "", err
@@ -383,6 +397,9 @@ func (h *ComposerHandler) findDownloadURLFromMetadata(ctx context.Context, metaU
383397
}
384398
defer func() { _ = resp.Body.Close() }()
385399

400+
h.proxy.Logger.Debug("upstream metadata response",
401+
"url", metaURL, "status", resp.StatusCode)
402+
386403
if resp.StatusCode != http.StatusOK {
387404
return "", nil
388405
}
@@ -392,7 +409,27 @@ func (h *ComposerHandler) findDownloadURLFromMetadata(ctx context.Context, metaU
392409
return "", err
393410
}
394411

395-
return h.findDownloadURL(metadata, packageName, version), nil
412+
// Expand minified Composer v2 format so that inherited fields (including
413+
// dist) are present on every version entry. Without this, versions that
414+
// inherit dist from a previous entry will appear to have no download URL.
415+
if metadata["minified"] == "composer/2.0" {
416+
h.proxy.Logger.Debug("expanding minified metadata", "url", metaURL)
417+
if packages, ok := metadata["packages"].(map[string]any); ok {
418+
for pkgName, versions := range packages {
419+
versionList, ok := versions.([]any)
420+
if !ok {
421+
continue
422+
}
423+
packages[pkgName] = expandMinifiedVersions(versionList)
424+
}
425+
}
426+
}
427+
428+
url := h.findDownloadURL(metadata, packageName, version)
429+
h.proxy.Logger.Debug("download URL lookup result",
430+
"url", metaURL, "package", packageName, "version", version,
431+
"download_url", url)
432+
return url, nil
396433
}
397434

398435
// findDownloadURL finds the dist URL for a specific version in metadata.

0 commit comments

Comments
 (0)