Add client error to sdk and fix purge cli

This commit is contained in:
Robert Kaussow 2024-12-15 21:23:20 +01:00
parent ff2469ec5b
commit e86b08a724
No known key found for this signature in database
GPG key ID: 4E692A2EAECC03C0
2 changed files with 37 additions and 6 deletions

View file

@ -1,4 +1,4 @@
// Copyright 2022 Woodpecker Authors
// Copyright 2024 Woodpecker Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@ -16,7 +16,9 @@ package pipeline
import (
"context"
"errors"
"fmt"
"net/http"
"time"
"github.com/rs/zerolog/log"
@ -121,6 +123,11 @@ func pipelinePurge(c *cli.Command, client woodpecker.Client) (err error) {
err := client.PipelineDelete(repoID, p.Number)
if err != nil {
var clientErr *woodpecker.ClientError
if errors.As(err, &clientErr) && clientErr.StatusCode == http.StatusUnprocessableEntity {
log.Error().Err(err).Msgf("failed to delete pipeline %d", p.Number)
continue
}
return err
}
}

View file

@ -34,6 +34,15 @@ const (
// pathVersion = "%s/version"
)
type ClientError struct {
StatusCode int
Message string
}
func (e *ClientError) Error() string {
return fmt.Sprintf("client error %d: %s", e.StatusCode, e.Message)
}
type client struct {
client *http.Client
addr string
@ -116,16 +125,25 @@ func (c *client) do(rawURL, method string, in, out any) error {
func (c *client) open(rawURL, method string, in any) (io.ReadCloser, error) {
uri, err := url.Parse(rawURL)
if err != nil {
return nil, err
return nil, &ClientError{
StatusCode: http.StatusInternalServerError,
Message: err.Error(),
}
}
req, err := http.NewRequest(method, uri.String(), nil)
if err != nil {
return nil, err
return nil, &ClientError{
StatusCode: http.StatusInternalServerError,
Message: err.Error(),
}
}
if in != nil {
decoded, decodeErr := json.Marshal(in)
if decodeErr != nil {
return nil, decodeErr
return nil, &ClientError{
StatusCode: http.StatusInternalServerError,
Message: decodeErr.Error(),
}
}
buf := bytes.NewBuffer(decoded)
req.Body = io.NopCloser(buf)
@ -135,12 +153,18 @@ func (c *client) open(rawURL, method string, in any) (io.ReadCloser, error) {
}
resp, err := c.client.Do(req)
if err != nil {
return nil, err
return nil, &ClientError{
StatusCode: http.StatusInternalServerError,
Message: err.Error(),
}
}
if resp.StatusCode > http.StatusPartialContent {
defer resp.Body.Close()
out, _ := io.ReadAll(resp.Body)
return nil, fmt.Errorf("client error %d: %s", resp.StatusCode, string(out))
return nil, &ClientError{
StatusCode: resp.StatusCode,
Message: string(out),
}
}
return resp.Body, nil
}