Skip to content

Commit

Permalink
chore: add HTTP predicate (#71)
Browse files Browse the repository at this point in the history
  • Loading branch information
freak12techno committed Apr 25, 2024
1 parent 3eaccf9 commit 261a601
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 7 deletions.
36 changes: 30 additions & 6 deletions pkg/http/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,28 @@ func NewClient(chainName string, hosts []string, logger zerolog.Logger) *Client
}
}

func (client *Client) Get(url string, target interface{}) []types.NodeError {
func (client *Client) Get(
url string,
target interface{},
) []types.NodeError {
return client.GetWithPredicate(url, target, types.HTTPPredicateAlwaysPass())
}

func (client *Client) GetWithPredicate(
url string,
target interface{},
predicate types.HTTPPredicate,
) []types.NodeError {
nodeErrors := make([]types.NodeError, len(client.Hosts))

for index, lcd := range client.Hosts {
fullURL := lcd + url
client.Logger.Trace().Str("url", fullURL).Msg("Trying making request to LCD")

err := client.GetFull(
_, err := client.GetFull(
fullURL,
target,
predicate,
)

if err == nil {
Expand All @@ -51,13 +63,17 @@ func (client *Client) Get(url string, target interface{}) []types.NodeError {
return nodeErrors
}

func (client *Client) GetFull(url string, target interface{}) error {
func (client *Client) GetFull(
url string,
target interface{},
predicate types.HTTPPredicate,
) (http.Header, error) {
httpClient := &http.Client{Timeout: 300 * time.Second}
start := time.Now()

req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return err
return nil, err
}

req.Header.Set("User-Agent", "cosmos-proposals-checker")
Expand All @@ -67,11 +83,19 @@ func (client *Client) GetFull(url string, target interface{}) error {
res, err := httpClient.Do(req)
if err != nil {
client.Logger.Warn().Str("url", url).Err(err).Msg("Query failed")
return err
return nil, err
}
defer res.Body.Close()

if err := predicate(res); err != nil {
return nil, err
}

client.Logger.Debug().Str("url", url).Dur("duration", time.Since(start)).Msg("Query is finished")

return json.NewDecoder(res.Body).Decode(target)
if err := json.NewDecoder(res.Body).Decode(target); err != nil {
return nil, err
}

return res.Header, nil
}
5 changes: 4 additions & 1 deletion pkg/state/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,10 @@ func (g *Generator) ProcessChain(
return
}

g.Logger.Info().Int("len", len(proposals)).Msg("Got proposals")
g.Logger.Info().
Str("chain", chain.Name).
Int("len", len(proposals)).
Msg("Got proposals")

var wg sync.WaitGroup

Expand Down
41 changes: 41 additions & 0 deletions pkg/types/http_predicate.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package types

import (
"fmt"
"net/http"
"strconv"
)

type HTTPPredicate func(response *http.Response) error

func HTTPPredicateAlwaysPass() HTTPPredicate {
return func(response *http.Response) error {
return nil
}
}

func HTTPPredicateCheckHeightAfter(prevHeight int64) HTTPPredicate {
return func(response *http.Response) error {
currentHeightHeader := response.Header.Get("Grpc-Metadata-X-Cosmos-Block-Height")

// not returned height is ok
if currentHeightHeader == "" {
return nil
}

currentHeight, err := strconv.ParseInt(currentHeightHeader, 10, 64)
if err != nil {
return err
}

if prevHeight > currentHeight {
return fmt.Errorf(
"previous height (%d) is bigger than the current height (%d)",
prevHeight,
currentHeight,
)
}

return nil
}
}

0 comments on commit 261a601

Please sign in to comment.