Skip to content

Commit c885243

Browse files
authored
Handle 5xx trigger errors (#227)
Currently, if build triggering fails with an internal error, the service responds with an 4xx error. Some consumers (including one of ours) would build a retry mechanism on top of error codes, and wouldn't retry a 400 error, this would result in "losing" that build trigger request. Please note that theoretically an input param validation can also result in the same Errors field being populated and thus a 5xx error. We don't see any validation error though in the recent logs, so we propose to deal with this later as being able to separate between these errors would require some additional refactoring.
1 parent 96d2107 commit c885243

File tree

2 files changed

+8
-5
lines changed

2 files changed

+8
-5
lines changed

bitriseapi/bitriseapi.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import (
44
"bytes"
55
"encoding/json"
66
"fmt"
7-
"io/ioutil"
7+
"io"
88
"log"
99
"net/http"
1010
"net/url"
@@ -203,12 +203,16 @@ func TriggerBuild(url *url.URL, apiToken string, params TriggerAPIParamsModel, i
203203
}
204204
}()
205205

206-
body, err := ioutil.ReadAll(resp.Body)
206+
body, err := io.ReadAll(resp.Body)
207207
if err != nil {
208208
return TriggerAPIResponseModel{}, false, errors.Wrapf(err, "TriggerBuild (url:%s): request sent, but failed to read response body (http-code:%d)", url.String(), resp.StatusCode)
209209
}
210210
bodyString := string(body)
211211

212+
if resp.StatusCode >= 500 || resp.StatusCode < 600 {
213+
return TriggerAPIResponseModel{}, false, errors.Wrapf(err, "TriggerBuild (url:%s): request sent, but received a server error response (http-code:%d, response body:%s)", url.String(), resp.StatusCode, bodyString)
214+
}
215+
212216
var respModel TriggerAPIResponseModel
213217
if err := json.Unmarshal(body, &respModel); err != nil {
214218
return TriggerAPIResponseModel{}, false, errors.Wrapf(err, "TriggerBuild (url:%s): request sent, but failed to parse response (http-code:%d, response body:%s)", url.String(), resp.StatusCode, bodyString)

service/hook/common/default_response_provider.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import (
55
)
66

77
// DefaultResponseProvider ...
8-
type DefaultResponseProvider struct {
9-
}
8+
type DefaultResponseProvider struct{}
109

1110
// SingleErrorRespModel ...
1211
type SingleErrorRespModel struct {
@@ -40,7 +39,7 @@ func (hp DefaultResponseProvider) TransformResponse(input TransformResponseInput
4039
}
4140

4241
if len(input.Errors) > 0 {
43-
httpStatusCode = 400
42+
httpStatusCode = 500
4443
}
4544

4645
if len(input.FailedTriggerResponses) > 0 {

0 commit comments

Comments
 (0)