From 56dfed531bfa19c954871ace58437e575335110d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Wed, 10 Aug 2022 10:53:07 +0200 Subject: [PATCH] api: fix writing response headers to terminal pager --- pkg/cmd/api/api.go | 29 ++++++++++++++++------------- pkg/cmd/api/api_test.go | 2 +- pkg/export/template.go | 6 ++---- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/pkg/cmd/api/api.go b/pkg/cmd/api/api.go index 02b288fa6..73bb66157 100644 --- a/pkg/cmd/api/api.go +++ b/pkg/cmd/api/api.go @@ -272,10 +272,7 @@ func apiRun(opts *ApiOptions) error { httpClient = api.NewCachedHTTPClient(httpClient, opts.CacheTTL) } - headersOutputStream := opts.IO.Out - if opts.Silent { - opts.IO.Out = io.Discard - } else { + if !opts.Silent { if err := opts.IO.StartPager(); err == nil { defer opts.IO.StopPager() } else { @@ -283,6 +280,12 @@ func apiRun(opts *ApiOptions) error { } } + bodyWriter := opts.IO.Out + headersWriter := opts.IO.Out + if opts.Silent { + bodyWriter = io.Discard + } + cfg, err := opts.Config() if err != nil { return err @@ -303,7 +306,7 @@ func apiRun(opts *ApiOptions) error { return err } - endCursor, err := processResponse(resp, opts, headersOutputStream, &template) + endCursor, err := processResponse(resp, opts, bodyWriter, headersWriter, &template) if err != nil { return err } @@ -330,11 +333,11 @@ func apiRun(opts *ApiOptions) error { return template.End() } -func processResponse(resp *http.Response, opts *ApiOptions, headersOutputStream io.Writer, template *export.Template) (endCursor string, err error) { +func processResponse(resp *http.Response, opts *ApiOptions, bodyWriter, headersWriter io.Writer, template *export.Template) (endCursor string, err error) { if opts.ShowResponseHeaders { - fmt.Fprintln(headersOutputStream, resp.Proto, resp.Status) - printHeaders(headersOutputStream, resp.Header, opts.IO.ColorEnabled()) - fmt.Fprint(headersOutputStream, "\r\n") + fmt.Fprintln(headersWriter, resp.Proto, resp.Status) + printHeaders(headersWriter, resp.Header, opts.IO.ColorEnabled()) + fmt.Fprint(headersWriter, "\r\n") } if resp.StatusCode == 204 { @@ -362,20 +365,20 @@ func processResponse(resp *http.Response, opts *ApiOptions, headersOutputStream if opts.FilterOutput != "" && serverError == "" { // TODO: reuse parsed query across pagination invocations - err = export.FilterJSON(opts.IO.Out, responseBody, opts.FilterOutput) + err = export.FilterJSON(bodyWriter, responseBody, opts.FilterOutput) if err != nil { return } } else if opts.Template != "" && serverError == "" { // TODO: reuse parsed template across pagination invocations - err = template.Execute(responseBody) + err = template.Execute(bodyWriter, responseBody) if err != nil { return } } else if isJSON && opts.IO.ColorEnabled() { - err = jsoncolor.Write(opts.IO.Out, responseBody, " ") + err = jsoncolor.Write(bodyWriter, responseBody, " ") } else { - _, err = io.Copy(opts.IO.Out, responseBody) + _, err = io.Copy(bodyWriter, responseBody) } if err != nil { return diff --git a/pkg/cmd/api/api_test.go b/pkg/cmd/api/api_test.go index bb6928d66..0e25cd7f4 100644 --- a/pkg/cmd/api/api_test.go +++ b/pkg/cmd/api/api_test.go @@ -1299,7 +1299,7 @@ func Test_processResponse_template(t *testing.T) { Template: `{{range .}}{{.title}} ({{.labels | pluck "name" | join ", " }}){{"\n"}}{{end}}`, } template := export.NewTemplate(ios, opts.Template) - _, err := processResponse(&resp, &opts, io.Discard, &template) + _, err := processResponse(&resp, &opts, ios.Out, io.Discard, &template) require.NoError(t, err) err = template.End() diff --git a/pkg/export/template.go b/pkg/export/template.go index bc0986d78..83630e1ae 100644 --- a/pkg/export/template.go +++ b/pkg/export/template.go @@ -76,9 +76,7 @@ func (t *Template) parseTemplate(tpl string) (*template.Template, error) { return template.New("").Funcs(templateFuncs).Parse(tpl) } -func (t *Template) Execute(input io.Reader) error { - w := t.io.Out - +func (t *Template) Execute(w io.Writer, input io.Reader) error { if t.template == nil { template, err := t.parseTemplate(t.templateStr) if err != nil { @@ -103,7 +101,7 @@ func (t *Template) Execute(input io.Reader) error { func ExecuteTemplate(io *iostreams.IOStreams, input io.Reader, template string) error { t := NewTemplate(io, template) - if err := t.Execute(input); err != nil { + if err := t.Execute(io.Out, input); err != nil { return err } return t.End()