diff --git a/pkg/constants/constants.go b/pkg/constants/constants.go new file mode 100644 index 0000000..63c8cf2 --- /dev/null +++ b/pkg/constants/constants.go @@ -0,0 +1,3 @@ +package constants + +const HeaderBlockHeight = "Grpc-Metadata-X-Cosmos-Block-Height" diff --git a/pkg/fetchers/cosmos/proposals_v1.go b/pkg/fetchers/cosmos/proposals_v1.go index 706b535..300b7a4 100644 --- a/pkg/fetchers/cosmos/proposals_v1.go +++ b/pkg/fetchers/cosmos/proposals_v1.go @@ -21,13 +21,21 @@ func (rpc *RPC) GetAllV1Proposals() ([]types.Proposal, *types.QueryError) { ) var batchProposals responses.V1ProposalsRPCResponse - if errs := rpc.Client.Get(url, &batchProposals); len(errs) > 0 { + errs, header := rpc.Client.GetWithPredicate(url, &batchProposals, types.HTTPPredicateAlwaysPass()) + if len(errs) > 0 { return nil, &types.QueryError{ QueryError: nil, NodeErrors: errs, } } + _, err := utils.GetBlockHeightFromHeader(header) + if err != nil { + return nil, &types.QueryError{ + QueryError: errors.New("got error when parsing proposal height"), + } + } + if batchProposals.Message != "" { return nil, &types.QueryError{ QueryError: errors.New(batchProposals.Message), diff --git a/pkg/http/client.go b/pkg/http/client.go index 53f4d68..b1a426b 100644 --- a/pkg/http/client.go +++ b/pkg/http/client.go @@ -28,28 +28,29 @@ func (client *Client) Get( url string, target interface{}, ) []types.NodeError { - return client.GetWithPredicate(url, target, types.HTTPPredicateAlwaysPass()) + errs, _ := client.GetWithPredicate(url, target, types.HTTPPredicateAlwaysPass()) + return errs } func (client *Client) GetWithPredicate( url string, target interface{}, predicate types.HTTPPredicate, -) []types.NodeError { +) ([]types.NodeError, http.Header) { 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( + header, err := client.GetFull( fullURL, target, predicate, ) if err == nil { - return nil + return nil, header } client.Logger.Warn().Str("url", fullURL).Err(err).Msg("LCD request failed") @@ -60,7 +61,7 @@ func (client *Client) GetWithPredicate( } client.Logger.Warn().Str("url", url).Msg("All LCD requests failed") - return nodeErrors + return nodeErrors, nil } func (client *Client) GetFull( diff --git a/pkg/types/http_predicate.go b/pkg/types/http_predicate.go index 99b5617..a71666c 100644 --- a/pkg/types/http_predicate.go +++ b/pkg/types/http_predicate.go @@ -2,8 +2,8 @@ package types import ( "fmt" + "main/pkg/utils" "net/http" - "strconv" ) type HTTPPredicate func(response *http.Response) error @@ -16,14 +16,7 @@ func HTTPPredicateAlwaysPass() HTTPPredicate { 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) + currentHeight, err := utils.GetBlockHeightFromHeader(response.Header) if err != nil { return err } diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 90faaf2..8a02924 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -2,7 +2,10 @@ package utils import ( "fmt" + "main/pkg/constants" "math" + "net/http" + "strconv" "strings" "time" ) @@ -68,3 +71,17 @@ func FormatDuration(duration time.Duration) string { return strings.Join(parts, " ") } + +func GetBlockHeightFromHeader(header http.Header) (int64, error) { + valueStr := header.Get(constants.HeaderBlockHeight) + if valueStr == "" { + return 0, nil + } + + value, err := strconv.ParseInt(valueStr, 10, 64) + if err != nil { + return 0, err + } + + return value, nil +}