Add transitive dependencies in FileDescriptorResponse

pull/6729/head
Yuchen Zeng 9 years ago
parent 91c51a7aba
commit 46bf1467c5
  1. 24
      extensions/reflection/proto_server_reflection.cc
  2. 6
      extensions/reflection/proto_server_reflection.h

@ -34,6 +34,7 @@
#include <iostream>
#include <memory>
#include <string>
#include <unordered_set>
#include <vector>
#include <google/protobuf/descriptor.h>
@ -146,7 +147,8 @@ Status ProtoServerReflection::GetFileByName(
if (file_desc == nullptr) {
return Status(StatusCode::NOT_FOUND, "File not found.");
}
FillFileDescriptorProtoResponse(file_desc, response);
std::unordered_set<grpc::string> seen_files;
FillFileDescriptorResponse(file_desc, response, &seen_files);
return Status::OK;
}
@ -162,7 +164,8 @@ Status ProtoServerReflection::GetFileContainingSymbol(
if (file_desc == nullptr) {
return Status(StatusCode::NOT_FOUND, "Symbol not found.");
}
FillFileDescriptorProtoResponse(file_desc, response);
std::unordered_set<grpc::string> seen_files;
FillFileDescriptorResponse(file_desc, response, &seen_files);
return Status::OK;
}
@ -184,7 +187,8 @@ Status ProtoServerReflection::GetFileContainingExtension(
if (field_desc == nullptr) {
return Status(StatusCode::NOT_FOUND, "Extension not found.");
}
FillFileDescriptorProtoResponse(field_desc->file(), response);
std::unordered_set<grpc::string> seen_files;
FillFileDescriptorResponse(field_desc->file(), response, &seen_files);
return Status::OK;
}
@ -209,13 +213,23 @@ Status ProtoServerReflection::GetAllExtensionNumbers(
return Status::OK;
}
void ProtoServerReflection::FillFileDescriptorProtoResponse(
const FileDescriptor* file_desc, ServerReflectionResponse* response) {
void ProtoServerReflection::FillFileDescriptorResponse(
const FileDescriptor* file_desc, ServerReflectionResponse* response,
std::unordered_set<grpc::string>* seen_files) {
if (seen_files->find(file_desc->name()) != seen_files->end()) {
return;
}
seen_files->insert(file_desc->name());
FileDescriptorProto file_desc_proto;
grpc::string data;
file_desc->CopyTo(&file_desc_proto);
file_desc_proto.SerializeToString(&data);
response->mutable_file_descriptor_response()->add_file_descriptor_proto(data);
for (int i = 0; i < file_desc->dependency_count(); ++i) {
FillFileDescriptorResponse(file_desc->dependency(i), response, seen_files);
}
}
} // namespace grpc

@ -37,6 +37,7 @@
#include <iostream>
#include <memory>
#include <string>
#include <unordered_set>
#include <vector>
#include <google/protobuf/descriptor.h>
@ -81,9 +82,10 @@ class ProtoServerReflection GRPC_FINAL
ServerContext* context, const grpc::string& type,
reflection::v1alpha::ExtensionNumberResponse* response);
void FillFileDescriptorProtoResponse(
void FillFileDescriptorResponse(
const google::protobuf::FileDescriptor* file_desc,
reflection::v1alpha::ServerReflectionResponse* response);
reflection::v1alpha::ServerReflectionResponse* response,
std::unordered_set<grpc::string>* seen_files);
void FillErrorResponse(const Status& status,
reflection::v1alpha::ErrorResponse* error_response);

Loading…
Cancel
Save