OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 package prpc | |
6 | |
7 import ( | |
8 "net/http" | |
9 | |
10 "google.golang.org/grpc/codes" | |
11 ) | |
12 | |
13 // This file maps gRPC codes to HTTP statuses and vice-versa. | |
14 | |
15 // codeToStatus maps gRPC codes to HTTP statuses. | |
16 // This map may need to be corrected when | |
17 // https://github.com/grpc/grpc-common/issues/210 | |
18 // is closed. | |
19 var codeToStatus = map[codes.Code]int{ | |
dnj
2016/01/21 07:44:28
Why do we need a full mapping? We have the status
nodir
2016/01/22 00:47:24
the {code->status} map is used in server/prpc. I'v
| |
20 codes.OK: http.StatusOK, | |
21 codes.Canceled: http.StatusNoContent, | |
22 codes.Unknown: http.StatusInternalServerError, | |
23 codes.InvalidArgument: http.StatusBadRequest, | |
24 codes.DeadlineExceeded: http.StatusServiceUnavailable, | |
25 codes.NotFound: http.StatusNotFound, | |
26 codes.AlreadyExists: http.StatusConflict, | |
27 codes.PermissionDenied: http.StatusForbidden, | |
28 codes.Unauthenticated: http.StatusUnauthorized, | |
29 codes.ResourceExhausted: http.StatusServiceUnavailable, | |
30 codes.FailedPrecondition: http.StatusPreconditionFailed, | |
31 codes.Aborted: http.StatusInternalServerError, | |
32 codes.OutOfRange: http.StatusBadRequest, | |
33 codes.Unimplemented: http.StatusNotImplemented, | |
34 codes.Internal: http.StatusInternalServerError, | |
35 codes.Unavailable: http.StatusServiceUnavailable, | |
36 codes.DataLoss: http.StatusInternalServerError, | |
37 } | |
38 | |
39 // CodeStatus maps gRPC codes to HTTP statuses. | |
40 // | |
41 // The behavior of this function may change when | |
42 // https://github.com/grpc/grpc-common/issues/210 | |
43 // is closed. | |
44 func CodeStatus(code codes.Code) (status int, ok bool) { | |
45 status, ok = codeToStatus[code] | |
46 return | |
47 } | |
48 | |
49 // StatusCode maps HTTP statuses to gRPC codes. | |
50 // Falls back to codes.Unknown. | |
51 // | |
52 // The behavior of this function may change when | |
53 // https://github.com/grpc/grpc-common/issues/210 | |
54 // is closed. | |
55 func StatusCode(status int) codes.Code { | |
56 switch { | |
57 | |
58 case status >= 200 && status < 300: | |
59 return codes.OK | |
60 | |
61 case status == http.StatusUnauthorized: | |
62 return codes.Unauthenticated | |
63 case status == http.StatusForbidden: | |
64 return codes.PermissionDenied | |
65 case status == http.StatusNotFound: | |
66 return codes.NotFound | |
67 case status == http.StatusGone: | |
68 return codes.NotFound | |
69 case status == http.StatusPreconditionFailed: | |
70 return codes.FailedPrecondition | |
71 case status >= 400 && status < 500: | |
72 return codes.InvalidArgument | |
73 | |
74 case status == http.StatusNotImplemented: | |
75 return codes.Unimplemented | |
76 case status == http.StatusServiceUnavailable: | |
77 return codes.Unavailable | |
78 case status >= 500 && status < 600: | |
79 return codes.Internal | |
80 | |
81 default: | |
82 return codes.Unknown | |
83 } | |
84 } | |
OLD | NEW |