The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)
https://grpc.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
3.5 KiB
104 lines
3.5 KiB
# Copyright 2016 gRPC 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. |
|
"""Shared implementation.""" |
|
|
|
import logging |
|
|
|
import six |
|
|
|
import grpc |
|
from grpc._cython import cygrpc |
|
|
|
logging.basicConfig() |
|
_LOGGER = logging.getLogger(__name__) |
|
|
|
CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITY = { |
|
cygrpc.ConnectivityState.idle: |
|
grpc.ChannelConnectivity.IDLE, |
|
cygrpc.ConnectivityState.connecting: |
|
grpc.ChannelConnectivity.CONNECTING, |
|
cygrpc.ConnectivityState.ready: |
|
grpc.ChannelConnectivity.READY, |
|
cygrpc.ConnectivityState.transient_failure: |
|
grpc.ChannelConnectivity.TRANSIENT_FAILURE, |
|
cygrpc.ConnectivityState.shutdown: |
|
grpc.ChannelConnectivity.SHUTDOWN, |
|
} |
|
|
|
CYGRPC_STATUS_CODE_TO_STATUS_CODE = { |
|
cygrpc.StatusCode.ok: grpc.StatusCode.OK, |
|
cygrpc.StatusCode.cancelled: grpc.StatusCode.CANCELLED, |
|
cygrpc.StatusCode.unknown: grpc.StatusCode.UNKNOWN, |
|
cygrpc.StatusCode.invalid_argument: grpc.StatusCode.INVALID_ARGUMENT, |
|
cygrpc.StatusCode.deadline_exceeded: grpc.StatusCode.DEADLINE_EXCEEDED, |
|
cygrpc.StatusCode.not_found: grpc.StatusCode.NOT_FOUND, |
|
cygrpc.StatusCode.already_exists: grpc.StatusCode.ALREADY_EXISTS, |
|
cygrpc.StatusCode.permission_denied: grpc.StatusCode.PERMISSION_DENIED, |
|
cygrpc.StatusCode.unauthenticated: grpc.StatusCode.UNAUTHENTICATED, |
|
cygrpc.StatusCode.resource_exhausted: grpc.StatusCode.RESOURCE_EXHAUSTED, |
|
cygrpc.StatusCode.failed_precondition: grpc.StatusCode.FAILED_PRECONDITION, |
|
cygrpc.StatusCode.aborted: grpc.StatusCode.ABORTED, |
|
cygrpc.StatusCode.out_of_range: grpc.StatusCode.OUT_OF_RANGE, |
|
cygrpc.StatusCode.unimplemented: grpc.StatusCode.UNIMPLEMENTED, |
|
cygrpc.StatusCode.internal: grpc.StatusCode.INTERNAL, |
|
cygrpc.StatusCode.unavailable: grpc.StatusCode.UNAVAILABLE, |
|
cygrpc.StatusCode.data_loss: grpc.StatusCode.DATA_LOSS, |
|
} |
|
STATUS_CODE_TO_CYGRPC_STATUS_CODE = { |
|
grpc_code: cygrpc_code |
|
for cygrpc_code, grpc_code in six.iteritems( |
|
CYGRPC_STATUS_CODE_TO_STATUS_CODE) |
|
} |
|
|
|
|
|
def encode(s): |
|
if isinstance(s, bytes): |
|
return s |
|
else: |
|
return s.encode('ascii') |
|
|
|
|
|
def decode(b): |
|
if isinstance(b, str): |
|
return b |
|
else: |
|
try: |
|
return b.decode('utf8') |
|
except UnicodeDecodeError: |
|
_LOGGER.exception('Invalid encoding on %s', b) |
|
return b.decode('latin1') |
|
|
|
|
|
def _transform(message, transformer, exception_message): |
|
if transformer is None: |
|
return message |
|
else: |
|
try: |
|
return transformer(message) |
|
except Exception: # pylint: disable=broad-except |
|
_LOGGER.exception(exception_message) |
|
return None |
|
|
|
|
|
def serialize(message, serializer): |
|
return _transform(message, serializer, 'Exception serializing message!') |
|
|
|
|
|
def deserialize(serialized_message, deserializer): |
|
return _transform(serialized_message, deserializer, |
|
'Exception deserializing message!') |
|
|
|
|
|
def fully_qualified_method(group, method): |
|
return '/{}/{}'.format(group, method)
|
|
|