Index: common/prpc/codes.go |
diff --git a/common/prpc/codes.go b/common/prpc/codes.go |
new file mode 100644 |
index 0000000000000000000000000000000000000000..98100e4800863a40fb9c42574b532c540e8d11a6 |
--- /dev/null |
+++ b/common/prpc/codes.go |
@@ -0,0 +1,84 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package prpc |
+ |
+import ( |
+ "net/http" |
+ |
+ "google.golang.org/grpc/codes" |
+) |
+ |
+// This file maps gRPC codes to HTTP statuses and vice-versa. |
+ |
+// codeToStatus maps gRPC codes to HTTP statuses. |
+// This map may need to be corrected when |
+// https://github.com/grpc/grpc-common/issues/210 |
+// is closed. |
+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
|
+ codes.OK: http.StatusOK, |
+ codes.Canceled: http.StatusNoContent, |
+ codes.Unknown: http.StatusInternalServerError, |
+ codes.InvalidArgument: http.StatusBadRequest, |
+ codes.DeadlineExceeded: http.StatusServiceUnavailable, |
+ codes.NotFound: http.StatusNotFound, |
+ codes.AlreadyExists: http.StatusConflict, |
+ codes.PermissionDenied: http.StatusForbidden, |
+ codes.Unauthenticated: http.StatusUnauthorized, |
+ codes.ResourceExhausted: http.StatusServiceUnavailable, |
+ codes.FailedPrecondition: http.StatusPreconditionFailed, |
+ codes.Aborted: http.StatusInternalServerError, |
+ codes.OutOfRange: http.StatusBadRequest, |
+ codes.Unimplemented: http.StatusNotImplemented, |
+ codes.Internal: http.StatusInternalServerError, |
+ codes.Unavailable: http.StatusServiceUnavailable, |
+ codes.DataLoss: http.StatusInternalServerError, |
+} |
+ |
+// CodeStatus maps gRPC codes to HTTP statuses. |
+// |
+// The behavior of this function may change when |
+// https://github.com/grpc/grpc-common/issues/210 |
+// is closed. |
+func CodeStatus(code codes.Code) (status int, ok bool) { |
+ status, ok = codeToStatus[code] |
+ return |
+} |
+ |
+// StatusCode maps HTTP statuses to gRPC codes. |
+// Falls back to codes.Unknown. |
+// |
+// The behavior of this function may change when |
+// https://github.com/grpc/grpc-common/issues/210 |
+// is closed. |
+func StatusCode(status int) codes.Code { |
+ switch { |
+ |
+ case status >= 200 && status < 300: |
+ return codes.OK |
+ |
+ case status == http.StatusUnauthorized: |
+ return codes.Unauthenticated |
+ case status == http.StatusForbidden: |
+ return codes.PermissionDenied |
+ case status == http.StatusNotFound: |
+ return codes.NotFound |
+ case status == http.StatusGone: |
+ return codes.NotFound |
+ case status == http.StatusPreconditionFailed: |
+ return codes.FailedPrecondition |
+ case status >= 400 && status < 500: |
+ return codes.InvalidArgument |
+ |
+ case status == http.StatusNotImplemented: |
+ return codes.Unimplemented |
+ case status == http.StatusServiceUnavailable: |
+ return codes.Unavailable |
+ case status >= 500 && status < 600: |
+ return codes.Internal |
+ |
+ default: |
+ return codes.Unknown |
+ } |
+} |