Skip to content

Commit

Permalink
chore: move HTTP requests to different class
Browse files Browse the repository at this point in the history
  • Loading branch information
freak12techno committed Dec 22, 2023
1 parent 7fd94ab commit 8d352cd
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 64 deletions.
63 changes: 4 additions & 59 deletions pkg/fetchers/cosmos/fetcher.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
package cosmos

import (
"encoding/json"
"main/pkg/fetchers/cosmos/responses"
"net/http"
"time"

"main/pkg/http"
"main/pkg/types"

"github.com/rs/zerolog"
Expand All @@ -15,17 +12,17 @@ const PaginationLimit = 1000

type RPC struct {
ChainConfig *types.Chain
URLs []string
ProposalsType string
Client *http.Client
Logger zerolog.Logger
}

func NewRPC(chainConfig *types.Chain, logger zerolog.Logger) *RPC {
return &RPC{
ChainConfig: chainConfig,
URLs: chainConfig.LCDEndpoints,
ProposalsType: chainConfig.ProposalsType,
Logger: logger.With().Str("component", "rpc").Logger(),
Client: http.NewClient(chainConfig.Name, chainConfig.LCDEndpoints, logger),
}
}

Expand All @@ -41,7 +38,7 @@ func (rpc *RPC) GetStakingPool() (*responses.PoolRPCResponse, *types.QueryError)
url := "/cosmos/staking/v1beta1/pool"

var pool responses.PoolRPCResponse
if errs := rpc.Get(url, &pool); len(errs) > 0 {
if errs := rpc.Client.Get(url, &pool); len(errs) > 0 {
return nil, &types.QueryError{
QueryError: nil,
NodeErrors: errs,
Expand All @@ -50,55 +47,3 @@ func (rpc *RPC) GetStakingPool() (*responses.PoolRPCResponse, *types.QueryError)

return &pool, nil
}

func (rpc *RPC) Get(url string, target interface{}) []types.NodeError {
nodeErrors := make([]types.NodeError, len(rpc.URLs))

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

err := rpc.GetFull(
fullURL,
target,
)

if err == nil {
return nil
}

rpc.Logger.Warn().Str("url", fullURL).Err(err).Msg("LCD request failed")
nodeErrors[index] = types.NodeError{
Node: lcd,
Error: types.NewJSONError(err),
}
}

rpc.Logger.Warn().Str("url", url).Msg("All LCD requests failed")
return nodeErrors
}

func (rpc *RPC) GetFull(url string, target interface{}) error {
client := &http.Client{Timeout: 300 * time.Second}
start := time.Now()

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

req.Header.Set("User-Agent", "cosmos-proposals-checker")

rpc.Logger.Debug().Str("url", url).Msg("Doing a query...")

res, err := client.Do(req)
if err != nil {
rpc.Logger.Warn().Str("url", url).Err(err).Msg("Query failed")
return err
}
defer res.Body.Close()

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

return json.NewDecoder(res.Body).Decode(target)
}
2 changes: 1 addition & 1 deletion pkg/fetchers/cosmos/params.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ func (rpc *RPC) GetGovParams(paramsType string) (*responses.ParamsResponse, *typ
url := fmt.Sprintf("/cosmos/gov/v1beta1/params/%s", paramsType)

var params responses.ParamsResponse
if errs := rpc.Get(url, &params); len(errs) > 0 {
if errs := rpc.Client.Get(url, &params); len(errs) > 0 {
return nil, &types.QueryError{
QueryError: nil,
NodeErrors: errs,
Expand Down
2 changes: 1 addition & 1 deletion pkg/fetchers/cosmos/proposals_v1.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func (rpc *RPC) GetAllV1Proposals() ([]types.Proposal, *types.QueryError) {
)

var batchProposals responses.V1ProposalsRPCResponse
if errs := rpc.Get(url, &batchProposals); len(errs) > 0 {
if errs := rpc.Client.Get(url, &batchProposals); len(errs) > 0 {
return nil, &types.QueryError{
QueryError: nil,
NodeErrors: errs,
Expand Down
2 changes: 1 addition & 1 deletion pkg/fetchers/cosmos/proposals_v1beta1.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func (rpc *RPC) GetAllV1beta1Proposals() ([]types.Proposal, *types.QueryError) {
)

var batchProposals responses.V1Beta1ProposalsRPCResponse
if errs := rpc.Get(url, &batchProposals); len(errs) > 0 {
if errs := rpc.Client.Get(url, &batchProposals); len(errs) > 0 {
return nil, &types.QueryError{
QueryError: nil,
NodeErrors: errs,
Expand Down
2 changes: 1 addition & 1 deletion pkg/fetchers/cosmos/tally.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ func (rpc *RPC) GetTally(proposal string) (*types.Tally, *types.QueryError) {
)

var tally responses.TallyRPCResponse
if errs := rpc.Get(url, &tally); len(errs) > 0 {
if errs := rpc.Client.Get(url, &tally); len(errs) > 0 {
return nil, &types.QueryError{
QueryError: nil,
NodeErrors: errs,
Expand Down
2 changes: 1 addition & 1 deletion pkg/fetchers/cosmos/vote.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ func (rpc *RPC) GetVote(proposal, voter string) (*types.Vote, *types.QueryError)
)

var vote responses.VoteRPCResponse
if errs := rpc.Get(url, &vote); len(errs) > 0 {
if errs := rpc.Client.Get(url, &vote); len(errs) > 0 {
return nil, &types.QueryError{
QueryError: nil,
NodeErrors: errs,
Expand Down
77 changes: 77 additions & 0 deletions pkg/http/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package http

import (
"encoding/json"
"main/pkg/types"
"net/http"
"time"

"github.com/rs/zerolog"
)

type Client struct {
Hosts []string
Logger zerolog.Logger
}

func NewClient(chainName string, hosts []string, logger zerolog.Logger) *Client {
return &Client{
Hosts: hosts,
Logger: logger.With().
Str("component", "http").
Str("chain", chainName).
Logger(),
}
}

func (client *Client) Get(url string, target interface{}) []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(
fullURL,
target,
)

if err == nil {
return nil
}

client.Logger.Warn().Str("url", fullURL).Err(err).Msg("LCD request failed")
nodeErrors[index] = types.NodeError{
Node: lcd,
Error: types.NewJSONError(err),
}
}

client.Logger.Warn().Str("url", url).Msg("All LCD requests failed")
return nodeErrors
}

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

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

req.Header.Set("User-Agent", "cosmos-proposals-checker")

client.Logger.Debug().Str("url", url).Msg("Doing a query...")

res, err := httpClient.Do(req)
if err != nil {
client.Logger.Warn().Str("url", url).Err(err).Msg("Query failed")
return err
}
defer res.Body.Close()

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

return json.NewDecoder(res.Body).Decode(target)
}

0 comments on commit 8d352cd

Please sign in to comment.