xref: /aosp_15_r20/external/grpc-grpc/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
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.file_by_filename)
36            elif request.HasField("file_containing_symbol"):
37                yield self._file_containing_symbol(
38                    request.file_containing_symbol
39                )
40            elif request.HasField("file_containing_extension"):
41                yield self._file_containing_extension(
42                    request.file_containing_extension.containing_type,
43                    request.file_containing_extension.extension_number,
44                )
45            elif request.HasField("all_extension_numbers_of_type"):
46                yield self._all_extension_numbers_of_type(
47                    request.all_extension_numbers_of_type
48                )
49            elif request.HasField("list_services"):
50                yield self._list_services()
51            else:
52                yield _reflection_pb2.ServerReflectionResponse(
53                    error_response=_reflection_pb2.ErrorResponse(
54                        error_code=grpc.StatusCode.INVALID_ARGUMENT.value[0],
55                        error_message=grpc.StatusCode.INVALID_ARGUMENT.value[
56                            1
57                        ].encode(),
58                    )
59                )
60
61
62_enable_server_reflection_doc = """Enables server reflection on a server.
63
64Args:
65    service_names: Iterable of fully-qualified service names available.
66    server: grpc.Server to which reflection service will be added.
67    pool: DescriptorPool object to use (descriptor_pool.Default() if None).
68"""
69
70if sys.version_info[0] >= 3 and sys.version_info[1] >= 6:
71    # Exposes AsyncReflectionServicer as public API.
72    # pylint: disable=ungrouped-imports
73    from grpc.experimental import aio as grpc_aio
74
75    # pylint: enable=ungrouped-imports
76    from . import _async as aio
77
78    def enable_server_reflection(service_names, server, pool=None):
79        if isinstance(server, grpc_aio.Server):
80            _reflection_pb2_grpc.add_ServerReflectionServicer_to_server(
81                aio.ReflectionServicer(service_names, pool=pool), server
82            )
83        else:
84            _reflection_pb2_grpc.add_ServerReflectionServicer_to_server(
85                ReflectionServicer(service_names, pool=pool), server
86            )
87
88    enable_server_reflection.__doc__ = _enable_server_reflection_doc
89
90    __all__ = [
91        "SERVICE_NAME",
92        "ReflectionServicer",
93        "enable_server_reflection",
94        "aio",
95    ]
96else:
97
98    def enable_server_reflection(service_names, server, pool=None):
99        _reflection_pb2_grpc.add_ServerReflectionServicer_to_server(
100            ReflectionServicer(service_names, pool=pool), server
101        )
102
103    enable_server_reflection.__doc__ = _enable_server_reflection_doc
104
105    __all__ = [
106        "SERVICE_NAME",
107        "ReflectionServicer",
108        "enable_server_reflection",
109    ]
110