|  | # HTTP to gRPC Status Code Mapping | 
|  |  | 
|  | Since intermediaries are a common part of HTTP infrastructure some responses to | 
|  | gRPC requests may be received that do not include the grpc-status header. In | 
|  | some cases mapping error codes from an intermediary allows the gRPC client to | 
|  | behave more appropriately to the error situation without overloading the | 
|  | semantics of either error code. | 
|  |  | 
|  | This table is to be used _only_ for clients that received a response that did | 
|  | not include grpc-status. If grpc-status was provided, it _must_ be used. Servers | 
|  | _must not_ use this table to determine an HTTP status code to use; the mappings | 
|  | are neither symmetric nor 1-to-1. | 
|  |  | 
|  | | HTTP Status Code           | gRPC Status Code   | | 
|  | |----------------------------|--------------------| | 
|  | | 400 Bad Request            | INTERNAL           | | 
|  | | 401 Unauthorized           | UNAUTHENTICATED    | | 
|  | | 403 Forbidden              | PERMISSION\_DENIED | | 
|  | | 404 Not Found              | UNIMPLEMENTED      | | 
|  | | 429 Too Many Requests      | UNAVAILABLE        | | 
|  | | 502 Bad Gateway            | UNAVAILABLE        | | 
|  | | 503 Service Unavailable    | UNAVAILABLE        | | 
|  | | 504 Gateway Timeout        | UNAVAILABLE        | | 
|  | | _All other codes_          | UNKNOWN            | | 
|  |  | 
|  | Technically, 1xx should have the entire header skipped and a subsequent header | 
|  | be read. See RFC 7540 ยง8.1. | 
|  |  | 
|  | 200 is UNKNOWN because there should be a grpc-status in case of truly OK | 
|  | response. |