Skip to content

Commit 99d60b7

Browse files
authored
Client: Rework product check according to latest spec (#310)
Handling of Info special cases
1 parent 0cc2c99 commit 99d60b7

File tree

3 files changed

+48
-17
lines changed

3 files changed

+48
-17
lines changed

elasticsearch.go

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import (
2323
"encoding/json"
2424
"errors"
2525
"fmt"
26+
"io"
27+
"io/ioutil"
2628
"net/http"
2729
"net/url"
2830
"os"
@@ -339,41 +341,47 @@ func (c *Client) doProductCheck(f func() error) error {
339341
// productCheck runs an esapi.Info query to retrieve informations of the current cluster
340342
// decodes the response and decides if the cluster is a genuine Elasticsearch product.
341343
func (c *Client) productCheck() error {
342-
var info info
343-
344344
req := esapi.InfoRequest{}
345345
res, err := req.Do(context.Background(), c.Transport)
346346
if err != nil {
347347
return err
348348
}
349+
defer res.Body.Close()
349350

350351
if res.IsError() {
351-
return fmt.Errorf("cannot retrieve info from Elasticsearch")
352+
_, err = io.Copy(ioutil.Discard, res.Body)
353+
if err != nil {
354+
return err
355+
}
356+
switch res.StatusCode {
357+
case http.StatusUnauthorized:
358+
return nil
359+
case http.StatusForbidden:
360+
return nil
361+
default:
362+
return fmt.Errorf("cannot retrieve informations from Elasticsearch")
363+
}
352364
}
353365

354-
contentType := res.Header.Get("Content-Type")
355-
if res.Body != nil {
356-
defer res.Body.Close()
366+
err = genuineCheckHeader(res.Header)
357367

368+
if err != nil {
369+
var info info
370+
contentType := res.Header.Get("Content-Type")
358371
if strings.Contains(contentType, "json") {
359-
decoder := json.NewDecoder(res.Body)
360-
err = decoder.Decode(&info)
372+
err = json.NewDecoder(res.Body).Decode(&info)
361373
if err != nil {
362374
return fmt.Errorf("error decoding Elasticsearch informations: %s", err)
363375
}
364376
}
365377

366-
err = genuineCheckHeader(res.Header)
367-
368-
if err != nil {
369-
if info.Version.Number != "" {
370-
err = genuineCheckInfo(info)
371-
}
378+
if info.Version.Number != "" {
379+
err = genuineCheckInfo(info)
372380
}
381+
}
373382

374-
if err != nil {
375-
return err
376-
}
383+
if err != nil {
384+
return err
377385
}
378386

379387
return nil

elasticsearch_internal_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,7 @@ func TestResponseCheckOnly(t *testing.T) {
644644
useResponseCheckOnly: false,
645645
response: &http.Response{
646646
StatusCode: http.StatusInternalServerError,
647+
Body: ioutil.NopCloser(strings.NewReader("")),
647648
},
648649
requestErr: nil,
649650
wantErr: true,
@@ -653,10 +654,31 @@ func TestResponseCheckOnly(t *testing.T) {
653654
useResponseCheckOnly: false,
654655
response: &http.Response{
655656
StatusCode: http.StatusNotFound,
657+
Body: ioutil.NopCloser(strings.NewReader("")),
656658
},
657659
requestErr: nil,
658660
wantErr: true,
659661
},
662+
{
663+
name: "Valid request, 403 response",
664+
useResponseCheckOnly: false,
665+
response: &http.Response{
666+
StatusCode: http.StatusForbidden,
667+
Body: ioutil.NopCloser(strings.NewReader("")),
668+
},
669+
requestErr: nil,
670+
wantErr: false,
671+
},
672+
{
673+
name: "Valid request, 401 response",
674+
useResponseCheckOnly: false,
675+
response: &http.Response{
676+
StatusCode: http.StatusUnauthorized,
677+
Body: ioutil.NopCloser(strings.NewReader("")),
678+
},
679+
requestErr: nil,
680+
wantErr: false,
681+
},
660682
}
661683
for _, tt := range tests {
662684
t.Run(tt.name, func(t *testing.T) {

esapi/esapi_benchmark_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ var (
4343
return &http.Response{
4444
StatusCode: 200,
4545
Header: http.Header{"X-Elastic-Product": []string{"Elasticsearch"}},
46+
Body: ioutil.NopCloser(strings.NewReader("{}")),
4647
}, nil
4748
}
4849
return &http.Response{

0 commit comments

Comments
 (0)