• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2016 gRPC authors.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#     http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14"""Reference implementation for reflection in gRPC Python."""
15
16import sys
17
18import grpc
19from grpc_reflection.v1alpha import reflection_pb2 as _reflection_pb2
20from grpc_reflection.v1alpha import reflection_pb2_grpc as _reflection_pb2_grpc
21from grpc_reflection.v1alpha._base import BaseReflectionServicer
22
23SERVICE_NAME = _reflection_pb2.DESCRIPTOR.services_by_name[
24    "ServerReflection"
25].full_name
26
27
28class ReflectionServicer(BaseReflectionServicer):
29    """Servicer handling RPCs for service statuses."""
30
31    def ServerReflectionInfo(self, request_iterator, context):
32        # pylint: disable=unused-argument
33        for request in request_iterator:
34            if request.HasField("file_by_filename"):
35                yield self._file_by_filename(request, request.file_by_filename)
36            elif request.HasField("file_containing_symbol"):
37                yield self._file_containing_symbol(
38                    request, request.file_containing_symbol
39                )
40            elif request.HasField("file_containing_extension"):
41                yield self._file_containing_extension(
42                    request,
43                    request.file_containing_extension.containing_type,
44                    request.file_containing_extension.extension_number,
45                )
46            elif request.HasField("all_extension_numbers_of_type"):
47                yield self._all_extension_numbers_of_type(
48                    request, request.all_extension_numbers_of_type
49                )
50            elif request.HasField("list_services"):
51                yield self._list_services(request)
52            else:
53                yield _reflection_pb2.ServerReflectionResponse(
54                    error_response=_reflection_pb2.ErrorResponse(
55                        error_code=grpc.StatusCode.INVALID_ARGUMENT.value[0],
56                        error_message=grpc.StatusCode.INVALID_ARGUMENT.value[
57                            1
58                        ].encode(),
59                    ),
60                    original_request=request,
61                )
62
63
64_enable_server_reflection_doc = """Enables server reflection on a server.
65
66Args:
67    service_names: Iterable of fully-qualified service names available.
68    server: grpc.Server to which reflection service will be added.
69    pool: DescriptorPool object to use (descriptor_pool.Default() if None).
70"""
71
72if sys.version_info[0] >= 3 and sys.version_info[1] >= 6:
73    # Exposes AsyncReflectionServicer as public API.
74    # pylint: disable=ungrouped-imports
75    from grpc.experimental import aio as grpc_aio
76
77    # pylint: enable=ungrouped-imports
78    from . import _async as aio
79
80    def enable_server_reflection(service_names, server, pool=None):
81        if isinstance(server, grpc_aio.Server):
82            _reflection_pb2_grpc.add_ServerReflectionServicer_to_server(
83                aio.ReflectionServicer(service_names, pool=pool), server
84            )
85        else:
86            _reflection_pb2_grpc.add_ServerReflectionServicer_to_server(
87                ReflectionServicer(service_names, pool=pool), server
88            )
89
90    enable_server_reflection.__doc__ = _enable_server_reflection_doc
91
92    __all__ = [
93        "SERVICE_NAME",
94        "ReflectionServicer",
95        "enable_server_reflection",
96        "aio",
97    ]
98else:
99
100    def enable_server_reflection(service_names, server, pool=None):
101        _reflection_pb2_grpc.add_ServerReflectionServicer_to_server(
102            ReflectionServicer(service_names, pool=pool), server
103        )
104
105    enable_server_reflection.__doc__ = _enable_server_reflection_doc
106
107    __all__ = [
108        "SERVICE_NAME",
109        "ReflectionServicer",
110        "enable_server_reflection",
111    ]
112