mirror of https://github.com/dapr/kit.git
101 lines
3.1 KiB
Go
101 lines
3.1 KiB
Go
/*
|
|
Copyright 2023 The Dapr Authors
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package grpccodes
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"google.golang.org/grpc/codes"
|
|
)
|
|
|
|
// HTTPStatusFromCode converts a gRPC error code into the corresponding HTTP response status.
|
|
// https://github.com/grpc-ecosystem/grpc-gateway/blob/master/runtime/errors.go#L15
|
|
// See: https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto
|
|
func HTTPStatusFromCode(code codes.Code) int {
|
|
switch code {
|
|
case codes.OK:
|
|
return http.StatusOK
|
|
case codes.Canceled:
|
|
return http.StatusRequestTimeout
|
|
case codes.Unknown:
|
|
return http.StatusInternalServerError
|
|
case codes.InvalidArgument:
|
|
return http.StatusBadRequest
|
|
case codes.DeadlineExceeded:
|
|
return http.StatusGatewayTimeout
|
|
case codes.NotFound:
|
|
return http.StatusNotFound
|
|
case codes.AlreadyExists:
|
|
return http.StatusConflict
|
|
case codes.PermissionDenied:
|
|
return http.StatusForbidden
|
|
case codes.Unauthenticated:
|
|
return http.StatusUnauthorized
|
|
case codes.ResourceExhausted:
|
|
return http.StatusTooManyRequests
|
|
case codes.FailedPrecondition:
|
|
// Note, this deliberately doesn't translate to the similarly named '412 Precondition Failed' HTTP response status.
|
|
return http.StatusBadRequest
|
|
case codes.Aborted:
|
|
return http.StatusConflict
|
|
case codes.OutOfRange:
|
|
return http.StatusBadRequest
|
|
case codes.Unimplemented:
|
|
return http.StatusNotImplemented
|
|
case codes.Internal:
|
|
return http.StatusInternalServerError
|
|
case codes.Unavailable:
|
|
return http.StatusServiceUnavailable
|
|
case codes.DataLoss:
|
|
return http.StatusInternalServerError
|
|
default:
|
|
return http.StatusInternalServerError
|
|
}
|
|
}
|
|
|
|
// CodeFromHTTPStatus converts http status code to gRPC status code
|
|
// See: https://github.com/grpc/grpc/blob/master/doc/http-grpc-status-mapping.md
|
|
func CodeFromHTTPStatus(httpStatusCode int) codes.Code {
|
|
if httpStatusCode >= 200 && httpStatusCode < 300 {
|
|
return codes.OK
|
|
}
|
|
|
|
switch httpStatusCode {
|
|
case http.StatusRequestTimeout:
|
|
return codes.Canceled
|
|
case http.StatusInternalServerError:
|
|
return codes.Unknown
|
|
case http.StatusBadRequest:
|
|
return codes.Internal
|
|
case http.StatusGatewayTimeout:
|
|
return codes.DeadlineExceeded
|
|
case http.StatusNotFound:
|
|
return codes.NotFound
|
|
case http.StatusConflict:
|
|
return codes.AlreadyExists
|
|
case http.StatusForbidden:
|
|
return codes.PermissionDenied
|
|
case http.StatusUnauthorized:
|
|
return codes.Unauthenticated
|
|
case http.StatusTooManyRequests:
|
|
return codes.ResourceExhausted
|
|
case http.StatusNotImplemented:
|
|
return codes.Unimplemented
|
|
case http.StatusServiceUnavailable:
|
|
return codes.Unavailable
|
|
default:
|
|
return codes.Unknown
|
|
}
|
|
}
|