@@ -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.
374385func (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