99 "fmt"
1010 "io"
1111 "io/fs"
12- "log"
12+ "log/slog "
1313 "net/http"
1414 "net/url"
1515 "os"
@@ -67,15 +67,17 @@ type Goproxy struct {
6767 // If Transport is nil, [http.DefaultTransport] is used.
6868 Transport http.RoundTripper
6969
70- // ErrorLogger is used to log errors that occur during proxying.
70+ // Logger is used to log messages that occur during proxying. It is
71+ // currently used only for error messages.
7172 //
72- // If ErrorLogger is nil, [log .Default] is used.
73- ErrorLogger * log .Logger
73+ // If Logger is nil, [slog .Default] is used.
74+ Logger * slog .Logger
7475
7576 initOnce sync.Once
7677 fetcher Fetcher
7778 proxiedSumDBs map [string ]* url.URL
7879 httpClient * http.Client
80+ logger * slog.Logger
7981}
8082
8183// init initializes the g.
@@ -104,6 +106,11 @@ func (g *Goproxy) init() {
104106 }
105107
106108 g .httpClient = & http.Client {Transport : g .Transport }
109+
110+ g .logger = g .Logger
111+ if g .logger == nil {
112+ g .logger = slog .Default ().WithGroup ("goproxy" )
113+ }
107114}
108115
109116// ServeHTTP implements [http.Handler].
@@ -203,7 +210,7 @@ func (g *Goproxy) serveFetchQuery(rw http.ResponseWriter, req *http.Request, tar
203210 version , time , err := g .fetcher .Query (req .Context (), modulePath , moduleQuery )
204211 if err != nil {
205212 g .serveCache (rw , req , target , contentType , cacheControlMaxAge , func () {
206- g .logErrorf ("failed to query module version: %s: %v" , target , err )
213+ g .logger . Error ("failed to query module version" , "error" , err , " target" , target )
207214 responseError (rw , req , err , true )
208215 })
209216 return
@@ -224,7 +231,7 @@ func (g *Goproxy) serveFetchList(rw http.ResponseWriter, req *http.Request, targ
224231 versions , err := g .fetcher .List (req .Context (), modulePath )
225232 if err != nil {
226233 g .serveCache (rw , req , target , contentType , cacheControlMaxAge , func () {
227- g .logErrorf ("failed to list module versions: %s: %v" , target , err )
234+ g .logger . Error ("failed to list module versions" , "error" , err , " target" , target )
228235 responseError (rw , req , err , true )
229236 })
230237 return
@@ -256,14 +263,14 @@ func (g *Goproxy) serveFetchDownload(rw http.ResponseWriter, req *http.Request,
256263 responseSuccess (rw , req , content , contentType , cacheControlMaxAge )
257264 return
258265 } else if ! errors .Is (err , fs .ErrNotExist ) {
259- g .logErrorf ("failed to get cached module file: %s: %v" , target , err )
266+ g .logger . Error ("failed to get cached module file" , "error" , err , " target" , target )
260267 responseInternalServerError (rw , req )
261268 return
262269 }
263270
264271 info , mod , zip , err := g .fetcher .Download (req .Context (), modulePath , moduleVersion )
265272 if err != nil {
266- g .logErrorf ("failed to download module version: %s: %v" , target , err )
273+ g .logger . Error ("failed to download module version" , "error" , err , " target" , target )
267274 responseError (rw , req , err , false )
268275 return
269276 }
@@ -283,7 +290,7 @@ func (g *Goproxy) serveFetchDownload(rw http.ResponseWriter, req *http.Request,
283290 {".zip" , zip },
284291 } {
285292 if err := g .putCache (req .Context (), targetWithoutExt + cache .ext , cache .content ); err != nil {
286- g .logErrorf ("failed to cache module file: %s: %v" , target , err )
293+ g .logger . Error ("failed to cache module file" , "error" , err , " target" , target )
287294 responseInternalServerError (rw , req )
288295 return
289296 }
@@ -299,7 +306,7 @@ func (g *Goproxy) serveFetchDownload(rw http.ResponseWriter, req *http.Request,
299306 content = zip
300307 }
301308 if _ , err := content .Seek (0 , io .SeekStart ); err != nil {
302- g .logErrorf ("failed to seek: %v " , err )
309+ g .logger . Error ("failed to seek content" , "error " , err )
303310 responseInternalServerError (rw , req )
304311 return
305312 }
@@ -345,7 +352,7 @@ func (g *Goproxy) serveSumDB(rw http.ResponseWriter, req *http.Request, target s
345352
346353 tempDir , err := os .MkdirTemp (g .TempDir , tempDirPattern )
347354 if err != nil {
348- g .logErrorf ("failed to create temporary directory: %v " , err )
355+ g .logger . Error ("failed to create temporary directory" , "error " , err )
349356 responseInternalServerError (rw , req )
350357 return
351358 }
@@ -354,7 +361,7 @@ func (g *Goproxy) serveSumDB(rw http.ResponseWriter, req *http.Request, target s
354361 file , err := httpGetTemp (req .Context (), g .httpClient , u .JoinPath (path ).String (), tempDir )
355362 if err != nil {
356363 g .serveCache (rw , req , target , contentType , cacheControlMaxAge , func () {
357- g .logErrorf ("failed to proxy checksum database: %s: %v" , target , err )
364+ g .logger . Error ("failed to proxy checksum database" , "error" , err , " target" , target )
358365 responseError (rw , req , err , true )
359366 })
360367 return
@@ -374,7 +381,7 @@ func (g *Goproxy) serveCache(rw http.ResponseWriter, req *http.Request, name, co
374381 }
375382 return
376383 }
377- g .logErrorf ("failed to get cached module file: %s: %v" , name , err )
384+ g .logger . Error ("failed to get cached module file" , "error" , err , " name" , name )
378385 responseInternalServerError (rw , req )
379386 return
380387 }
@@ -385,12 +392,12 @@ func (g *Goproxy) serveCache(rw http.ResponseWriter, req *http.Request, name, co
385392// servePutCache serves requests after putting the content to the g.Cacher.
386393func (g * Goproxy ) servePutCache (rw http.ResponseWriter , req * http.Request , name , contentType string , cacheControlMaxAge int , content io.ReadSeeker ) {
387394 if err := g .putCache (req .Context (), name , content ); err != nil {
388- g .logErrorf ("failed to cache module file: %s: %v" , name , err )
395+ g .logger . Error ("failed to cache module file" , "error" , err , " name" , name )
389396 responseInternalServerError (rw , req )
390397 return
391398 }
392399 if _ , err := content .Seek (0 , io .SeekStart ); err != nil {
393- g .logErrorf ("failed to seek: %v " , err )
400+ g .logger . Error ("failed to seek content" , "error " , err )
394401 responseInternalServerError (rw , req )
395402 return
396403 }
@@ -402,7 +409,7 @@ func (g *Goproxy) servePutCache(rw http.ResponseWriter, req *http.Request, name,
402409func (g * Goproxy ) servePutCacheFile (rw http.ResponseWriter , req * http.Request , name , contentType string , cacheControlMaxAge int , file string ) {
403410 f , err := os .Open (file )
404411 if err != nil {
405- g .logErrorf ("failed to open file: %v " , err )
412+ g .logger . Error ("failed to open file" , "error " , err )
406413 responseInternalServerError (rw , req )
407414 return
408415 }
@@ -436,16 +443,6 @@ func (g *Goproxy) putCacheFile(ctx context.Context, name, file string) error {
436443 return g .putCache (ctx , name , f )
437444}
438445
439- // logErrorf formats according to a format specifier and writes to the g.ErrorLogger.
440- func (g * Goproxy ) logErrorf (format string , v ... any ) {
441- msg := "goproxy: " + fmt .Sprintf (format , v ... )
442- if g .ErrorLogger != nil {
443- g .ErrorLogger .Output (2 , msg )
444- } else {
445- log .Output (2 , msg )
446- }
447- }
448-
449446// cleanPath returns the canonical path for the p.
450447func cleanPath (p string ) string {
451448 if p == "" {
0 commit comments