Skip to content

Commit 7204688

Browse files
committed
refactor(agent): nice client
1 parent 286e49d commit 7204688

File tree

2 files changed

+88
-76
lines changed

2 files changed

+88
-76
lines changed

internal/agent/client/client.go

Lines changed: 25 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,132 +1,81 @@
1-
// HTTP Client
1+
// Client for working with the server
22
package client
33

44
import (
5-
"bytes"
6-
"compress/flate"
7-
"compress/gzip"
85
"encoding/json"
96
"errors"
10-
"fmt"
11-
"reflect"
127
"strings"
13-
"time"
148

159
"github.com/go-resty/resty/v2"
1610
"github.com/srg-bnd/observator/internal/agent/models"
1711
"github.com/srg-bnd/observator/internal/server/logger"
12+
"github.com/srg-bnd/observator/internal/shared/services"
1813
"go.uber.org/zap"
1914
)
2015

21-
var ErrBadHashSum = errors.New("bad hashSHA256")
16+
var ErrBadHashSum = errors.New("bad hash")
2217

18+
// TODO: uses `ChecksumBehaviour` instead of `services.Checksum`
2319
type ChecksumBehaviour interface {
2420
Sum(string) (string, error)
2521
}
2622

2723
// Client
2824
type Client struct {
29-
client *resty.Client
30-
baseURL string
31-
checksumService ChecksumBehaviour
25+
httpClient *resty.Client
26+
checksumService *services.Checksum
3227
}
3328

3429
// Returns a new client
35-
func NewClient(baseURL string, checksumService ChecksumBehaviour) *Client {
30+
func NewClient(baseURL string, checksumService *services.Checksum) *Client {
3631
return &Client{
37-
client: resty.New(),
38-
// HACK
39-
baseURL: "http://" + baseURL,
32+
httpClient: newHttpClient(baseURL),
4033
checksumService: checksumService,
4134
}
4235
}
4336

44-
// Sends batch of metrics to the server
37+
// Sends batch of metrics
4538
func (c *Client) SendMetrics(metrics []models.Metrics) error {
4639
data, err := json.Marshal(&metrics)
4740
if err != nil {
4841
return err
4942
}
5043

51-
// Compress data
5244
compressedData, err := compress(data)
5345
if err != nil {
5446
return err
5547
}
5648

57-
// Retriable errors
58-
repetitionIntervals := [3]int{1, 3, 5}
59-
currentRepetitionInterval := -1
60-
61-
// Init client
62-
c.client.
63-
SetRetryCount(len(repetitionIntervals)).
64-
SetRetryAfter(func(c *resty.Client, r *resty.Response) (time.Duration, error) {
65-
currentRepetitionInterval++
66-
return time.Duration(repetitionIntervals[currentRepetitionInterval]) * time.Second, nil
67-
}).
68-
SetRetryMaxWaitTime(5 * time.Second)
69-
70-
// Execute a request
71-
request := c.client.R().SetBody(compressedData).
72-
SetHeader("Content-Type", "application/json").
73-
SetHeader("Accept-Encoding", "gzip").
74-
SetHeader("Content-Encoding", "gzip")
75-
76-
if reflect.ValueOf(c.checksumService).Kind() == reflect.Ptr && !reflect.ValueOf(c.checksumService).IsNil() {
77-
hash, err := c.checksumService.Sum(string(data))
78-
if err != nil {
79-
logger.Log.Warn("bad hash (SHA256)", zap.Error(ErrBadHashSum))
80-
return err
81-
} else {
82-
request = request.SetHeader("HashSHA256", string(hash))
83-
}
49+
request := c.httpClient.R().SetBody(compressedData)
50+
request, err = c.withChecksum(request, data)
51+
if err != nil {
52+
return err
8453
}
8554

86-
res, err := request.Post(c.baseURL + "/updates")
55+
response, err := request.Post("/updates")
8756
if err != nil {
8857
return err
8958
}
9059

91-
// Decompress response
92-
if strings.Contains(res.Header().Get("Accept-Encoding"), "gzip") {
93-
decompress(res.Body())
60+
if strings.Contains(response.Header().Get("Accept-Encoding"), "gzip") {
61+
// TODO: use the results
62+
decompress(response.Body())
9463
}
9564

9665
return nil
9766
}
9867

99-
// Helpers
100-
101-
// Compress data
102-
func compress(data []byte) ([]byte, error) {
103-
var b bytes.Buffer
104-
105-
w := gzip.NewWriter(&b)
106-
107-
_, err := w.Write(data)
108-
if err != nil {
109-
return nil, fmt.Errorf("failed write data to compress temporary buffer: %v", err)
110-
}
111-
112-
err = w.Close()
113-
if err != nil {
114-
return nil, fmt.Errorf("failed compress data: %v", err)
68+
// Sets a checksum if need
69+
func (c *Client) withChecksum(request *resty.Request, data []byte) (*resty.Request, error) {
70+
if c.checksumService != nil {
71+
return request, nil
11572
}
11673

117-
return b.Bytes(), nil
118-
}
119-
120-
// Decompress data
121-
func decompress(compressedData []byte) ([]byte, error) {
122-
r := flate.NewReader(bytes.NewReader(compressedData))
123-
defer r.Close()
124-
125-
var b bytes.Buffer
126-
_, err := b.ReadFrom(r)
74+
hash, err := c.checksumService.Sum(string(data))
12775
if err != nil {
128-
return nil, fmt.Errorf("failed decompress data: %v", err)
76+
logger.Log.Warn(ErrBadHashSum.Error(), zap.Error(ErrBadHashSum))
77+
return request, nil
12978
}
13079

131-
return b.Bytes(), nil
80+
return request.SetHeader("HashSHA256", string(hash)), nil
13281
}

internal/agent/client/helpers.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package client
2+
3+
import (
4+
"bytes"
5+
"compress/flate"
6+
"compress/gzip"
7+
"fmt"
8+
"time"
9+
10+
"github.com/go-resty/resty/v2"
11+
)
12+
13+
// Returns a new http client (resty)
14+
func newHttpClient(baseURL string) *resty.Client {
15+
// Retriable errors
16+
repetitionIntervals := [3]int{1, 3, 5}
17+
currentRepetitionInterval := -1
18+
19+
return resty.New().
20+
SetBaseURL("http://"+baseURL).
21+
SetRetryCount(len(repetitionIntervals)).
22+
SetRetryAfter(func(c *resty.Client, r *resty.Response) (time.Duration, error) {
23+
currentRepetitionInterval++
24+
return time.Duration(repetitionIntervals[currentRepetitionInterval]) * time.Second, nil
25+
}).
26+
SetRetryMaxWaitTime(5*time.Second).
27+
SetHeader("Content-Type", "application/json").
28+
SetHeader("Accept-Encoding", "gzip").
29+
SetHeader("Content-Encoding", "gzip")
30+
}
31+
32+
// Compress data
33+
func compress(data []byte) ([]byte, error) {
34+
var b bytes.Buffer
35+
36+
w := gzip.NewWriter(&b)
37+
38+
_, err := w.Write(data)
39+
if err != nil {
40+
return nil, fmt.Errorf("failed write data to compress temporary buffer: %v", err)
41+
}
42+
43+
err = w.Close()
44+
if err != nil {
45+
return nil, fmt.Errorf("failed compress data: %v", err)
46+
}
47+
48+
return b.Bytes(), nil
49+
}
50+
51+
// Decompress data
52+
func decompress(compressedData []byte) ([]byte, error) {
53+
r := flate.NewReader(bytes.NewReader(compressedData))
54+
defer r.Close()
55+
56+
var b bytes.Buffer
57+
_, err := b.ReadFrom(r)
58+
if err != nil {
59+
return nil, fmt.Errorf("failed decompress data: %v", err)
60+
}
61+
62+
return b.Bytes(), nil
63+
}

0 commit comments

Comments
 (0)