1 //
2 //
3 // Copyright 2015 gRPC authors.
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 //
18 
19 #ifndef GRPC_SRC_CPP_EXT_PROTO_SERVER_REFLECTION_H
20 #define GRPC_SRC_CPP_EXT_PROTO_SERVER_REFLECTION_H
21 
22 #include <string>
23 #include <unordered_set>
24 #include <vector>
25 
26 #include <grpcpp/grpcpp.h>
27 #include <grpcpp/impl/codegen/config_protobuf.h>
28 #include <grpcpp/support/config.h>
29 #include <grpcpp/support/status.h>
30 #include <grpcpp/support/sync_stream.h>
31 
32 #include "src/proto/grpc/reflection/v1alpha/reflection.grpc.pb.h"
33 #include "src/proto/grpc/reflection/v1alpha/reflection.pb.h"
34 
35 namespace grpc {
36 
37 class ProtoServerReflection final
38     : public reflection::v1alpha::ServerReflection::Service {
39  public:
40   ProtoServerReflection();
41 
42   // Add the full names of registered services
43   void SetServiceList(const std::vector<std::string>* services);
44 
45   // implementation of ServerReflectionInfo(stream ServerReflectionRequest) rpc
46   // in ServerReflection service
47   Status ServerReflectionInfo(
48       ServerContext* context,
49       ServerReaderWriter<reflection::v1alpha::ServerReflectionResponse,
50                          reflection::v1alpha::ServerReflectionRequest>* stream)
51       override;
52 
53  private:
54   Status ListService(ServerContext* context,
55                      reflection::v1alpha::ListServiceResponse* response);
56 
57   Status GetFileByName(ServerContext* context, const std::string& file_name,
58                        reflection::v1alpha::ServerReflectionResponse* response);
59 
60   Status GetFileContainingSymbol(
61       ServerContext* context, const std::string& symbol,
62       reflection::v1alpha::ServerReflectionResponse* response);
63 
64   Status GetFileContainingExtension(
65       ServerContext* context,
66       const reflection::v1alpha::ExtensionRequest* request,
67       reflection::v1alpha::ServerReflectionResponse* response);
68 
69   Status GetAllExtensionNumbers(
70       ServerContext* context, const std::string& type,
71       reflection::v1alpha::ExtensionNumberResponse* response);
72 
73   void FillFileDescriptorResponse(
74       const protobuf::FileDescriptor* file_desc,
75       reflection::v1alpha::ServerReflectionResponse* response,
76       std::unordered_set<std::string>* seen_files);
77 
78   void FillErrorResponse(const Status& status,
79                          reflection::v1alpha::ErrorResponse* error_response);
80 
81   const protobuf::DescriptorPool* descriptor_pool_;
82   const std::vector<string>* services_;
83 };
84 
85 }  // namespace grpc
86 
87 #endif  // GRPC_SRC_CPP_EXT_PROTO_SERVER_REFLECTION_H
88