@ -21,6 +21,8 @@ import (
"io"
"io/fs"
"net/url"
"net/http"
"net/http/httputil"
"os"
"path/filepath"
"strings"
@ -69,11 +71,44 @@ type ChartDownloader struct {
Getters getter . Providers
// Options provide parameters to be passed along to the Getter being initialized.
Options [ ] getter . Option
Debug bool //Added to capture the --debug flag
RegistryClient * registry . Client
RepositoryConfig string
RepositoryCache string
}
type debugTransport struct {
* http . Transport
out io . Writer
}
func ( t * debugTransport ) RoundTrip ( req * http . Request ) ( * http . Response , error ) {
fmt . Fprintf ( t . out , "DEBUG: HTTP request to %s\n" , req . URL . String ( ) )
// Log the request
reqDump , err := httputil . DumpRequestOut ( req , false )
if err == nil {
fmt . Fprintf ( t . out , "%s\n" , reqDump )
}
// Perform the request
resp , err := t . Transport . RoundTrip ( req )
if err != nil {
fmt . Fprintf ( t . out , "HTTP request failed: %v\n" , err )
return nil , err
}
// Log the response
respDump , err := httputil . DumpResponse ( resp , false )
if err == nil {
fmt . Fprintf ( t . out , "HTTP Response: \n%s\n" , respDump )
}
if resp . StatusCode >= 300 && resp . StatusCode < 400 {
location , _ := resp . Header [ "Location" ]
fmt . Fprintf ( t . out , "DEBUG: Redirect to: %v\n" , location )
}
return resp , err
}
// DownloadTo retrieves a chart. Depending on the settings, it may also download a provenance file.
//
// If Verify is set to VerifyNever, the verification will be nil.
@ -88,18 +123,37 @@ type ChartDownloader struct {
func ( c * ChartDownloader ) DownloadTo ( ref , version , dest string ) ( string , * provenance . Verification , error ) {
u , err := c . ResolveChartVersion ( ref , version )
if err != nil {
fmt . Fprintf ( c . Out , "DEBUG: Failed to resolve chart version: %v\n" , err )
return "" , nil , err
}
fmt . Fprintf ( c . Out , "DEBUG: Resolved chart URL: %s\n" , u . String ( ) )
g , err := c . Getters . ByScheme ( u . Scheme )
if err != nil {
fmt . Fprintf ( c . Out , "DEBUG: Failed to get getter for scheme %s: %v\n" , u . Scheme , err )
return "" , nil , err
}
fmt . Fprintf ( c . Out , "DEBUG: Using getter for scheme: %s\n" , u . Scheme )
c . Options = append ( c . Options , getter . WithAcceptHeader ( "application/gzip,application/octet-stream" ) )
// If debug is enabled, wrap the getter's HTTP client with a debug transport
if c . Debug {
dt := & debugTransport {
Transport : http . DefaultTransport . ( * http . Transport ) . Clone ( ) ,
out : c . Out ,
}
dt . Transport . DisableKeepAlives = true
c . Options = append ( c . Options , getter . WithClient ( & http . Client {
Transport : dt ,
CheckRedirect : func ( req * http . Request , via [ ] * http . Request ) error {
fmt . Fprintf ( c . Out , "DEBUG: Following redirect to %s\n" , req . URL . String ( ) )
return nil
} ,
} ) )
}
data , err := g . Get ( u . String ( ) , c . Options ... )
if err != nil {
fmt . Fprintf ( c . Out , "DEBUG: Failed to fetch chart: %v\n" , err )
return "" , nil , err
}
@ -117,6 +171,21 @@ func (c *ChartDownloader) DownloadTo(ref, version, dest string) (string, *proven
// If provenance is requested, verify it.
ver := & provenance . Verification { }
if c . Verify > VerifyNever {
// If debug is enabled, use the same debug transport for provenance file
if c . Debug {
dt := & debugTransport {
Transport : http . DefaultTransport . ( * http . Transport ) . Clone ( ) ,
out : c . Out ,
}
dt . Transport . DisableKeepAlives = true
c . Options = append ( c . Options , getter . WithClient ( & http . Client {
Transport : dt ,
CheckRedirect : func ( req * http . Request , via [ ] * http . Request ) error {
fmt . Fprintf ( c . Out , "DEBUG: Following redirect to %s\n" , req . URL . String ( ) )
return nil
} ,
} ) )
}
body , err := g . Get ( u . String ( ) + ".prov" )
if err != nil {
if c . Verify == VerifyAlways {