From fff0da8fe96134bee041c8156d675e1255f1626b Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Tue, 9 Nov 2021 07:04:44 -0700 Subject: [PATCH] DataProxy: Fix issue overriding response body when response status is 101 (#41364) (#41476) When a request going through Grafana data source proxy responds with a websocket upgrade response we cannot override the response body since it produces an error. This problem seems to have been introduced in Grafana v8.0 by #38962. In addition #40303 added same problem. Fixes #41292 (cherry picked from commit 3be452f995e053f64b083acdf49cab02bede7a7f) Co-authored-by: Marcus Efraimsson --- .../httpclientprovider/datasource_metrics_middleware.go | 2 +- .../httpclientprovider/response_limit_middleware.go | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/infra/httpclient/httpclientprovider/datasource_metrics_middleware.go b/pkg/infra/httpclient/httpclientprovider/datasource_metrics_middleware.go index 2709ed6ab76..bfb722ef4cd 100644 --- a/pkg/infra/httpclient/httpclientprovider/datasource_metrics_middleware.go +++ b/pkg/infra/httpclient/httpclientprovider/datasource_metrics_middleware.go @@ -96,7 +96,7 @@ func executeMiddleware(next http.RoundTripper, datasourceLabel prometheus.Labels return nil, err } - if res != nil { + if res != nil && res.StatusCode != http.StatusSwitchingProtocols { res.Body = httpclient.CountBytesReader(res.Body, func(bytesRead int64) { responseSizeSummary.Observe(float64(bytesRead)) }) diff --git a/pkg/infra/httpclient/httpclientprovider/response_limit_middleware.go b/pkg/infra/httpclient/httpclientprovider/response_limit_middleware.go index c17c70b3516..97d8285d4cb 100644 --- a/pkg/infra/httpclient/httpclientprovider/response_limit_middleware.go +++ b/pkg/infra/httpclient/httpclientprovider/response_limit_middleware.go @@ -21,7 +21,10 @@ func ResponseLimitMiddleware(limit int64) sdkhttpclient.Middleware { return nil, err } - res.Body = httpclient.MaxBytesReader(res.Body, limit) + if res != nil && res.StatusCode != http.StatusSwitchingProtocols { + res.Body = httpclient.MaxBytesReader(res.Body, limit) + } + return res, nil }) })