pkg/confidence/http_resolve_client.go (53 lines of code) (raw):

package confidence import ( "bytes" "context" "encoding/json" "fmt" "io" "net/http" ) type HttpResolveClient struct { Client *http.Client Config APIConfig } func parseErrorMessage(body io.ReadCloser) string { var resolveError resolveErrorMessage decoder := json.NewDecoder(body) decoder.UseNumber() err := decoder.Decode(&resolveError) if err != nil { return "" } return resolveError.Message } func (client HttpResolveClient) SendResolveRequest(ctx context.Context, request ResolveRequest) (ResolveResponse, error) { jsonRequest, err := json.Marshal(request) if err != nil { return ResolveResponse{}, fmt.Errorf("error when serializing request to the resolver service: %w", err) } payload := bytes.NewBuffer(jsonRequest) req, err := http.NewRequestWithContext(ctx, http.MethodPost, fmt.Sprintf("%s/v1/flags:resolve", client.Config.APIResolveBaseUrl), payload) if err != nil { return ResolveResponse{}, err } resp, err := client.Client.Do(req) if err != nil { return ResolveResponse{}, fmt.Errorf("error when calling the resolver service: %w", err) } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return ResolveResponse{}, fmt.Errorf("got '%s' error from the resolver service: %s", resp.Status, parseErrorMessage(resp.Body)) } var result ResolveResponse decoder := json.NewDecoder(resp.Body) decoder.UseNumber() err = decoder.Decode(&result) if err != nil { return ResolveResponse{}, fmt.Errorf("error when deserializing response from the resolver service: %w", err) } return result, nil }