diff options
Diffstat (limited to 'backend/internal/ibd/client.go')
-rw-r--r-- | backend/internal/ibd/client.go | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/backend/internal/ibd/client.go b/backend/internal/ibd/client.go index 2b91268..25c5173 100644 --- a/backend/internal/ibd/client.go +++ b/backend/internal/ibd/client.go @@ -20,8 +20,8 @@ type Client struct { } func NewClient( - transports []transport.Transport, cookies database.CookieSource, + transports ...transport.Transport, ) *Client { return &Client{transports, cookies} } @@ -55,12 +55,17 @@ func (c *Client) getCookie(ctx context.Context, subject *string) (uint, *http.Co return cookie.ID, cookie.ToHTTPCookie(), nil } -func (c *Client) Do(req *http.Request) (*http.Response, error) { - return c.DoWithStatus(req, []int{http.StatusOK}) -} +func (c *Client) Do(req *http.Request, opts ...optionFunc) (*http.Response, error) { + o := defaultOptions + for _, opt := range opts { + opt(&o) + } + + // Sort and filter transports by properties + transports := transport.FilterTransports(c.transports, o.requiredProps) + transport.SortTransports(transports) -func (c *Client) DoWithStatus(req *http.Request, expectedStatus []int) (*http.Response, error) { - for i, tp := range c.transports { + for _, tp := range transports { resp, err := tp.Do(req) if errors.Is(err, transport.ErrUnsupportedRequest) { // Skip unsupported transport @@ -68,17 +73,17 @@ func (c *Client) DoWithStatus(req *http.Request, expectedStatus []int) (*http.Re } if err != nil { slog.ErrorContext(req.Context(), "transport error", - "transport", i, + "transport", tp.String(), "error", err, ) continue } - if slices.Contains(expectedStatus, resp.StatusCode) { + if slices.Contains(o.expectedStatuses, resp.StatusCode) { return resp, nil } else { slog.ErrorContext(req.Context(), "unexpected status code", - "transport", i, - "expected", expectedStatus, + "transport", tp.String(), + "expected", o.expectedStatuses, "actual", resp.StatusCode, ) continue |