esplora.go raw
1 package api
2
3 import (
4 "context"
5 "encoding/json"
6 "errors"
7 "fmt"
8 "io"
9 "net/http"
10 "time"
11
12 "github.com/getAlby/hub/logger"
13 "github.com/sirupsen/logrus"
14 )
15
16 func (api *api) RequestEsploraApi(ctx context.Context, endpoint string) (interface{}, error) {
17 url := api.cfg.GetEnv().LDKEsploraServer + endpoint
18
19 client := http.Client{
20 Timeout: time.Second * 10,
21 }
22
23 req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
24 if err != nil {
25 logger.Logger.WithError(err).WithFields(logrus.Fields{
26 "url": url,
27 }).Error("Failed to create http request")
28 return nil, err
29 }
30
31 res, err := client.Do(req)
32 if err != nil {
33 logger.Logger.WithError(err).WithFields(logrus.Fields{
34 "url": url,
35 }).Error("Failed to send request")
36 return nil, err
37 }
38
39 defer res.Body.Close()
40
41 body, readErr := io.ReadAll(res.Body)
42 if readErr != nil {
43 logger.Logger.WithError(err).WithFields(logrus.Fields{
44 "url": url,
45 }).Error("Failed to read response body")
46 return nil, errors.New("failed to read response body")
47 }
48
49 if res.StatusCode != http.StatusOK {
50 logger.Logger.WithFields(logrus.Fields{
51 "endpoint": endpoint,
52 "status_code": res.StatusCode,
53 "body": string(body),
54 }).Error("Esplora endpoint returned non-success code")
55 return nil, fmt.Errorf("esplora endpoint returned non-success code: %s", string(body))
56 }
57
58 var jsonContent interface{}
59 jsonErr := json.Unmarshal(body, &jsonContent)
60 if jsonErr != nil {
61 logger.Logger.WithError(jsonErr).WithFields(logrus.Fields{
62 "url": url,
63 }).Error("Failed to deserialize json")
64 return nil, fmt.Errorf("failed to deserialize json %s %s", url, string(body))
65 }
66 return jsonContent, nil
67 }
68