versia-go/pkg/protoretry/client.go

63 lines
1.2 KiB
Go
Raw Normal View History

2024-08-20 22:43:26 +02:00
package protoretry
import (
"context"
"errors"
"io"
"net/http"
"net/url"
"syscall"
)
type Client struct {
base *http.Client
}
func New(base *http.Client) *Client {
return &Client{base}
}
func (c *Client) Do(req *http.Request) (*http.Response, error) {
if res, err := c.base.Do(req); err == nil {
return res, nil
} else if !errors.Is(err, syscall.ECONNREFUSED) {
return nil, err
}
req.URL.Scheme = "http"
return c.base.Do(req)
}
func (c *Client) GET(ctx context.Context, u *url.URL) ([]byte, *http.Response, error) {
req, err := http.NewRequestWithContext(ctx, "GET", u.String(), nil)
if err != nil {
return nil, nil, err
}
return c.DoReq(req)
}
func (c *Client) POST(ctx context.Context, u *url.URL, reqBody io.Reader) ([]byte, *http.Response, error) {
req, err := http.NewRequestWithContext(ctx, "POST", u.String(), reqBody)
if err != nil {
return nil, nil, err
}
return c.DoReq(req)
}
func (c *Client) DoReq(req *http.Request) ([]byte, *http.Response, error) {
res, err := c.Do(req)
if err != nil {
return nil, nil, err
}
defer res.Body.Close()
resBody, err := io.ReadAll(res.Body)
if err != nil {
return nil, nil, err
}
return resBody, res, nil
}