1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

api/server/httputils: ensure consistent status code

Error code resolution is powered by string matching. Not the greatest
thing in the world and I hope no one is proud of this code, but it
works. However, because a map is used, the iteration order of the map is
random, such that if an error matches two of the snippets, it may return
a different error code depending on the seed of the hashmap. This change
converts it to use a slice instead.

Signed-off-by: Stephen J Day <stephen.day@docker.com>
(cherry picked from commit 3484e02590)
Signed-off-by: Victor Vieux <victorvieux@gmail.com>
This commit is contained in:
Stephen J Day 2016-11-16 18:58:55 -08:00 committed by Victor Vieux
parent cd587419d0
commit 8b9b8bd930

View file

@ -49,20 +49,23 @@ func GetHTTPErrorStatusCode(err error) int {
// If we need to differentiate between different possible error types, // If we need to differentiate between different possible error types,
// we should create appropriate error types that implement the httpStatusError interface. // we should create appropriate error types that implement the httpStatusError interface.
errStr := strings.ToLower(errMsg) errStr := strings.ToLower(errMsg)
for keyword, status := range map[string]int{ for _, status := range []struct {
"not found": http.StatusNotFound, keyword string
"no such": http.StatusNotFound, code int
"bad parameter": http.StatusBadRequest, }{
"no command": http.StatusBadRequest, {"not found", http.StatusNotFound},
"conflict": http.StatusConflict, {"no such", http.StatusNotFound},
"impossible": http.StatusNotAcceptable, {"bad parameter", http.StatusBadRequest},
"wrong login/password": http.StatusUnauthorized, {"no command", http.StatusBadRequest},
"unauthorized": http.StatusUnauthorized, {"conflict", http.StatusConflict},
"hasn't been activated": http.StatusForbidden, {"impossible", http.StatusNotAcceptable},
"this node": http.StatusNotAcceptable, {"wrong login/password", http.StatusUnauthorized},
{"unauthorized", http.StatusUnauthorized},
{"hasn't been activated", http.StatusForbidden},
{"this node", http.StatusNotAcceptable},
} { } {
if strings.Contains(errStr, keyword) { if strings.Contains(errStr, status.keyword) {
statusCode = status statusCode = status.code
break break
} }
} }