diff --git a/cmd/ogen/main.go b/cmd/ogen/main.go index 79493d58a..2bfdbb1a3 100644 --- a/cmd/ogen/main.go +++ b/cmd/ogen/main.go @@ -150,6 +150,7 @@ func parseSpecPath( p string, client *http.Client, readFile func(string) ([]byte, error), + logger *zap.Logger, ) (f file, opts gen.RemoteOptions, _ error) { // FIXME(tdakkota): pass context. if u, _ := url.Parse(p); u != nil { @@ -177,10 +178,11 @@ func parseSpecPath( rootURL: u, } opts = gen.RemoteOptions{ + HTTPClient: client, ReadFile: func(p string) ([]byte, error) { return nil, errors.New("local files are not supported in remote mode") }, - HTTPClient: client, + Logger: logger, } return f, opts, nil case "": @@ -208,6 +210,7 @@ func parseSpecPath( opts = gen.RemoteOptions{ HTTPClient: client, ReadFile: readFile, + Logger: logger, } return f, opts, nil @@ -336,6 +339,7 @@ func run() error { specPath, &http.Client{Timeout: time.Minute}, os.ReadFile, + logger.Named("remote"), ) if err != nil { return err diff --git a/jsonschema/external.go b/jsonschema/external.go index c400b0d95..566fd14e3 100644 --- a/jsonschema/external.go +++ b/jsonschema/external.go @@ -6,8 +6,10 @@ import ( "net/http" "net/url" "os" + "time" "github.com/go-faster/errors" + "go.uber.org/zap" ) // ExternalResolver resolves external links. @@ -31,6 +33,8 @@ type ExternalOptions struct { HTTPClient *http.Client // ReadFile sets function for reading files from fs. Defaults to os.ReadFile. ReadFile func(p string) ([]byte, error) + // Logger sets logger to use. Defaults to zap.NewNop(). + Logger *zap.Logger } func (r *ExternalOptions) setDefaults() { @@ -40,6 +44,9 @@ func (r *ExternalOptions) setDefaults() { if r.ReadFile == nil { r.ReadFile = os.ReadFile } + if r.Logger == nil { + r.Logger = zap.NewNop() + } } var _ ExternalResolver = externalResolver{} @@ -47,6 +54,7 @@ var _ ExternalResolver = externalResolver{} type externalResolver struct { client *http.Client readFile func(p string) ([]byte, error) + logger *zap.Logger } // NewExternalResolver creates new ExternalResolver. @@ -58,6 +66,7 @@ func NewExternalResolver(opts ExternalOptions) ExternalResolver { return externalResolver{ client: opts.HTTPClient, readFile: opts.ReadFile, + logger: opts.Logger, } } @@ -70,6 +79,7 @@ func (e externalResolver) httpGet(ctx context.Context, u *url.URL) ([]byte, erro req.SetBasicAuth(u.User.Username(), pass) } + start := time.Now() resp, err := e.client.Do(req) if err != nil { return nil, errors.Wrap(err, "do") @@ -79,6 +89,11 @@ func (e externalResolver) httpGet(ctx context.Context, u *url.URL) ([]byte, erro _ = resp.Body.Close() } }() + e.logger.Debug("Get", + zap.String("url", u.Redacted()), + zap.Int("status", resp.StatusCode), + zap.Duration("duration", time.Since(start)), + ) if code := resp.StatusCode; code >= 299 { text := http.StatusText(code)