proto_server_reflection.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2016 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 
20 
21 #include <unordered_set>
22 #include <vector>
23 
24 #include <grpcpp/grpcpp.h>
26 
27 // IWYU pragma: no_include <google/protobuf/descriptor.h>
28 
29 using grpc::Status;
30 using grpc::StatusCode;
31 using grpc::reflection::v1alpha::ErrorResponse;
32 using grpc::reflection::v1alpha::ExtensionNumberResponse;
33 using grpc::reflection::v1alpha::ExtensionRequest;
34 using grpc::reflection::v1alpha::ListServiceResponse;
35 using grpc::reflection::v1alpha::ServerReflectionRequest;
36 using grpc::reflection::v1alpha::ServerReflectionResponse;
37 using grpc::reflection::v1alpha::ServiceResponse;
38 
39 namespace grpc {
40 
42  : descriptor_pool_(protobuf::DescriptorPool::generated_pool()) {}
43 
45  const std::vector<std::string>* services) {
47 }
48 
52  stream) {
53  ServerReflectionRequest request;
54  ServerReflectionResponse response;
55  Status status;
56  while (stream->Read(&request)) {
57  switch (request.message_request_case()) {
58  case ServerReflectionRequest::MessageRequestCase::kFileByFilename:
59  status = GetFileByName(context, request.file_by_filename(), &response);
60  break;
61  case ServerReflectionRequest::MessageRequestCase::kFileContainingSymbol:
63  context, request.file_containing_symbol(), &response);
64  break;
65  case ServerReflectionRequest::MessageRequestCase::
66  kFileContainingExtension:
68  context, &request.file_containing_extension(), &response);
69  break;
70  case ServerReflectionRequest::MessageRequestCase::
71  kAllExtensionNumbersOfType:
73  context, request.all_extension_numbers_of_type(),
74  response.mutable_all_extension_numbers_response());
75  break;
76  case ServerReflectionRequest::MessageRequestCase::kListServices:
77  status =
78  ListService(context, response.mutable_list_services_response());
79  break;
80  default:
82  }
83 
84  if (!status.ok()) {
85  FillErrorResponse(status, response.mutable_error_response());
86  }
87  response.set_valid_host(request.host());
88  response.set_allocated_original_request(
89  new ServerReflectionRequest(request));
90  stream->Write(response);
91  }
92 
93  return Status::OK;
94 }
95 
97  ErrorResponse* error_response) {
98  error_response->set_error_code(status.error_code());
99  error_response->set_error_message(status.error_message());
100 }
101 
103  ListServiceResponse* response) {
104  if (services_ == nullptr) {
105  return Status(StatusCode::NOT_FOUND, "Services not found.");
106  }
107  for (const auto& value : *services_) {
108  ServiceResponse* service_response = response->add_service();
109  service_response->set_name(value);
110  }
111  return Status::OK;
112 }
113 
115  ServerContext* /*context*/, const std::string& file_name,
116  ServerReflectionResponse* response) {
117  if (descriptor_pool_ == nullptr) {
118  return Status::CANCELLED;
119  }
120 
121  const protobuf::FileDescriptor* file_desc =
122  descriptor_pool_->FindFileByName(file_name);
123  if (file_desc == nullptr) {
124  return Status(StatusCode::NOT_FOUND, "File not found.");
125  }
126  std::unordered_set<std::string> seen_files;
127  FillFileDescriptorResponse(file_desc, response, &seen_files);
128  return Status::OK;
129 }
130 
132  ServerContext* /*context*/, const std::string& symbol,
133  ServerReflectionResponse* response) {
134  if (descriptor_pool_ == nullptr) {
135  return Status::CANCELLED;
136  }
137 
138  const protobuf::FileDescriptor* file_desc =
140  if (file_desc == nullptr) {
141  return Status(StatusCode::NOT_FOUND, "Symbol not found.");
142  }
143  std::unordered_set<std::string> seen_files;
144  FillFileDescriptorResponse(file_desc, response, &seen_files);
145  return Status::OK;
146 }
147 
149  ServerContext* /*context*/, const ExtensionRequest* request,
150  ServerReflectionResponse* response) {
151  if (descriptor_pool_ == nullptr) {
152  return Status::CANCELLED;
153  }
154 
155  const protobuf::Descriptor* desc =
156  descriptor_pool_->FindMessageTypeByName(request->containing_type());
157  if (desc == nullptr) {
158  return Status(StatusCode::NOT_FOUND, "Type not found.");
159  }
160 
161  const protobuf::FieldDescriptor* field_desc =
163  request->extension_number());
164  if (field_desc == nullptr) {
165  return Status(StatusCode::NOT_FOUND, "Extension not found.");
166  }
167  std::unordered_set<std::string> seen_files;
168  FillFileDescriptorResponse(field_desc->file(), response, &seen_files);
169  return Status::OK;
170 }
171 
173  ServerContext* /*context*/, const std::string& type,
174  ExtensionNumberResponse* response) {
175  if (descriptor_pool_ == nullptr) {
176  return Status::CANCELLED;
177  }
178 
179  const protobuf::Descriptor* desc =
181  if (desc == nullptr) {
182  return Status(StatusCode::NOT_FOUND, "Type not found.");
183  }
184 
185  std::vector<const protobuf::FieldDescriptor*> extensions;
187  for (const auto& value : extensions) {
188  response->add_extension_number(value->number());
189  }
190  response->set_base_type_name(type);
191  return Status::OK;
192 }
193 
195  const protobuf::FileDescriptor* file_desc,
196  ServerReflectionResponse* response,
197  std::unordered_set<std::string>* seen_files) {
198  if (seen_files->find(file_desc->name()) != seen_files->end()) {
199  return;
200  }
201  seen_files->insert(file_desc->name());
202 
203  protobuf::FileDescriptorProto file_desc_proto;
205  file_desc->CopyTo(&file_desc_proto);
206  file_desc_proto.SerializeToString(&data);
207  response->mutable_file_descriptor_response()->add_file_descriptor_proto(data);
208 
209  for (int i = 0; i < file_desc->dependency_count(); ++i) {
210  FillFileDescriptorResponse(file_desc->dependency(i), response, seen_files);
211  }
212 }
213 
214 } // namespace grpc
grpc::ProtoServerReflection::GetFileContainingExtension
Status GetFileContainingExtension(ServerContext *context, const reflection::v1alpha::ExtensionRequest *request, reflection::v1alpha::ServerReflectionResponse *response)
Definition: proto_server_reflection.cc:148
google::protobuf::DescriptorPool::FindFileByName
const FileDescriptor * FindFileByName(const std::string &name) const
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor.cc:1369
grpc::ProtoServerReflection::SetServiceList
void SetServiceList(const std::vector< std::string > *services)
Definition: proto_server_reflection.cc:44
grpc::status
auto status
Definition: cpp/client/credentials_test.cc:200
grpc::ServerContext
Definition: grpcpp/impl/codegen/server_context.h:566
google::protobuf::FieldDescriptor
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor.h:515
interceptor.h
grpc::Status::CANCELLED
static const Status & CANCELLED
A CANCELLED pre-defined instance.
Definition: include/grpcpp/impl/codegen/status.h:115
grpc
Definition: grpcpp/alarm.h:33
benchmark.request
request
Definition: benchmark.py:77
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
google::protobuf
Definition: bloaty/third_party/protobuf/benchmarks/util/data_proto2_to_proto3_util.h:12
grpc::ServerReaderWriter
Definition: grpcpp/impl/codegen/sync_stream.h:786
google::protobuf::DescriptorPool::FindFileContainingSymbol
const FileDescriptor * FindFileContainingSymbol(const std::string &symbol_name) const
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor.cc:1389
google::protobuf::FieldDescriptor::file
const FileDescriptor * file() const
grpc.StatusCode.NOT_FOUND
tuple NOT_FOUND
Definition: src/python/grpcio/grpc/__init__.py:266
grpc::ProtoServerReflection::FillErrorResponse
void FillErrorResponse(const Status &status, reflection::v1alpha::ErrorResponse *error_response)
Definition: proto_server_reflection.cc:96
grpcpp.h
generated_pool
InternalDescriptorPool * generated_pool
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/def.c:582
grpc::Status::OK
static const Status & OK
An OK pre-defined instance.
Definition: include/grpcpp/impl/codegen/status.h:113
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
conf.extensions
list extensions
Definition: doc/python/sphinx/conf.py:54
grpc::StatusCode
StatusCode
Definition: grpcpp/impl/codegen/status_code_enum.h:26
grpc::ProtoServerReflection::services_
const std::vector< string > * services_
Definition: proto_server_reflection.h:82
grpc.StatusCode.UNIMPLEMENTED
tuple UNIMPLEMENTED
Definition: src/python/grpcio/grpc/__init__.py:276
google::protobuf::FileDescriptor::CopyTo
void CopyTo(FileDescriptorProto *proto) const
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor.cc:1990
value
const char * value
Definition: hpack_parser_table.cc:165
greeter_client.services
services
Definition: no_codegen/greeter_client.py:34
grpc::ProtoServerReflection::ServerReflectionInfo
Status ServerReflectionInfo(ServerContext *context, ServerReaderWriter< reflection::v1alpha::ServerReflectionResponse, reflection::v1alpha::ServerReflectionRequest > *stream) override
Definition: proto_server_reflection.cc:49
google::protobuf::FileDescriptor::name
const std::string & name() const
google::protobuf::DescriptorPool::FindExtensionByNumber
const FieldDescriptor * FindExtensionByNumber(const Descriptor *extendee, int number) const
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor.cc:1468
grpc::ProtoServerReflection::GetFileContainingSymbol
Status GetFileContainingSymbol(ServerContext *context, const std::string &symbol, reflection::v1alpha::ServerReflectionResponse *response)
Definition: proto_server_reflection.cc:131
grpc::ProtoServerReflection::descriptor_pool_
const protobuf::DescriptorPool * descriptor_pool_
Definition: proto_server_reflection.h:81
google::protobuf::FileDescriptor::dependency
const FileDescriptor * dependency(int index) const
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor.cc:7235
grpc::ProtoServerReflection::ProtoServerReflection
ProtoServerReflection()
Definition: proto_server_reflection.cc:41
asyncio_get_stats.response
response
Definition: asyncio_get_stats.py:28
grpc::protobuf::util::Status
GRPC_CUSTOM_UTIL_STATUS Status
Definition: include/grpcpp/impl/codegen/config_protobuf.h:93
grpc::Status
Definition: include/grpcpp/impl/codegen/status.h:35
google::protobuf::Descriptor
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor.h:231
desc
#define desc
Definition: bloaty/third_party/protobuf/src/google/protobuf/extension_set.h:338
google::protobuf::FileDescriptor
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor.h:1320
google::protobuf::DescriptorPool::FindAllExtensions
void FindAllExtensions(const Descriptor *extendee, std::vector< const FieldDescriptor * > *out) const
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor.cc:1529
grpc::protobuf::FileDescriptorProto
GRPC_CUSTOM_FILEDESCRIPTORPROTO FileDescriptorProto
Definition: include/grpcpp/impl/codegen/config_protobuf.h:86
context
grpc::ClientContext context
Definition: istio_echo_server_lib.cc:61
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
grpc::ProtoServerReflection::GetAllExtensionNumbers
Status GetAllExtensionNumbers(ServerContext *context, const std::string &type, reflection::v1alpha::ExtensionNumberResponse *response)
Definition: proto_server_reflection.cc:172
grpc::ProtoServerReflection::FillFileDescriptorResponse
void FillFileDescriptorResponse(const protobuf::FileDescriptor *file_desc, reflection::v1alpha::ServerReflectionResponse *response, std::unordered_set< std::string > *seen_files)
Definition: proto_server_reflection.cc:194
DescriptorPool
Definition: bloaty/third_party/protobuf/ruby/ext/google/protobuf_c/protobuf.h:110
proto_server_reflection.h
grpc::ProtoServerReflection::GetFileByName
Status GetFileByName(ServerContext *context, const std::string &file_name, reflection::v1alpha::ServerReflectionResponse *response)
Definition: proto_server_reflection.cc:114
grpc::ProtoServerReflection::ListService
Status ListService(ServerContext *context, reflection::v1alpha::ListServiceResponse *response)
Definition: proto_server_reflection.cc:102
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
google::protobuf::FileDescriptor::dependency_count
int dependency_count() const
google::protobuf::DescriptorPool::FindMessageTypeByName
const Descriptor * FindMessageTypeByName(const std::string &name) const
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor.cc:1410
stream
voidpf stream
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:00:56