@@ -3,8 +3,6 @@ package main
33import (
44 "bytes"
55 "context"
6- "crypto/tls"
7- "crypto/x509"
86 "encoding/json"
97 "errors"
108 "fmt"
@@ -42,8 +40,6 @@ func (client *ClickHouseClient) Query(ctx context.Context, query string) (*Respo
4240 return onErr (fmt .Errorf ("unable to parse clickhouse datasource url: %w" , err ))
4341 }
4442
45- httpClient := & http.Client {}
46- tlsConfig := & tls.Config {}
4743 var req * http.Request
4844 if client .settings .UsePost {
4945 req , err = http .NewRequest ("POST" , datasourceUrl .String (), bytes .NewBufferString (query ))
@@ -87,60 +83,56 @@ func (client *ClickHouseClient) Query(ctx context.Context, query string) (*Respo
8783 }
8884 }
8985
90- tlsCACert , tlsCACertExists := client .settings .Instance .DecryptedSecureJSONData ["tlsCACert" ]
91- tlsClientCert , tlsClientCertExists := client .settings .Instance .DecryptedSecureJSONData ["tlsClientCert" ]
92- tlsClientKey , tlsClientKeyExists := client .settings .Instance .DecryptedSecureJSONData ["tlsClientKey" ]
93-
94- if tlsCACertExists {
95- rootCA := x509 .NewCertPool ()
96- ok := rootCA .AppendCertsFromPEM ([]byte (tlsCACert ))
97- if ! ok {
98- return onErr (errors .New (fmt .Sprintf ("invalid tlsCACert: %s" , tlsCACert )))
99- }
100- tlsConfig .RootCAs = rootCA
101- }
102- if tlsClientCertExists != tlsClientKeyExists {
103- return onErr (errors .New ("please setup both tlsClientCert and tlsClientKey" ))
104- }
105- if tlsClientCertExists && tlsClientKeyExists {
106- clientKeyPair , err := tls .X509KeyPair ([]byte (tlsClientCert ), []byte (tlsClientKey ))
107- if err != nil {
108- return onErr (err )
109- }
110- tlsConfig .Certificates = append (tlsConfig .Certificates , clientKeyPair )
111- }
112- if client .settings .TLSSkipVerify {
113- tlsConfig .InsecureSkipVerify = true
114- }
115-
116- httpClient .Transport = & http.Transport {TLSClientConfig : tlsConfig }
11786 req = req .WithContext (ctx )
118- resp , err := httpClient .Do (req )
87+ if client .settings .HTTPClient == nil {
88+ return onErr (errors .New ("http client is not initialized" ))
89+ }
90+ resp , err := client .settings .HTTPClient .Do (req )
11991 if err != nil {
12092 return onErr (err )
12193 }
94+ defer func () {
95+ if closeErr := resp .Body .Close (); closeErr != nil {
96+ backend .Logger .Warn (fmt .Sprintf ("unable to close response body: %v" , closeErr ))
97+ }
98+ }()
12299
123100 var reader io.Reader
101+ closeEncodedReader := func () {}
124102 switch resp .Header .Get ("Content-Encoding" ) {
125103 case "gzip" :
126- reader , err = gzip .NewReader (resp .Body )
104+ gzipReader , gzipErr := gzip .NewReader (resp .Body )
105+ reader = gzipReader
106+ err = gzipErr
127107 if err != nil {
128108 return onErr (fmt .Errorf ("error creating GZIP reader: %v" , err ))
129109 }
110+ closeEncodedReader = func () {
111+ if closeErr := gzipReader .Close (); closeErr != nil {
112+ backend .Logger .Warn (fmt .Sprintf ("unable to close gzip reader: %v" , closeErr ))
113+ }
114+ }
130115 case "deflate" :
131- reader = flate .NewReader (resp .Body )
116+ flateReader := flate .NewReader (resp .Body )
117+ reader = flateReader
118+ closeEncodedReader = func () {
119+ if closeErr := flateReader .Close (); closeErr != nil {
120+ backend .Logger .Warn (fmt .Sprintf ("unable to close deflate reader: %v" , closeErr ))
121+ }
122+ }
132123 case "br" :
133124 reader = brotli .NewReader (resp .Body )
134125 case "zstd" :
135126 decoder , zstdErr := zstd .NewReader (resp .Body )
136127 if zstdErr != nil {
137128 return onErr (fmt .Errorf ("error creating ZSTD reader: %v" , zstdErr ))
138129 }
139- defer decoder .Close ()
140130 reader = decoder .IOReadCloser ()
131+ closeEncodedReader = decoder .Close
141132 default :
142133 reader = resp .Body
143134 }
135+ defer closeEncodedReader ()
144136
145137 body , err := io .ReadAll (reader )
146138 if err != nil {
0 commit comments