mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-11-02 19:47:54 +00:00
Add error logical.ErrUpstreamRateLimited and return 502 from RespondCommonError
This commit is contained in:
@@ -20,6 +20,10 @@ var (
|
|||||||
// ErrMultiAuthzPending is returned if the the request needs more
|
// ErrMultiAuthzPending is returned if the the request needs more
|
||||||
// authorizations
|
// authorizations
|
||||||
ErrMultiAuthzPending = errors.New("request needs further approval")
|
ErrMultiAuthzPending = errors.New("request needs further approval")
|
||||||
|
|
||||||
|
// ErrUpstreamRateLimited is returned when Vault recieves a rate limited
|
||||||
|
// response from an upstream
|
||||||
|
ErrUpstreamRateLimited = errors.New("upstream rate limited")
|
||||||
)
|
)
|
||||||
|
|
||||||
type HTTPCodedError interface {
|
type HTTPCodedError interface {
|
||||||
|
|||||||
@@ -105,6 +105,8 @@ func RespondErrorCommon(req *Request, resp *Response, err error) (int, error) {
|
|||||||
statusCode = http.StatusNotFound
|
statusCode = http.StatusNotFound
|
||||||
case errwrap.Contains(err, ErrInvalidRequest.Error()):
|
case errwrap.Contains(err, ErrInvalidRequest.Error()):
|
||||||
statusCode = http.StatusBadRequest
|
statusCode = http.StatusBadRequest
|
||||||
|
case errwrap.Contains(err, ErrUpstreamRateLimited.Error()):
|
||||||
|
statusCode = http.StatusBadGateway
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
83
logical/response_util_test.go
Normal file
83
logical/response_util_test.go
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
package logical
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestResponseUtil_RespondErrorCommon_basic(t *testing.T) {
|
||||||
|
testCases := []struct {
|
||||||
|
title string
|
||||||
|
req *Request
|
||||||
|
resp *Response
|
||||||
|
respErr error
|
||||||
|
expectedStatus int
|
||||||
|
expectedErr error
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
title: "Throttled, no error",
|
||||||
|
respErr: ErrUpstreamRateLimited,
|
||||||
|
resp: &Response{},
|
||||||
|
expectedStatus: 502,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Throttled, with error",
|
||||||
|
respErr: ErrUpstreamRateLimited,
|
||||||
|
resp: &Response{
|
||||||
|
Data: map[string]interface{}{
|
||||||
|
"error": "rate limited",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedStatus: 502,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Read not found",
|
||||||
|
req: &Request{
|
||||||
|
Operation: ReadOperation,
|
||||||
|
},
|
||||||
|
respErr: nil,
|
||||||
|
expectedStatus: 404,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "List with response and no keys",
|
||||||
|
req: &Request{
|
||||||
|
Operation: ListOperation,
|
||||||
|
},
|
||||||
|
resp: &Response{},
|
||||||
|
respErr: nil,
|
||||||
|
expectedStatus: 404,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "List with response and keys",
|
||||||
|
req: &Request{
|
||||||
|
Operation: ListOperation,
|
||||||
|
},
|
||||||
|
resp: &Response{
|
||||||
|
Data: map[string]interface{}{
|
||||||
|
"keys": []string{"some", "things", "here"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
respErr: nil,
|
||||||
|
expectedStatus: 0,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range testCases {
|
||||||
|
t.Run(tc.title, func(t *testing.T) {
|
||||||
|
var status int
|
||||||
|
var err, respErr error
|
||||||
|
if tc.respErr != nil {
|
||||||
|
respErr = tc.respErr
|
||||||
|
}
|
||||||
|
status, err = RespondErrorCommon(tc.req, tc.resp, respErr)
|
||||||
|
if status != tc.expectedStatus {
|
||||||
|
t.Fatalf("Expected (%d) status code, got (%d)", tc.expectedStatus, status)
|
||||||
|
}
|
||||||
|
if tc.expectedErr != nil {
|
||||||
|
if !strings.Contains(tc.expectedErr.Error(), err.Error()) {
|
||||||
|
t.Fatalf("Expected error to contain:\n%s\n\ngot:\n%s\n", tc.expectedErr, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user