fix: ignore 404 while collecting jira issue worklog
diff --git a/plugins/helper/api_async_client.go b/plugins/helper/api_async_client.go
index 20d4f89..b18be35 100644
--- a/plugins/helper/api_async_client.go
+++ b/plugins/helper/api_async_client.go
@@ -139,7 +139,11 @@
res.Body = io.NopCloser(bytes.NewBuffer(body))
}
}
-
+ if err == ErrIgnoreAndContinue {
+ // make sure defer func got be executed
+ err = nil
+ return nil
+ }
// check
needRetry := false
if err != nil {
@@ -198,6 +202,7 @@
GetQps() float64
Add(delta int)
Done()
+ SetAfterFunction(callback ApiClientAfterResponse)
}
var _ RateLimitedApiClient = (*ApiAsyncClient)(nil)
diff --git a/plugins/helper/api_client.go b/plugins/helper/api_client.go
index 33b7ef7..4b941af 100644
--- a/plugins/helper/api_client.go
+++ b/plugins/helper/api_client.go
@@ -21,6 +21,7 @@
"bytes"
"context"
"encoding/json"
+ "errors"
"fmt"
"io"
"io/ioutil"
@@ -38,6 +39,8 @@
type ApiClientBeforeRequest func(req *http.Request) error
type ApiClientAfterResponse func(res *http.Response) error
+var ErrIgnoreAndContinue = errors.New("ignore and continue")
+
// ApiClient is designed for simple api requests
type ApiClient struct {
client *http.Client
@@ -220,6 +223,9 @@
// after recieve
if apiClient.afterReponse != nil {
err = apiClient.afterReponse(res)
+ if err == ErrIgnoreAndContinue {
+ return res, err
+ }
if err != nil {
res.Body.Close()
return nil, err
diff --git a/plugins/helper/api_collector.go b/plugins/helper/api_collector.go
index 23cbb09..ad057e6 100644
--- a/plugins/helper/api_collector.go
+++ b/plugins/helper/api_collector.go
@@ -81,6 +81,7 @@
GetTotalPages func(res *http.Response, args *ApiCollectorArgs) (int, error)
Concurrency int
ResponseParser func(res *http.Response) ([]json.RawMessage, error)
+ AfterResponse ApiClientAfterResponse
}
type ApiCollector struct {
@@ -118,11 +119,22 @@
if args.Concurrency < 1 {
args.Concurrency = 1
}
- return &ApiCollector{
+ apicllector := &ApiCollector{
RawDataSubTask: rawDataSubTask,
args: &args,
urlTemplate: tpl,
- }, nil
+ }
+ if args.AfterResponse != nil {
+ apicllector.SetAfterResponse(args.AfterResponse)
+ } else {
+ apicllector.SetAfterResponse(func(res *http.Response) error {
+ if res.StatusCode == http.StatusUnauthorized {
+ return fmt.Errorf("authentication failed, please check your AccessToken")
+ }
+ return nil
+ })
+ }
+ return apicllector, nil
}
// Start collection
@@ -284,6 +296,10 @@
return buf.String(), nil
}
+func (collector *ApiCollector) SetAfterResponse(f ApiClientAfterResponse) {
+ collector.args.ApiClient.SetAfterFunction(f)
+}
+
// stepFetch collect pages synchronously. In practice, several stepFetch running concurrently, we could stop all of them by calling `cancel`.
func (collector *ApiCollector) stepFetch(ctx context.Context, cancel func(), reqData RequestData) error {
// channel `c` is used to make sure fetchAsync is called serially
diff --git a/plugins/jira/tasks/api_client.go b/plugins/jira/tasks/api_client.go
index 4896c05..7432ca0 100644
--- a/plugins/jira/tasks/api_client.go
+++ b/plugins/jira/tasks/api_client.go
@@ -86,3 +86,13 @@
}
return serverInfo, res.StatusCode, nil
}
+
+func ignoreHTTPStatus404(res *http.Response) error {
+ if res.StatusCode == http.StatusUnauthorized {
+ return fmt.Errorf("authentication failed, please check your AccessToken")
+ }
+ if res.StatusCode == http.StatusNotFound {
+ return helper.ErrIgnoreAndContinue
+ }
+ return nil
+}
diff --git a/plugins/jira/tasks/changelog_collector.go b/plugins/jira/tasks/changelog_collector.go
index bd3f37b..2f13774 100644
--- a/plugins/jira/tasks/changelog_collector.go
+++ b/plugins/jira/tasks/changelog_collector.go
@@ -98,6 +98,7 @@
}
return data.Values, nil
},
+ AfterResponse: ignoreHTTPStatus404,
})
if err != nil {
diff --git a/plugins/jira/tasks/remotelink_collector.go b/plugins/jira/tasks/remotelink_collector.go
index a38d8ba..102805d 100644
--- a/plugins/jira/tasks/remotelink_collector.go
+++ b/plugins/jira/tasks/remotelink_collector.go
@@ -96,6 +96,7 @@
}
return result, nil
},
+ AfterResponse: ignoreHTTPStatus404,
})
if err != nil {
return err
diff --git a/plugins/jira/tasks/worklog_collector.go b/plugins/jira/tasks/worklog_collector.go
index 70e873d..e0ad9da 100644
--- a/plugins/jira/tasks/worklog_collector.go
+++ b/plugins/jira/tasks/worklog_collector.go
@@ -79,6 +79,7 @@
}
return data.Worklogs, nil
},
+ AfterResponse: ignoreHTTPStatus404,
})
if err != nil {
logger.Error("collect board error:", err)