diff --git a/types/rest/http_status_table.go b/types/rest/http_status_table.go new file mode 100644 index 0000000000..701c8fef0f --- /dev/null +++ b/types/rest/http_status_table.go @@ -0,0 +1,48 @@ +package rest + +//TODO : Intergrate http status mapping for every REST API +import ( + "net/http" + + "github.com/cosmos/cosmos-sdk/client/context" + "github.com/cosmos/cosmos-sdk/types/errors" +) + +//HTTPStatusMappingTable is map to mapping an error type and a http status +type HTTPStatusMappingTable map[string]map[uint32]int + +var ( + table = HTTPStatusMappingTable{ + errors.RootCodespace: { + 9: http.StatusNotFound, + }, + } +) + +func parsingError(rawErr error) *errors.Error { + if rawErr == nil { + return nil + } + if err, ok := rawErr.(*context.Error); ok { + return errors.New(err.Codespace, err.Code, err.Message) + } + if err, ok := rawErr.(*errors.Error); ok { + return err + } + return errors.New(errors.UndefinedCodespace, 1, "internal") +} + +//GetHTTPStatus is method to get http status for given error +func GetHTTPStatusWithError(err error) int { + abciErr := parsingError(err) + if abciErr == nil { + return http.StatusOK + } + result := http.StatusInternalServerError + if codeTable, ok := table[abciErr.Codespace()]; ok { + if status, ok := codeTable[abciErr.ABCICode()]; ok { + result = status + } + } + return result +} diff --git a/x/auth/client/rest/query.go b/x/auth/client/rest/query.go index 77cba3e59c..7be7549274 100644 --- a/x/auth/client/rest/query.go +++ b/x/auth/client/rest/query.go @@ -37,15 +37,8 @@ func QueryAccountRequestHandlerFn(storeName string, cliCtx context.CLIContext) h account, height, err := accGetter.GetAccountWithHeight(addr) if err != nil { - // TODO: Handle more appropriately based on the error type. - // Ref: https://github.com/cosmos/cosmos-sdk/issues/4923 - if err := accGetter.EnsureExists(addr); err != nil { - cliCtx = cliCtx.WithHeight(height) - rest.PostProcessResponse(w, cliCtx, types.BaseAccount{}) - return - } - - rest.WriteErrorResponse(w, http.StatusInternalServerError, err.Error()) + httpStatus := rest.GetHTTPStatusWithError(err) + rest.WriteErrorResponse(w, httpStatus, err.Error()) return }