proto_reflection_descriptor_database.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 <vector>
22 
23 #include <grpc/support/log.h>
24 
25 using grpc::reflection::v1alpha::ErrorResponse;
26 using grpc::reflection::v1alpha::ListServiceResponse;
27 using grpc::reflection::v1alpha::ServerReflection;
28 using grpc::reflection::v1alpha::ServerReflectionRequest;
29 using grpc::reflection::v1alpha::ServerReflectionResponse;
30 
31 namespace grpc {
32 
34  std::unique_ptr<ServerReflection::Stub> stub)
35  : stub_(std::move(stub)) {}
36 
38  const std::shared_ptr<grpc::Channel>& channel)
39  : stub_(ServerReflection::NewStub(channel)) {}
40 
42  if (stream_) {
43  stream_->WritesDone();
44  Status status = stream_->Finish();
45  if (!status.ok()) {
46  if (status.error_code() == StatusCode::UNIMPLEMENTED) {
47  fprintf(stderr,
48  "Reflection request not implemented; "
49  "is the ServerReflection service enabled?\n");
50  } else {
51  fprintf(stderr,
52  "ServerReflectionInfo rpc failed. Error code: %d, message: %s, "
53  "debug info: %s\n",
54  static_cast<int>(status.error_code()),
55  status.error_message().c_str(),
56  ctx_.debug_error_string().c_str());
57  }
58  }
59  }
60 }
61 
65  return true;
66  }
67 
68  if (known_files_.find(filename) != known_files_.end()) {
69  return false;
70  }
71 
72  ServerReflectionRequest request;
73  request.set_file_by_filename(filename);
74  ServerReflectionResponse response;
75 
76  if (!DoOneRequest(request, response)) {
77  return false;
78  }
79 
80  if (response.message_response_case() ==
81  ServerReflectionResponse::MessageResponseCase::kFileDescriptorResponse) {
82  AddFileFromResponse(response.file_descriptor_response());
83  } else if (response.message_response_case() ==
84  ServerReflectionResponse::MessageResponseCase::kErrorResponse) {
85  const ErrorResponse& error = response.error_response();
86  if (error.error_code() == StatusCode::NOT_FOUND) {
87  gpr_log(GPR_INFO, "NOT_FOUND from server for FindFileByName(%s)",
88  filename.c_str());
89  } else {
91  "Error on FindFileByName(%s)\n\tError code: %d\n"
92  "\tError Message: %s",
93  filename.c_str(), error.error_code(),
94  error.error_message().c_str());
95  }
96  } else {
97  gpr_log(
98  GPR_INFO,
99  "Error on FindFileByName(%s) response type\n"
100  "\tExpecting: %d\n\tReceived: %d",
101  filename.c_str(),
102  ServerReflectionResponse::MessageResponseCase::kFileDescriptorResponse,
103  response.message_response_case());
104  }
105 
107 }
108 
110  const string& symbol_name, protobuf::FileDescriptorProto* output) {
111  if (cached_db_.FindFileContainingSymbol(symbol_name, output)) {
112  return true;
113  }
114 
115  if (missing_symbols_.find(symbol_name) != missing_symbols_.end()) {
116  return false;
117  }
118 
119  ServerReflectionRequest request;
120  request.set_file_containing_symbol(symbol_name);
121  ServerReflectionResponse response;
122 
123  if (!DoOneRequest(request, response)) {
124  return false;
125  }
126 
127  if (response.message_response_case() ==
128  ServerReflectionResponse::MessageResponseCase::kFileDescriptorResponse) {
129  AddFileFromResponse(response.file_descriptor_response());
130  } else if (response.message_response_case() ==
131  ServerReflectionResponse::MessageResponseCase::kErrorResponse) {
132  const ErrorResponse& error = response.error_response();
133  if (error.error_code() == StatusCode::NOT_FOUND) {
134  missing_symbols_.insert(symbol_name);
136  "NOT_FOUND from server for FindFileContainingSymbol(%s)",
137  symbol_name.c_str());
138  } else {
140  "Error on FindFileContainingSymbol(%s)\n"
141  "\tError code: %d\n\tError Message: %s",
142  symbol_name.c_str(), error.error_code(),
143  error.error_message().c_str());
144  }
145  } else {
146  gpr_log(
147  GPR_INFO,
148  "Error on FindFileContainingSymbol(%s) response type\n"
149  "\tExpecting: %d\n\tReceived: %d",
150  symbol_name.c_str(),
151  ServerReflectionResponse::MessageResponseCase::kFileDescriptorResponse,
152  response.message_response_case());
153  }
154  return cached_db_.FindFileContainingSymbol(symbol_name, output);
155 }
156 
158  const string& containing_type, int field_number,
161  output)) {
162  return true;
163  }
164 
166  missing_extensions_[containing_type].find(field_number) !=
168  gpr_log(GPR_INFO, "nested map.");
169  return false;
170  }
171 
172  ServerReflectionRequest request;
173  request.mutable_file_containing_extension()->set_containing_type(
175  request.mutable_file_containing_extension()->set_extension_number(
176  field_number);
177  ServerReflectionResponse response;
178 
179  if (!DoOneRequest(request, response)) {
180  return false;
181  }
182 
183  if (response.message_response_case() ==
184  ServerReflectionResponse::MessageResponseCase::kFileDescriptorResponse) {
185  AddFileFromResponse(response.file_descriptor_response());
186  } else if (response.message_response_case() ==
187  ServerReflectionResponse::MessageResponseCase::kErrorResponse) {
188  const ErrorResponse& error = response.error_response();
189  if (error.error_code() == StatusCode::NOT_FOUND) {
191  missing_extensions_.end()) {
193  }
194  missing_extensions_[containing_type].insert(field_number);
196  "NOT_FOUND from server for FindFileContainingExtension(%s, %d)",
197  containing_type.c_str(), field_number);
198  } else {
200  "Error on FindFileContainingExtension(%s, %d)\n"
201  "\tError code: %d\n\tError Message: %s",
202  containing_type.c_str(), field_number, error.error_code(),
203  error.error_message().c_str());
204  }
205  } else {
206  gpr_log(
207  GPR_INFO,
208  "Error on FindFileContainingExtension(%s, %d) response type\n"
209  "\tExpecting: %d\n\tReceived: %d",
210  containing_type.c_str(), field_number,
211  ServerReflectionResponse::MessageResponseCase::kFileDescriptorResponse,
212  response.message_response_case());
213  }
214 
216  output);
217 }
218 
220  const string& extendee_type, std::vector<int>* output) {
221  if (cached_extension_numbers_.find(extendee_type) !=
223  *output = cached_extension_numbers_[extendee_type];
224  return true;
225  }
226 
227  ServerReflectionRequest request;
228  request.set_all_extension_numbers_of_type(extendee_type);
229  ServerReflectionResponse response;
230 
231  if (!DoOneRequest(request, response)) {
232  return false;
233  }
234 
235  if (response.message_response_case() ==
236  ServerReflectionResponse::MessageResponseCase::
237  kAllExtensionNumbersResponse) {
238  auto number = response.all_extension_numbers_response().extension_number();
239  *output = std::vector<int>(number.begin(), number.end());
240  cached_extension_numbers_[extendee_type] = *output;
241  return true;
242  } else if (response.message_response_case() ==
243  ServerReflectionResponse::MessageResponseCase::kErrorResponse) {
244  const ErrorResponse& error = response.error_response();
245  if (error.error_code() == StatusCode::NOT_FOUND) {
246  gpr_log(GPR_INFO, "NOT_FOUND from server for FindAllExtensionNumbers(%s)",
247  extendee_type.c_str());
248  } else {
250  "Error on FindAllExtensionNumbersExtension(%s)\n"
251  "\tError code: %d\n\tError Message: %s",
252  extendee_type.c_str(), error.error_code(),
253  error.error_message().c_str());
254  }
255  }
256  return false;
257 }
258 
260  std::vector<std::string>* output) {
261  ServerReflectionRequest request;
262  request.set_list_services("");
263  ServerReflectionResponse response;
264 
265  if (!DoOneRequest(request, response)) {
266  return false;
267  }
268 
269  if (response.message_response_case() ==
270  ServerReflectionResponse::MessageResponseCase::kListServicesResponse) {
271  const ListServiceResponse& ls_response = response.list_services_response();
272  for (int i = 0; i < ls_response.service_size(); ++i) {
273  (*output).push_back(ls_response.service(i).name());
274  }
275  return true;
276  } else if (response.message_response_case() ==
277  ServerReflectionResponse::MessageResponseCase::kErrorResponse) {
278  const ErrorResponse& error = response.error_response();
280  "Error on GetServices()\n\tError code: %d\n"
281  "\tError Message: %s",
282  error.error_code(), error.error_message().c_str());
283  } else {
284  gpr_log(
285  GPR_INFO,
286  "Error on GetServices() response type\n\tExpecting: %d\n\tReceived: %d",
287  ServerReflectionResponse::MessageResponseCase::kListServicesResponse,
288  response.message_response_case());
289  }
290  return false;
291 }
292 
295  const std::string& byte_fd_proto) {
296  protobuf::FileDescriptorProto file_desc_proto;
297  file_desc_proto.ParseFromString(byte_fd_proto);
298  return file_desc_proto;
299 }
300 
302  const grpc::reflection::v1alpha::FileDescriptorResponse& response) {
303  for (int i = 0; i < response.file_descriptor_proto_size(); ++i) {
304  const protobuf::FileDescriptorProto file_proto =
305  ParseFileDescriptorProtoResponse(response.file_descriptor_proto(i));
306  if (known_files_.find(file_proto.name()) == known_files_.end()) {
307  known_files_.insert(file_proto.name());
308  cached_db_.Add(file_proto);
309  }
310  }
311 }
312 
313 std::shared_ptr<ProtoReflectionDescriptorDatabase::ClientStream>
315  if (!stream_) {
316  stream_ = stub_->ServerReflectionInfo(&ctx_);
317  }
318  return stream_;
319 }
320 
322  const ServerReflectionRequest& request,
323  ServerReflectionResponse& response) {
324  bool success = false;
325  stream_mutex_.lock();
326  if (GetStream()->Write(request) && GetStream()->Read(&response)) {
327  success = true;
328  }
329  stream_mutex_.unlock();
330  return success;
331 }
332 
333 } // namespace grpc
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
grpc::status
auto status
Definition: cpp/client/credentials_test.cc:200
filename
const char * filename
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:135
log.h
stub_
std::unique_ptr< grpc::testing::EchoTestService::Stub > stub_
Definition: client_channel_stress_test.cc:331
grpc::ProtoReflectionDescriptorDatabase::FindFileContainingExtension
bool FindFileContainingExtension(const string &containing_type, int field_number, protobuf::FileDescriptorProto *output) override
Definition: proto_reflection_descriptor_database.cc:157
grpc::ProtoReflectionDescriptorDatabase::stub_
std::unique_ptr< grpc::reflection::v1alpha::ServerReflection::Stub > stub_
Definition: proto_reflection_descriptor_database.h:100
grpc
Definition: grpcpp/alarm.h:33
grpc::ProtoReflectionDescriptorDatabase::~ProtoReflectionDescriptorDatabase
~ProtoReflectionDescriptorDatabase() override
Definition: proto_reflection_descriptor_database.cc:41
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
error
grpc_error_handle error
Definition: retry_filter.cc:499
google::protobuf::SimpleDescriptorDatabase::FindFileContainingExtension
bool FindFileContainingExtension(const std::string &containing_type, int field_number, FileDescriptorProto *output) override
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor_database.cc:354
grpc::ProtoReflectionDescriptorDatabase::ProtoReflectionDescriptorDatabase
ProtoReflectionDescriptorDatabase(std::unique_ptr< reflection::v1alpha::ServerReflection::Stub > stub)
async_greeter_client.stub
stub
Definition: hellostreamingworld/async_greeter_client.py:26
proto_reflection_descriptor_database.h
python_utils.port_server.stderr
stderr
Definition: port_server.py:51
grpc::ProtoReflectionDescriptorDatabase::stream_mutex_
std::mutex stream_mutex_
Definition: proto_reflection_descriptor_database.h:105
grpc::ProtoReflectionDescriptorDatabase::DoOneRequest
bool DoOneRequest(const grpc::reflection::v1alpha::ServerReflectionRequest &request, grpc::reflection::v1alpha::ServerReflectionResponse &response)
Definition: proto_reflection_descriptor_database.cc:321
channel
wrapped_grpc_channel * channel
Definition: src/php/ext/grpc/call.h:33
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
testing::internal::posix::Read
int Read(int fd, void *buf, unsigned int count)
Definition: bloaty/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:2044
grpc::ProtoReflectionDescriptorDatabase::missing_extensions_
std::unordered_map< string, std::unordered_set< int > > missing_extensions_
Definition: proto_reflection_descriptor_database.h:103
gmock_output_test.output
output
Definition: bloaty/third_party/googletest/googlemock/test/gmock_output_test.py:175
grpc::ProtoReflectionDescriptorDatabase::stream_
std::shared_ptr< ClientStream > stream_
Definition: proto_reflection_descriptor_database.h:98
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc.StatusCode.NOT_FOUND
tuple NOT_FOUND
Definition: src/python/grpcio/grpc/__init__.py:266
grpc::ProtoReflectionDescriptorDatabase::FindFileContainingSymbol
bool FindFileContainingSymbol(const string &symbol_name, protobuf::FileDescriptorProto *output) override
Definition: proto_reflection_descriptor_database.cc:109
google::protobuf::SimpleDescriptorDatabase::FindFileByName
bool FindFileByName(const std::string &filename, FileDescriptorProto *output) override
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor_database.cc:344
number
int32_t number
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:850
phone_pb2.containing_type
containing_type
Definition: phone_pb2.py:199
grpc.StatusCode.UNIMPLEMENTED
tuple UNIMPLEMENTED
Definition: src/python/grpcio/grpc/__init__.py:276
grpc::ProtoReflectionDescriptorDatabase::AddFileFromResponse
void AddFileFromResponse(const grpc::reflection::v1alpha::FileDescriptorResponse &response)
Definition: proto_reflection_descriptor_database.cc:301
testing::internal::posix::Write
int Write(int fd, const void *buf, unsigned int count)
Definition: bloaty/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:2047
google::protobuf::SimpleDescriptorDatabase::FindFileContainingSymbol
bool FindFileContainingSymbol(const std::string &symbol_name, FileDescriptorProto *output) override
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor_database.cc:349
grpc::ProtoReflectionDescriptorDatabase::ctx_
grpc::ClientContext ctx_
Definition: proto_reflection_descriptor_database.h:99
grpc::ProtoReflectionDescriptorDatabase::cached_extension_numbers_
std::unordered_map< string, std::vector< int > > cached_extension_numbers_
Definition: proto_reflection_descriptor_database.h:104
grpc::ProtoReflectionDescriptorDatabase::FindAllExtensionNumbers
bool FindAllExtensionNumbers(const string &extendee_type, std::vector< int > *output) override
Definition: proto_reflection_descriptor_database.cc:219
grpc::ProtoReflectionDescriptorDatabase::GetServices
bool GetServices(std::vector< std::string > *output)
Definition: proto_reflection_descriptor_database.cc:259
asyncio_get_stats.response
response
Definition: asyncio_get_stats.py:28
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
grpc::Status
Definition: include/grpcpp/impl/codegen/status.h:35
grpc::ProtoReflectionDescriptorDatabase::known_files_
std::unordered_set< string > known_files_
Definition: proto_reflection_descriptor_database.h:101
grpc::protobuf::FileDescriptorProto
GRPC_CUSTOM_FILEDESCRIPTORPROTO FileDescriptorProto
Definition: include/grpcpp/impl/codegen/config_protobuf.h:86
grpc::ProtoReflectionDescriptorDatabase::ParseFileDescriptorProtoResponse
protobuf::FileDescriptorProto ParseFileDescriptorProtoResponse(const std::string &byte_fd_proto)
Definition: proto_reflection_descriptor_database.cc:294
grpc::ClientContext::debug_error_string
std::string debug_error_string() const
Definition: grpcpp/impl/codegen/client_context.h:414
grpc::ProtoReflectionDescriptorDatabase::missing_symbols_
std::unordered_set< string > missing_symbols_
Definition: proto_reflection_descriptor_database.h:102
grpc::ProtoReflectionDescriptorDatabase::cached_db_
protobuf::SimpleDescriptorDatabase cached_db_
Definition: proto_reflection_descriptor_database.h:107
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
grpc::ProtoReflectionDescriptorDatabase::GetStream
std::shared_ptr< ClientStream > GetStream()
Definition: proto_reflection_descriptor_database.cc:314
google::protobuf::SimpleDescriptorDatabase::Add
bool Add(const FileDescriptorProto &file)
Definition: bloaty/third_party/protobuf/src/google/protobuf/descriptor_database.cc:333
grpc::ProtoReflectionDescriptorDatabase::FindFileByName
bool FindFileByName(const string &filename, protobuf::FileDescriptorProto *output) override
Definition: proto_reflection_descriptor_database.cc:62


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