forked from cloudfoundry/cli
-
Notifications
You must be signed in to change notification settings - Fork 0
/
error_converter.go
70 lines (61 loc) · 2.02 KB
/
error_converter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package uaa
import (
"encoding/json"
"net/http"
)
// errorWrapper is the wrapper that converts responses with 4xx and 5xx status
// codes to an error.
type errorWrapper struct {
connection Connection
}
// NewErrorWrapper returns a new error wrapper.
func NewErrorWrapper() *errorWrapper {
return new(errorWrapper)
}
// Wrap wraps a UAA connection in this error handling wrapper.
func (e *errorWrapper) Wrap(innerconnection Connection) Connection {
e.connection = innerconnection
return e
}
// Make converts RawHTTPStatusError, which represents responses with 4xx and
// 5xx status codes, to specific errors.
func (e *errorWrapper) Make(request *http.Request, passedResponse *Response) error {
err := e.connection.Make(request, passedResponse)
if rawHTTPStatusErr, ok := err.(RawHTTPStatusError); ok {
return convert(rawHTTPStatusErr)
}
return err
}
func convert(rawHTTPStatusErr RawHTTPStatusError) error {
// Try to unmarshal the raw http status error into a UAA error. If
// unmarshaling fails, return the raw error.
var uaaErrorResponse UAAErrorResponse
err := json.Unmarshal(rawHTTPStatusErr.RawResponse, &uaaErrorResponse)
if err != nil {
return rawHTTPStatusErr
}
switch rawHTTPStatusErr.StatusCode {
case http.StatusBadRequest: // 400
if uaaErrorResponse.Type == "invalid_scim_resource" {
return InvalidSCIMResourceError{Message: uaaErrorResponse.Description}
}
return rawHTTPStatusErr
case http.StatusUnauthorized: // 401
if uaaErrorResponse.Type == "invalid_token" {
return InvalidAuthTokenError{Message: uaaErrorResponse.Description}
}
if uaaErrorResponse.Type == "unauthorized" {
return BadCredentialsError{Message: uaaErrorResponse.Description}
}
return rawHTTPStatusErr
case http.StatusForbidden: // 403
if uaaErrorResponse.Type == "insufficient_scope" {
return InsufficientScopeError{Message: uaaErrorResponse.Description}
}
return rawHTTPStatusErr
case http.StatusConflict: // 409
return ConflictError{Message: uaaErrorResponse.Description}
default:
return rawHTTPStatusErr
}
}